package scripting.npc; import client.*; import client.inventory.Equip; import client.inventory.Item; import client.inventory.ItemFlag; import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.MapleRing; import constants.BattleConstants; import constants.BattleConstants.PokedexEntry; import constants.GameConstants; import database.DatabaseConnection; import handling.channel.ChannelServer; import handling.channel.MapleGuildRanking; import handling.channel.handler.PlayersHandler; import handling.login.LoginInformationProvider; import handling.world.WorldBroadcastService; import handling.world.WorldFindService; import handling.world.WorldGuildService; import handling.world.guild.MapleGuild; import handling.world.party.ExpeditionType; import handling.world.party.MapleParty; import handling.world.party.MaplePartyCharacter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.script.Invocable; import org.apache.log4j.Logger; import scripting.AbstractPlayerInteraction; import scripting.ScriptType; import scripting.event.EventInstanceManager; import server.MapleCarnivalChallenge; import server.MapleCarnivalParty; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MapleStatEffect; import server.Randomizer; import server.RankingWorker; import server.SpeedRunner; import server.StructItemOption; import server.Timer.CloneTimer; import server.life.MapleLifeFactory; import server.life.MapleMonsterInformationProvider; import server.life.MonsterDropEntry; import server.life.MonsterGlobalDropEntry; import server.maps.FieldLimitType; import server.maps.MapleMap; import server.quest.MapleQuest; import server.shop.MapleShopFactory; import server.squad.MapleSquad; import tools.FileoutputUtil; import tools.MaplePacketCreator; import tools.StringUtil; import tools.Triple; import tools.packet.GuildPacket; import tools.packet.NPCPacket; import tools.packet.PlayerShopPacket; import tools.packet.UIPacket; public class NPCConversationManager extends AbstractPlayerInteraction { private static final Logger _log = Logger.getLogger(NPCConversationManager.class); private final int npcId; private String getText; private final ScriptType type; private String npcMode = null; public boolean pendingDisposal = false; private final Invocable iv; public NPCConversationManager(MapleClient c, int npc, String npcMode, ScriptType type, Invocable iv) { super(c, npc, npcMode); this.npcId = npc; this.npcMode = npcMode; this.iv = iv; this.type = type; } public ScriptType getType() { return type; } public Invocable getIv() { return this.iv; } public int getNpc() { return this.npcId; } public String getScript() { return npcMode; } public void safeDispose() { this.pendingDisposal = true; } public void dispose() { NPCScriptManager.getInstance().dispose(this); } public void sendSlideMenu(final int type, final String sel) { String[] sels = sel.split("#"); if (sels.length < 3) { return; } c.getSession().write(NPCPacket.sendNPCAskMenu(id,sel)); } public void sendStyle(String text,int styles[]){ if (styles.length <= 0) { return; } c.getSession().write(NPCPacket.sendNPCAskAvatar(id,text,styles)); } public void sendNext(String text) { sendNext(text, this.id); } public void sendNext(String text, int id) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(id, text, false,true)); } public void sendPlayerToNpc(String text) { sendNextS(text, (byte) 3, this.id); } public void sendNextNoESC(String text) { sendNextS(text, (byte) 1, this.id); } public void sendNextNoESC(String text, int id) { sendNextS(text, (byte) 1, id); } public void sendNextS(String text, byte type) { sendNextS(text, type, this.id); } public void sendNextS(String text, byte type, int idd) { if (text.contains("#L")) { sendSimpleS(text, type); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id, text, false,true)); } public void sendPrev(String text) { sendPrev(text, this.id); } public void sendPrev(String text, int id) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(id,text, true,false)); } public void sendPrevS(String text, byte type) { sendPrevS(text, type, this.id); } public void sendPrevS(String text, byte type, int idd) { if (text.contains("#L")) { sendSimpleS(text, type); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id,text, true,false)); } public void sendNextPrev(String text) { sendNextPrev(text, this.id); } public void sendNextPrev(String text, int id) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(id, text, true,true)); } public void PlayerToNpc(String text) { sendNextPrevS(text, (byte) 3); } public void sendNextPrevS(String text) { sendNextPrevS(text, (byte) 3); } public void sendNextPrevS(String text, byte type) { sendNextPrevS(text, type, this.id); } public void sendNextPrevS(String text, byte type, int idd) { if (text.contains("#L")) { sendSimpleS(text, type); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id, text, true,true)); } public void sendNextPrevS(String text, byte type, int idd, int npcid) { if (text.contains("#L")) { // will dc otherwise! sendSimpleS(text, type); return; } c.getSession().write(NPCPacket.sendNPCSay(npcid, text, true,true)); } public void sendOk(String text) { sendOk(text, this.id); } public void sendOk(String text, int id) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(id,text)); } public void sendOkS(String text, byte type) { sendOkS(text, type, this.id); } public void sendOkS(String text, byte type, int idd) { if (text.contains("#L")) { sendSimpleS(text, type); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id, text)); } public void sendYesNo(String text) { sendYesNo(text, this.id); } public void sendYesNo(String text, int id) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCAskYesNo(id, text)); } public void sendYesNoS(String text, byte type) { sendYesNoS(text, type, this.id); } public void sendYesNoS(String text, byte type, int idd) { if (text.contains("#L")) { sendSimpleS(text, type); return; } this.c.getSession().write(NPCPacket.sendNPCAskYesNo(this.id,text)); } public void sendSimple(String text) { sendSimple(text, this.id); } public void sendSimple(String text, int id) { if (!text.contains("#L")) { sendNext(text); return; } this.c.getSession().write(NPCPacket.sendChoose(id,text)); } public void sendSimpleS(String text, byte type) { sendSimpleS(text, type, this.id); } public void sendSimpleS(String text, byte type, int idd) { if (!text.contains("#L")) { sendNextS(text, type); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id, text)); } public void sendGetNumber(String text, int def, int min, int max) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCAskNumber(this.id,text, def, min, max)); } public void sendGetText(String text) { sendGetText(text, this.id); } public void sendGetText(String text, int id) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCAskText(id, text)); } public void setGetText(String text) { this.getText = text; } public String getText() { return this.getText; } public void sendPlayerOk(String text) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id,text)); } public void sendPlayerNext(String text) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id,text, false,true)); } public void sendPlayerNextPrev(String text) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id, text, true,true)); } public void sendRevivePet(String text) { if (text.contains("#L")) { sendSimple(text); // return; } } public void sendPlayerStart(String text) { if (text.contains("#L")) { sendSimple(text); return; } this.c.getSession().write(NPCPacket.sendNPCSay(this.id, text)); } public void setHair(int hair) { getPlayer().setHair(hair); getPlayer().updateSingleStat(MapleStat.发型, hair); getPlayer().equipChanged(); } public void setFace(int face) { getPlayer().setFace(face); getPlayer().updateSingleStat(MapleStat.脸型, face); getPlayer().equipChanged(); } public void setSkin(int color) { getPlayer().setSkinColor((byte) color); getPlayer().updateSingleStat(MapleStat.皮肤, color); getPlayer().equipChanged(); } public int setRandomAvatar(int ticket, int[] args_all) { if (!haveItem(ticket)) { return -1; } gainItem(ticket, (short) -1); int args = args_all[Randomizer.nextInt(args_all.length)]; if (args < 100) { this.c.getPlayer().setSkinColor((byte) args); this.c.getPlayer().updateSingleStat(MapleStat.皮肤, args); } else if (args < 30000) { this.c.getPlayer().setFace(args); this.c.getPlayer().updateSingleStat(MapleStat.脸型, args); } else { this.c.getPlayer().setHair(args); this.c.getPlayer().updateSingleStat(MapleStat.发型, args); } this.c.getPlayer().equipChanged(); return 1; } public int setAvatar(int ticket, int args) { if (!haveItem(ticket)) { return -1; } gainItem(ticket, (short) -1); if (args < 100) { this.c.getPlayer().setSkinColor((byte) args); this.c.getPlayer().updateSingleStat(MapleStat.皮肤, args); } else if (args < 30000) { this.c.getPlayer().setFace(args); this.c.getPlayer().updateSingleStat(MapleStat.脸型, args); } else { this.c.getPlayer().setHair(args); this.c.getPlayer().updateSingleStat(MapleStat.发型, args); } this.c.getPlayer().equipChanged(); return 1; } public void sendStorage() { this.c.getPlayer().setConversation(4); this.c.getPlayer().getStorage().sendStorage(this.c, this.id); } public void openShop(int id) { MapleShopFactory.getInstance().getShop(id).sendShop(this.c); } public void openShopNPC(int id) { MapleShopFactory.getInstance().getShop(id).sendShop(this.c, this.id); } public void showAdvanturerBoatScene() { Thread scripts = new Thread() { @Override public void run() { try { c.getSession().write(UIPacket.getDirectionStatus(true)); c.getSession().write(UIPacket.IntroEnableUI(1)); c.getSession().write(MaplePacketCreator.environmentChange("advStory/whistle", 5)); c.getSession().write(UIPacket.getDirectionInfo(1, 208)); Thread.sleep(208); c.getSession().write(UIPacket.ShowWZEffect("Effect/Direction3.img/adventureStory/Scene2")); Thread.sleep(3000); sendNextS("看来现在船要出发了!", (byte) 1); Thread.sleep(208); } catch (InterruptedException ex) { } NPCScriptManager.getInstance().dispose(c); c.removeClickedNPC(); NPCScriptManager.getInstance().start(c, 10306, "ExplorerTut07"); } }; scripts.start(); } public int gainGachaponItem(int id, int quantity) { return gainGachaponItem(id, quantity, new StringBuilder().append(this.c.getPlayer().getMap().getStreetName()).append(" - ").append(this.c.getPlayer().getMap().getMapName()).toString()); } public int gainGachaponItem(int id, int quantity, String msg) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); try { if (!ii.itemExists(id)) { return -1; } Item item = MapleInventoryManipulator.addbyId_Gachapon(this.c, id, (short) quantity, new StringBuilder().append("从 ").append(msg).append(" 中获得时间: ").append(FileoutputUtil.CurrentReadable_Time()).toString()); if (item == null) { return -1; } byte rareness = GameConstants.gachaponRareItem(item.getItemId()); return item.getItemId(); } catch (Exception e) { _log.error("gainGachaponItem 错误", e); } return -1; } public int gainGachaponItem(int id, int quantity, String msg, int rareness) { return gainGachaponItem(id, quantity, msg, rareness, false, 0L); } public int gainGachaponItem(int id, int quantity, String msg, int rareness, long period) { return gainGachaponItem(id, quantity, msg, rareness, false, period); } public int gainGachaponItem(int id, int quantity, String msg, int rareness, boolean buy) { return gainGachaponItem(id, quantity, msg, rareness, buy, 0L); } public int gainGachaponItem(int id, int quantity, String msg, int rareness, boolean buy, long period) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); try { if (!ii.itemExists(id)) { return -1; } Item item = MapleInventoryManipulator.addbyId_Gachapon(this.c, id, (short) quantity, new StringBuilder().append("从 ").append(msg).append(" 中").append(buy ? "购买" : "获得").append("时间: ").append(FileoutputUtil.CurrentReadable_Time()).toString(), period); if (item == null) { return -1; } return item.getItemId(); } catch (Exception e) { _log.error("gainGachaponItem 错误", e); } return -1; } public void changeJob(int jobId) { this.c.getPlayer().changeJob(jobId, true); } public void changeJobById(int jobId) { this.c.getPlayer().changeJob(jobId, true); } public boolean isValidJob(int jobId) { return MapleCarnivalChallenge.getJobNameByIdNull(jobId) != null; } public String getJobNameById(int jobId) { return MapleCarnivalChallenge.getJobNameByIdNull(jobId); } public void startQuest(int questId) { MapleQuestStatus tmp = getPlayer().getQuest(MapleQuest.getInstance(questId)); if (tmp.getCustomData().isEmpty()) { FileoutputUtil.log("开始纯记录任务!"); tmp.setStatus((byte)MapleQuestStatus.QUEST_STARTED); } else { FileoutputUtil.log("开始WZ任务"); MapleQuest.getInstance(questId).start(getPlayer(), getNpc()); } } public void completeQuest(int questId) { FileoutputUtil.log("任务附加数据:"+getPlayer().getQuest(MapleQuest.getInstance(questId)).getCustomData()); MapleQuestStatus tmp = getPlayer().getQuest(MapleQuest.getInstance(questId)); if (tmp.getCustomData().isEmpty()) { FileoutputUtil.log("完成纯记录任务!"); getPlayer().getQuest(MapleQuest.getInstance(questId)).setStatus((byte)MapleQuestStatus.QUEST_COMPLETED); } else { FileoutputUtil.log("完成WZ任务"); MapleQuest.getInstance(questId).complete(getPlayer(), getNpc()); } } public void forfeitQuest(int questId) { MapleQuest.getInstance(questId).forfeit(getPlayer()); } @Override public void forceStartQuest(int questId) { MapleQuest.getInstance(questId).forceStart(getPlayer(), getNpc(), null); } @Override public void forceCompleteQuest(int questId) { MapleQuest.getInstance(questId).forceComplete(getPlayer(), getNpc()); } public static boolean hairExists(int hair) { return MapleItemInformationProvider.getInstance().hairExists(hair); } public int[] getCanHair(int[] hairs) { List<Integer> canHair = new ArrayList(); List<Integer> cantHair = new ArrayList(); for (int hair : hairs) { if (hairExists(hair)) { canHair.add(hair); } else { cantHair.add(hair); } } if (cantHair.size() > 0 && c.getPlayer().isAdmin()) { StringBuilder sb = new StringBuilder("正在读取的发型里有"); sb.append(cantHair.size()).append("个发型客户端不支持显示,已经被清除:"); for (int i = 0; i < cantHair.size(); i++) { sb.append(cantHair.get(i)); if (i < cantHair.size() - 1) { sb.append(","); } } playerMessage(sb.toString()); } int[] getHair = new int[canHair.size()]; for (int i = 0; i < canHair.size(); i++) { getHair[i] = canHair.get(i); } return getHair; } public static boolean faceExists(int face) { return MapleItemInformationProvider.getInstance().faceExists(face); } public int[] getCanFace(int[] faces) { List<Integer> canFace = new ArrayList(); List<Integer> cantFace = new ArrayList(); for (int face : faces) { if (faceExists(face)) { canFace.add(face); } else { cantFace.add(face); } } if (cantFace.size() > 0 && c.getPlayer().isAdmin()) { StringBuilder sb = new StringBuilder("正在读取的脸型里有"); sb.append(cantFace.size()).append("个脸型客户端不支持显示,已经被清除:"); for (int i = 0; i < cantFace.size(); i++) { sb.append(cantFace.get(i)); if (i < cantFace.size() - 1) { sb.append(","); } } playerMessage(sb.toString()); } int[] getFace = new int[canFace.size()]; for (int i = 0; i < canFace.size(); i++) { getFace[i] = canFace.get(i); } return getFace; } public long getMeso() { return getPlayer().getMeso(); } public void gainAp(int amount) { this.c.getPlayer().gainAp((short) amount); } public void expandInventory(byte type, int amt) { this.c.getPlayer().expandInventory(type, amt); } public void unequipEverything() { MapleInventory equipped = getPlayer().getInventory(MapleInventoryType.EQUIPPED); MapleInventory equip = getPlayer().getInventory(MapleInventoryType.EQUIP); List itemIds = new LinkedList(); for (Item item : equipped.newList()) { itemIds.add(item.getPosition()); } for (Iterator i$ = itemIds.iterator(); i$.hasNext();) { short ids = ((Short) i$.next()); MapleInventoryManipulator.unequip(getClient(), ids, equip.getNextFreeSlot()); } } public void showEffect(boolean broadcast, String effect) { if (broadcast) { this.c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.showEffect(effect)); } else { this.c.getSession().write(MaplePacketCreator.showEffect(effect)); } } public void playSound(boolean broadcast, String sound) { if (broadcast) { this.c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.playSound(sound)); } else { this.c.getSession().write(MaplePacketCreator.playSound(sound)); } } public void environmentChange(boolean broadcast, String env) { if (broadcast) { this.c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.environmentChange(env, 2)); } else { this.c.getSession().write(MaplePacketCreator.environmentChange(env, 2)); } } public void updateBuddyCapacity(int capacity) { this.c.getPlayer().setBuddyCapacity((byte) capacity); } public int getBuddyCapacity() { return this.c.getPlayer().getBuddyCapacity(); } public int partyMembersInMap() { int inMap = 0; if (getPlayer().getParty() == null) { return inMap; } for (MapleCharacter chr : getPlayer().getMap().getCharactersThreadsafe()) { if ((chr.getParty() != null) && (chr.getParty().getId() == getPlayer().getParty().getId())) { inMap++; } } return inMap; } public List<MapleCharacter> getPartyMembers() { if (getPlayer().getParty() == null) { return null; } List<MapleCharacter> chars = new LinkedList<>();// List chars = new LinkedList(); for (MaplePartyCharacter chr : getPlayer().getParty().getMembers()) { for (ChannelServer channel : ChannelServer.getAllInstances()) { MapleCharacter ch = channel.getPlayerStorage().getCharacterById(chr.getId()); if (ch != null) { chars.add(ch); } } } MaplePartyCharacter chr; return chars; } public void warpPartyWithExp(int mapId, int exp) { if (getPlayer().getParty() == null) { warp(mapId, 0); gainExp(exp); return; } MapleMap target = getMap(mapId); for (MaplePartyCharacter partychr : getPlayer().getParty().getMembers()) { MapleCharacter chr = this.c.getChannelServer().getPlayerStorage().getCharacterByName(partychr.getName()); if (((chr.getEventInstance() == null) && (getPlayer().getEventInstance() == null)) || (chr.getEventInstance() == getPlayer().getEventInstance())) { chr.changeMap(target, target.getPortal(0)); chr.gainExp(exp, true, false, true); } } } public void warpPartyWithExpMeso(int mapId, int exp, long meso) { if (getPlayer().getParty() == null) { warp(mapId, 0); gainExp(exp); gainMeso(meso); return; } MapleMap target = getMap(mapId); for (MaplePartyCharacter partychr : getPlayer().getParty().getMembers()) { MapleCharacter chr = this.c.getChannelServer().getPlayerStorage().getCharacterByName(partychr.getName()); if (((chr.getEventInstance() == null) && (getPlayer().getEventInstance() == null)) || (chr.getEventInstance() == getPlayer().getEventInstance())) { chr.changeMap(target, target.getPortal(0)); chr.gainExp(exp, true, false, true); chr.gainMeso(meso, true); } } } public MapleSquad getSquad(String type) { return this.c.getChannelServer().getMapleSquad(type); } public int getSquadAvailability(String type) { MapleSquad squad = this.c.getChannelServer().getMapleSquad(type); if (squad == null) { return -1; } return squad.getStatus(); } public boolean registerSquad(String type, int minutes, String startText) { if (this.c.getChannelServer().getMapleSquad(type) == null) { MapleSquad squad = new MapleSquad(this.c.getChannel(), type, this.c.getPlayer(), minutes * 60 * 1000, startText); boolean ret = this.c.getChannelServer().addMapleSquad(squad, type); if (ret) { MapleMap map = this.c.getPlayer().getMap(); map.broadcastMessage(MaplePacketCreator.getClock(minutes * 60)); map.broadcastMessage(MaplePacketCreator.serverMessageRedText(new StringBuilder().append(this.c.getPlayer().getName()).append(startText).toString())); } else { squad.clear(); } return ret; } return false; } public boolean getSquadList(String type, byte type_) { try { MapleSquad squad = this.c.getChannelServer().getMapleSquad(type); if (squad == null) { return false; } if ((type_ == 0) || (type_ == 3)) { sendNext(squad.getSquadMemberString(type_)); } else if (type_ == 1) { sendSimple(squad.getSquadMemberString(type_)); } else if (type_ == 2) { if (squad.getBannedMemberSize() > 0) { sendSimple(squad.getSquadMemberString(type_)); } else { sendNext(squad.getSquadMemberString(type_)); } } return true; } catch (NullPointerException ex) { FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, ex); } return false; } public byte isSquadLeader(String type) { MapleSquad squad = this.c.getChannelServer().getMapleSquad(type); if (squad != null) { if ((squad.getLeader() != null) && (squad.getLeader().getId() == this.c.getPlayer().getId())) { return 1; } return 0; } return -1; } public boolean reAdd(String eim, String squad) { EventInstanceManager eimz = getDisconnected(eim); MapleSquad squadz = getSquad(squad); if ((eimz != null) && (squadz != null)) { squadz.reAddMember(getPlayer()); eimz.registerPlayer(getPlayer()); return true; } return false; } public void banMember(String type, int pos) { MapleSquad squad = this.c.getChannelServer().getMapleSquad(type); if (squad != null) { squad.banMember(pos); } } public void acceptMember(String type, int pos) { MapleSquad squad = this.c.getChannelServer().getMapleSquad(type); if (squad != null) { squad.acceptMember(pos); } } public int addMember(String type, boolean join) { MapleSquad squad = this.c.getChannelServer().getMapleSquad(type); if (squad != null) { return squad.addMember(this.c.getPlayer(), join); } return -1; } public byte isSquadMember(String type) { MapleSquad squad = this.c.getChannelServer().getMapleSquad(type); if (squad != null) { if (squad.containsMember(this.c.getPlayer())) { return 1; } if (squad.isBanned(this.c.getPlayer())) { return 2; } return 0; } return -1; } public void resetReactors() { getPlayer().getMap().resetReactors(); } public void genericGuildMessage(int code) { this.c.getSession().write(GuildPacket.genericGuildMessage((byte) code)); } public void disbandGuild() { int gid = this.c.getPlayer().getGuildId(); if ((gid <= 0) || (this.c.getPlayer().getGuildRank() != 1)) { return; } WorldGuildService.getInstance().disbandGuild(gid); } public void increaseGuildCapacity(boolean trueMax) { increaseGuildCapacity(trueMax, 50000000); } public void increaseGuildCapacity(boolean trueMax, long meso) { if ((this.c.getPlayer().getMeso() < meso) && (!trueMax)) { this.c.getSession().write(MaplePacketCreator.serverMessageRedText(new StringBuilder().append("金币不足.要金币: ").append(meso).toString())); return; } int gid = this.c.getPlayer().getGuildId(); if (gid <= 0) { return; } if (WorldGuildService.getInstance().increaseGuildCapacity(gid, trueMax)) { if (!trueMax) { this.c.getPlayer().gainMeso(-meso, true, true); } else { gainGP(-25000); } } else if (!trueMax) { sendNext("请检查家族成员是否到达上限. (最大人数: 100)"); } else { sendNext("请检查家族成员是否到达上限, if you have the GP needed or if subtracting GP would decrease a guild level. (最大人数: 200)"); } } public void displayGuildRanks() { displayGuildRanks(false); } public void displayGuildRanks(boolean show) { this.c.getSession().write(GuildPacket.showGuildRanks(this.id, MapleGuildRanking.getInstance().getRank(), show)); } public int getCreateGuildCost() { return this.c.getChannelServer().getCreateGuildCost(); } public boolean removePlayerFromInstance() { if (this.c.getPlayer().getEventInstance() != null) { this.c.getPlayer().getEventInstance().removePlayer(this.c.getPlayer()); return true; } return false; } public boolean isPlayerInstance() { return this.c.getPlayer().getEventInstance() != null; } public void changeStat(byte slot, int type, int amount) { Equip sel = (Equip) this.c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((short) slot); switch (type) { case 0: sel.setStr((short) amount); break; case 1: sel.setDex((short) amount); break; case 2: sel.setInt((short) amount); break; case 3: sel.setLuk((short) amount); break; case 4: sel.setHp((short) amount); break; case 5: sel.setMp((short) amount); break; case 6: sel.setWatk((short) amount); break; case 7: sel.setMatk((short) amount); break; case 8: sel.setWdef((short) amount); break; case 9: sel.setMdef((short) amount); break; case 10: sel.setAcc((short) amount); break; case 11: sel.setAvoid((short) amount); break; case 12: sel.setHands((short) amount); break; case 13: sel.setSpeed((short) amount); break; case 14: sel.setJump((short) amount); break; case 15: sel.setUpgradeSlots((byte) amount); break; case 17: sel.setLevel((byte) amount); break; case 18: sel.setState((byte) amount); break; case 19: sel.setEnhance((byte) amount); break; case 23: sel.setOwner(getText()); break; } this.c.getPlayer().equipChanged(); fakeRelog(); } public void openDuey() { this.c.getPlayer().setConversation(2); this.c.getSession().write(MaplePacketCreator.sendDuey((byte) 9, null)); } public void openMerchantItemStore() { this.c.getPlayer().setConversation(3); this.c.getSession().write(PlayerShopPacket.merchItemStore((byte) 40)); } public void sendPVPWindow() { this.c.getSession().write(MaplePacketCreator.sendPVPWindow(0)); this.c.getSession().write(MaplePacketCreator.sendPVPMaps()); } public void sendPartyWindow() { this.c.getSession().write(MaplePacketCreator.sendPartyWindow(this.id)); } public void sendPartyWindow(int id) { this.c.getSession().write(MaplePacketCreator.sendPartyWindow(id)); } public void sendRepairWindow() { this.c.getSession().write(MaplePacketCreator.sendRepairWindow(this.id)); } public void sendProfessionWindow() { this.c.getSession().write(MaplePacketCreator.sendProfessionWindow(0)); } public void sendEventWindow() { this.c.getSession().write(MaplePacketCreator.sendEventWindow(0)); } public void sendLinkSkillWindow(int skillId) { if (hasSkill(skillId)) { this.c.getSession().write(MaplePacketCreator.sendLinkSkillWindow(skillId)); } } public short getKegs() { return this.c.getChannelServer().getFireWorks().getKegsPercentage(); } public void giveKegs(int kegs) { this.c.getChannelServer().getFireWorks().giveKegs(this.c.getPlayer(), kegs); } public short getSunshines() { return this.c.getChannelServer().getFireWorks().getSunsPercentage(); } public void addSunshines(int kegs) { this.c.getChannelServer().getFireWorks().giveSuns(this.c.getPlayer(), kegs); } public short getDecorations() { return this.c.getChannelServer().getFireWorks().getDecsPercentage(); } public void addDecorations(int kegs) { try { this.c.getChannelServer().getFireWorks().giveDecs(this.c.getPlayer(), kegs); } catch (Exception e) { _log.error("addDecorations 错误", e); } } public MapleCarnivalParty getCarnivalParty() { return this.c.getPlayer().getCarnivalParty(); } public MapleCarnivalChallenge getNextCarnivalRequest() { return this.c.getPlayer().getNextCarnivalRequest(); } public MapleCarnivalChallenge getCarnivalChallenge(MapleCharacter chr) { return new MapleCarnivalChallenge(chr); } public void maxStats() { Map statup = new EnumMap(MapleStat.class); this.c.getPlayer().getStat().str = 32767; this.c.getPlayer().getStat().dex = 32767; this.c.getPlayer().getStat().int_ = 32767; this.c.getPlayer().getStat().luk = 32767; this.c.getPlayer().getStat().setMaxHp(this.c.getPlayer().getMaxHpForSever(),this.c.getPlayer()); this.c.getPlayer().getStat().setMaxMp(this.c.getPlayer().getMaxMpForSever(),this.c.getPlayer()); this.c.getPlayer().getStat().setHp(this.c.getPlayer().getMaxHpForSever()); this.c.getPlayer().getStat().setMp(this.c.getPlayer().getMaxMpForSever()); statup.put(MapleStat.力量, 32767L); statup.put(MapleStat.敏捷, 32767L); statup.put(MapleStat.运气, 32767L); statup.put(MapleStat.智力, 32767L); statup.put(MapleStat.HP, (long) this.c.getPlayer().getMaxHpForSever()); statup.put(MapleStat.MAXHP, (long) this.c.getPlayer().getMaxHpForSever()); statup.put(MapleStat.MP, (long) this.c.getPlayer().getMaxMpForSever()); statup.put(MapleStat.MAXMP, (long) this.c.getPlayer().getMaxMpForSever()); this.c.getPlayer().getStat().recalcLocalStats(this.c.getPlayer()); this.c.getSession().write(MaplePacketCreator.updatePlayerStats(statup, this.c.getPlayer())); } public Triple<String, Map<Integer, String>, Long> getSpeedRun(String typ) { ExpeditionType types = ExpeditionType.valueOf(typ); if (SpeedRunner.getSpeedRunData(types) != null) { return SpeedRunner.getSpeedRunData(types); } return new Triple("", new HashMap(), 0L); } public boolean getSR(Triple<String, Map<Integer, String>, Long> ma, int sel) { if ((((Map) ma.mid).get(sel) == null) || (((String) ((Map) ma.mid).get(sel)).length() <= 0)) { dispose(); return false; } sendOk((String) ((Map) ma.mid).get(sel)); return true; } public Equip getEquip(int itemid) { return (Equip) MapleItemInformationProvider.getInstance().getEquipById(itemid); } public void setExpiration(Object statsSel, long expire) { if ((statsSel instanceof Equip)) { ((Equip) statsSel).setExpiration(System.currentTimeMillis() + expire * 24L * 60L * 60L * 1000L); } } public void setLock(Object statsSel) { if ((statsSel instanceof Equip)) { Equip eq = (Equip) statsSel; if (eq.getExpiration() == -1L) { eq.setFlag((short) (byte) (eq.getFlag() | ItemFlag.封印.getValue())); } else { eq.setFlag((short) (byte) (eq.getFlag() | ItemFlag.不可交易.getValue())); } } } public boolean addFromDrop(Object statsSel) { if ((statsSel instanceof Item)) { Item it = (Item) statsSel; return (MapleInventoryManipulator.checkSpace(getClient(), it.getItemId(), it.getQuantity(), it.getOwner())) && (MapleInventoryManipulator.addFromDrop(getClient(), it, false)); } return false; } public boolean replaceItem(int slot, int invType, Object statsSel, int offset, String type) { return replaceItem(slot, invType, statsSel, offset, type, false); } public boolean replaceItem(int slot, int invType, Object statsSel, int offset, String type, boolean takeSlot) { MapleInventoryType inv = MapleInventoryType.getByType((byte) invType); if (inv == null) { return false; } Item item = getPlayer().getInventory(inv).getItem((short) (byte) slot); if ((item == null) || ((statsSel instanceof Item))) { item = (Item) statsSel; } if (offset > 0) { if (inv != MapleInventoryType.EQUIP) { return false; } Equip eq = (Equip) item; if (takeSlot) { if (eq.getUpgradeSlots() < 1) { return false; } eq.setUpgradeSlots((byte) (eq.getUpgradeSlots() - 1)); if (eq.getExpiration() == -1L) { eq.setFlag((short) (byte) (eq.getFlag() | ItemFlag.封印.getValue())); } else { eq.setFlag((short) (byte) (eq.getFlag() | ItemFlag.不可交易.getValue())); } } if (type.equalsIgnoreCase("Slots")) { eq.setUpgradeSlots((byte) (eq.getUpgradeSlots() + offset)); } else if (type.equalsIgnoreCase("Level")) { eq.setLevel((byte) (eq.getLevel() + offset)); }else if (type.equalsIgnoreCase("STR")) { eq.setStr((short) (eq.getStr() + offset)); } else if (type.equalsIgnoreCase("DEX")) { eq.setDex((short) (eq.getDex() + offset)); } else if (type.equalsIgnoreCase("INT")) { eq.setInt((short) (eq.getInt() + offset)); } else if (type.equalsIgnoreCase("LUK")) { eq.setLuk((short) (eq.getLuk() + offset)); } else if (type.equalsIgnoreCase("HP")) { eq.setHp((short) (eq.getHp() + offset)); } else if (type.equalsIgnoreCase("MP")) { eq.setMp((short) (eq.getMp() + offset)); } else if (type.equalsIgnoreCase("WATK")) { eq.setWatk((short) (eq.getWatk() + offset)); } else if (type.equalsIgnoreCase("MATK")) { eq.setMatk((short) (eq.getMatk() + offset)); } else if (type.equalsIgnoreCase("WDEF")) { eq.setWdef((short) (eq.getWdef() + offset)); } else if (type.equalsIgnoreCase("MDEF")) { eq.setMdef((short) (eq.getMdef() + offset)); } else if (type.equalsIgnoreCase("ACC")) { eq.setAcc((short) (eq.getAcc() + offset)); } else if (type.equalsIgnoreCase("Avoid")) { eq.setAvoid((short) (eq.getAvoid() + offset)); } else if (type.equalsIgnoreCase("Hands")) { eq.setHands((short) (eq.getHands() + offset)); } else if (type.equalsIgnoreCase("Speed")) { eq.setSpeed((short) (eq.getSpeed() + offset)); } else if (type.equalsIgnoreCase("Jump")) { eq.setJump((short) (eq.getJump() + offset)); } else if (type.equalsIgnoreCase("Expiration")) { eq.setExpiration(eq.getExpiration() + offset); } else if (type.equalsIgnoreCase("Flag")) { eq.setFlag((short) (byte) (eq.getFlag() + offset)); } item = eq.copy(); } MapleInventoryManipulator.removeFromSlot(getClient(), inv, (short) slot, item.getQuantity(), false); return MapleInventoryManipulator.addFromDrop(getClient(), item, false); } public boolean replaceItem(int slot, int invType, Object statsSel, int upgradeSlots) { return replaceItem(slot, invType, statsSel, upgradeSlots, "Slots"); } public boolean isCash(int itemId) { return MapleItemInformationProvider.getInstance().isCash(itemId); } public int getTotalStat(int itemId) { return MapleItemInformationProvider.getInstance().getTotalStat((Equip) MapleItemInformationProvider.getInstance().getEquipById(itemId)); } public int getReqLevel(int itemId) { return MapleItemInformationProvider.getInstance().getReqLevel(itemId); } public MapleStatEffect getEffect(int buff) { return MapleItemInformationProvider.getInstance().getItemEffect(buff); } public void buffGuild(int buff, int duration, String msg) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleStatEffect mse; if ((ii.getItemEffect(buff) != null) && (getPlayer().getGuildId() > 0)) { mse = ii.getItemEffect(buff); for (ChannelServer cserv : ChannelServer.getAllInstances()) { for (MapleCharacter chr : cserv.getPlayerStorage().getAllCharacters()) { if (chr.getGuildId() == getPlayer().getGuildId()) { mse.applyTo(chr, chr, true, null, duration); chr.dropMessage(5, new StringBuilder().append("Your guild has gotten a ").append(msg).append(" buff.").toString()); } } } } } public boolean addCapacityToAlliance() { try { MapleGuild guild = WorldGuildService.getInstance().getGuild(this.c.getPlayer().getGuildId()); if ((guild != null) && (this.c.getPlayer().getGuildRank() == 1) && (this.c.getPlayer().getAllianceRank() == 1) ) { gainMeso(-10000000); return true; } } catch (Exception re) { _log.error("addCapacityToAlliance 错误", re); } return false; } public boolean disbandAlliance() { try { MapleGuild guild = WorldGuildService.getInstance().getGuild(this.c.getPlayer().getGuildId()); if ((guild != null) && (this.c.getPlayer().getGuildRank() == 1) && (this.c.getPlayer().getAllianceRank() == 1) ) { return true; } } catch (Exception re) { _log.error("disbandAlliance 错误", re); } return false; } public boolean hasSkill(int skillid) { Skill theSkill = SkillFactory.getSkill(skillid); if (theSkill != null) { return this.c.getPlayer().getSkillLevel(theSkill) > 0; } return false; } public void maxAllSkills() { HashMap sDate = new HashMap(); for (Skill skil : SkillFactory.getAllSkills()) { if (skil.getId() < 90000000) { sDate.put(skil, new SkillEntry((byte) skil.getMaxLevel(), (byte) skil.getMaxLevel(), SkillFactory.getDefaultSExpiry(skil))); } } getPlayer().changeSkillsLevel(sDate); sDate.clear(); } public void maxSkillsByJob() { List<Integer> skillIds = new ArrayList(); HashMap<Skill, SkillEntry> sDate = new HashMap(); for (Skill skil : SkillFactory.getAllSkills()) { if ((skil.canBeLearnedBy(getPlayer().getJob())) && (!GameConstants.is新手职业(skil.getId() / 10000)) && (!skil.isSpecialSkill())) { sDate.put(skil, new SkillEntry((byte) skil.getMaxLevel(), (byte) skil.getMaxLevel(), SkillFactory.getDefaultSExpiry(skil))); skillIds.add(skil.getId()); } } getPlayer().changeSkillsLevel(sDate); Collections.sort(skillIds); String job; Iterator i$; if (getPlayer().isShowPacket()) { job = new StringBuilder().append("Skill\\").append(MapleCarnivalChallenge.getJobNameById(getPlayer().getJob())).append(".txt").toString(); for (i$ = skillIds.iterator(); i$.hasNext();) { Integer skillId = (Integer) i$.next(); for (Entry<Skill, SkillEntry> data : sDate.entrySet()) { if (((Skill) data.getKey()).getId() == skillId) { String txt = new StringBuilder().append("public static final int ").append(((Skill) data.getKey()).getName()).append(" = ").append(((Skill) data.getKey()).getId()).append("; //技能最大等级").append(((Skill) data.getKey()).getMaxLevel()).toString(); FileoutputUtil.log(job, txt, true); } } } } Integer skillId; sDate.clear(); skillIds.clear(); } public void clearSkills() { this.c.getPlayer().clearSkills(); } public void maxHyperSkillsByJob() { List skillIds = new ArrayList(); HashMap<Skill, SkillEntry> sDate = new HashMap(); for (Skill skil : SkillFactory.getAllSkills()) { if ((skil.canBeLearnedBy(getPlayer().getJob()))) { sDate.put(skil, new SkillEntry((byte) skil.getMaxLevel(), (byte) skil.getMaxLevel(), SkillFactory.getDefaultSExpiry(skil))); skillIds.add(skil.getId()); } } getPlayer().changeSkillsLevel(sDate); Collections.sort(skillIds); String job; Iterator i$; if (getPlayer().isShowPacket()) { job = new StringBuilder().append("Skill\\").append(MapleCarnivalChallenge.getJobNameById(getPlayer().getJob())).append(".txt").toString(); for (i$ = skillIds.iterator(); i$.hasNext();) { Integer skillId = (Integer) i$.next(); for (Map.Entry data : sDate.entrySet()) { if (((Skill) data.getKey()).getId() == skillId) { String txt = new StringBuilder().append("public static final int ").append(((Skill) data.getKey()).getName()).append(" = ").append(((Skill) data.getKey()).getId()).append("; //技能最大等级").append(((Skill) data.getKey()).getMaxLevel()).toString(); FileoutputUtil.log(job, txt, true); } } } } Integer skillId; sDate.clear(); skillIds.clear(); } public void resetStats(int str, int dex, int z, int luk) { this.c.getPlayer().resetStats(str, dex, z, luk); } public boolean dropItem(int slot, int invType, int quantity) { MapleInventoryType inv = MapleInventoryType.getByType((byte) invType); if (inv == null) { return false; } return MapleInventoryManipulator.drop(this.c, inv, (short) slot, (short) quantity, true); } public boolean removeItem(int slot, int invType, int quantity) { MapleInventoryType inv = MapleInventoryType.getByType((byte) invType); if (inv == null) { return false; } return MapleInventoryManipulator.removeFromSlot(this.c, inv, (short) slot, (short) quantity, true); } public void sendRPS() { this.c.getSession().write(MaplePacketCreator.getRPSMode((byte) 8, -1, -1, -1)); } public void setQuestRecord(Object ch, int questid, String data) { ((MapleCharacter) ch).getQuestNAdd(MapleQuest.getInstance(questid)).setCustomData(data); } public final void doWeddingEffect(Object ch) { final MapleCharacter chr = (MapleCharacter) ch; final MapleCharacter player = getPlayer(); WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.yellowChat(new StringBuilder().append(player.getName()).append(", 你愿意娶 ").append(chr.getName()).append(" 为妻吗?无论她将来是富有还是贫穷、或无论她将来身体健康或不适,你都愿意和她永远在一起吗?").toString())); CloneTimer.getInstance().schedule(new Runnable() { @Override public void run() { if ((chr == null) || (player == null)) { NPCConversationManager.this.warpMap(700000000, 0); } else { WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.yellowChat(chr.getName() + ", 你愿意嫁给 " + player.getName() + " 吗?无论他将来是富有还是贫穷、或无论他将来身体健康或不适,你都愿意和他永远在一起吗?")); } } }, 10000L); CloneTimer.getInstance().schedule(new Runnable() { @Override public void run() { if ((chr == null) || (player == null)) { if (player != null) { NPCConversationManager.this.setQuestRecord(player, 160001, "3"); NPCConversationManager.this.setQuestRecord(player, 160002, "0"); } else if (chr != null) { NPCConversationManager.this.setQuestRecord(chr, 160001, "3"); NPCConversationManager.this.setQuestRecord(chr, 160002, "0"); } NPCConversationManager.this.warpMap(700000000, 0); } else { NPCConversationManager.this.setQuestRecord(player, 160001, "2"); NPCConversationManager.this.setQuestRecord(chr, 160001, "2"); chr.setMarriageId(player.getId()); player.setMarriageId(chr.getId()); NPCConversationManager.this.sendNPCText("好,我以圣灵、圣父、圣子的名义宣布:" + player.getName() + " 和 " + chr.getName() + "结为夫妻。 希望你们在 " + chr.getClient().getChannelServer().getServerName() + " 游戏中玩的愉快!", 9201002); chr.getMap().startExtendedMapEffect("现在,新郎可以亲吻新娘了。 " + player.getName() + "!", 5120006); WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.yellowChat("好,我以圣灵、圣父、圣子的名义宣布:" + player.getName() + " 和 " + chr.getName() + "结为夫妻。 希望你们在 " + chr.getClient().getChannelServer().getServerName() + " 游戏中玩的愉快!")); if (chr.getGuildId() > 0) { WorldGuildService.getInstance().guildPacket(chr.getGuildId(), MaplePacketCreator.sendMarriage(false, chr.getName())); } if (player.getGuildId() > 0) { WorldGuildService.getInstance().guildPacket(player.getGuildId(), MaplePacketCreator.sendMarriage(false, player.getName())); } } } }, 20000L); } public void putKey(int key, int type, int action) { getPlayer().changeKeybinding(key, (byte) type, action); getClient().getSession().write(MaplePacketCreator.getKeymap(getPlayer())); } public void doRing(String name, int itemid) { PlayersHandler.DoRing(getClient(), name, itemid); } public int getNaturalStats(int itemid, String it) { Map eqStats = MapleItemInformationProvider.getInstance().getEquipStats(itemid); if ((eqStats != null) && (eqStats.containsKey(it))) { return ((Integer) eqStats.get(it)); } return 0; } public boolean isEligibleName(String t) { return (MapleCharacterUtil.canCreateChar(t, getPlayer().isGM())) && ((!LoginInformationProvider.getInstance().isForbiddenName(t)) || (getPlayer().isGM())); } public String checkDrop(int mobId) { List ranks = MapleMonsterInformationProvider.getInstance().retrieveDrop(mobId); if ((ranks != null) && (ranks.size() > 0)) { int num = 0; StringBuilder name = new StringBuilder(); for (Object rank : ranks) { MonsterDropEntry de = (MonsterDropEntry) rank; if ((de.chance > 0) && ((de.questid <= 0) || ((de.questid > 0) && (MapleQuest.getInstance(de.questid).getName().length() > 0)))) { int itemId = de.itemId; if (num == 0) { name.append("当前怪物 #o").append(mobId).append("# 的爆率为:\r\n"); name.append("--------------------------------------\r\n"); } String namez = new StringBuilder().append("#z").append(itemId).append("#").toString(); if (itemId == 0) { itemId = 4031041; namez = new StringBuilder().append(de.Minimum * getClient().getChannelServer().getMesoRate(getPlayer().getWorld())).append(" - ").append(de.Maximum * getClient().getChannelServer().getMesoRate(getPlayer().getWorld())).append(" 的金币").toString(); } int chance = de.chance * getClient().getChannelServer().getDropRate(getPlayer().getWorld()); if (getPlayer().isShowPacket()) { name.append(num + 1).append(") #v").append(itemId).append("#").append(namez).append(" - ").append(Integer.valueOf(chance >= 999999 ? 1000000 : chance).doubleValue() / 10000.0D).append("%的爆率. ").append((de.questid > 0) && (MapleQuest.getInstance(de.questid).getName().length() > 0) ? new StringBuilder().append("需要接受任务: ").append(MapleQuest.getInstance(de.questid).getName()).toString() : "").append("\r\n"); } else { name.append(num + 1).append(") #v").append(itemId).append("#").append(namez).append((de.questid > 0) && (MapleQuest.getInstance(de.questid).getName().length() > 0) ? new StringBuilder().append("需要接受任务: ").append(MapleQuest.getInstance(de.questid).getName()).toString() : "").append("\r\n"); } num++; } } if (name.length() > 0) { return name.toString(); } } return "没有找到这个怪物的爆率数据。"; } public String checkMapDrop() { List ranks = new ArrayList(MapleMonsterInformationProvider.getInstance().getGlobalDrop()); int mapid = this.c.getPlayer().getMap().getId(); int cashServerRate = getClient().getChannelServer().getCashRate(); int globalServerRate = getClient().getChannelServer().getGlobalRate(); if (ranks.size() > 0) { int num = 0; StringBuilder name = new StringBuilder(); for (Object rank : ranks) { MonsterGlobalDropEntry de = (MonsterGlobalDropEntry) rank; if ((de.continent < 0) || ((de.continent < 10) && (mapid / 100000000 == de.continent)) || ((de.continent < 100) && (mapid / 10000000 == de.continent)) || ((de.continent < 1000) && (mapid / 1000000 == de.continent))) { int itemId = de.itemId; if (num == 0) { name.append("当前地图 #r").append(mapid).append("#k - #m").append(mapid).append("# 的全局爆率为:"); name.append("\r\n--------------------------------------\r\n"); } String names = new StringBuilder().append("#z").append(itemId).append("#").toString(); if ((itemId == 0) && (cashServerRate != 0)) { itemId = 4031041; names = new StringBuilder().append(de.Minimum * cashServerRate).append(" - ").append(de.Maximum * cashServerRate).append(" 的抵用卷").toString(); } int chance = de.chance * globalServerRate; if (getPlayer().isShowPacket()) { name.append(num + 1).append(") #v").append(itemId).append("#").append(names).append(" - ").append(Integer.valueOf(chance >= 999999 ? 1000000 : chance).doubleValue() / 10000.0D).append("%的爆率. ").append((de.questid > 0) && (MapleQuest.getInstance(de.questid).getName().length() > 0) ? new StringBuilder().append("需要接受任务: ").append(MapleQuest.getInstance(de.questid).getName()).toString() : "").append("\r\n"); } else { name.append(num + 1).append(") #v").append(itemId).append("#").append(names).append((de.questid > 0) && (MapleQuest.getInstance(de.questid).getName().length() > 0) ? new StringBuilder().append("需要接受任务: ").append(MapleQuest.getInstance(de.questid).getName()).toString() : "").append("\r\n"); } num++; } } if (name.length() > 0) { return name.toString(); } } return "当前地图没有设置全局爆率。"; } public void outputWithLogging(int mobId, String buff) { String file = new StringBuilder().append("drop_data\\").append(mobId).append(".sql").toString(); FileoutputUtil.log(file, buff, true); } public List<BattleConstants.PokedexEntry> getAllPokedex() { return BattleConstants.getAllPokedex(); } public String getLeftPadded(String in, char padchar, int length) { return StringUtil.getLeftPaddedStr(in, padchar, length); } public List<Integer> makeTeam(int lowRange, int highRange, int neededLevel, int restrictedLevel) { List ret = new ArrayList(); int averageLevel = 0; int numBattlers = 0; for (Battler b : getPlayer().getBattlers()) { if (b != null) { if (b.getLevel() > averageLevel) { averageLevel = b.getLevel(); } numBattlers++; } } boolean hell = lowRange == highRange; if ((numBattlers < 3) || (averageLevel < neededLevel)) { return null; } if (averageLevel > restrictedLevel) { averageLevel = restrictedLevel; } List<PokedexEntry> pokeEntries = new ArrayList(getAllPokedex()); Collections.shuffle(pokeEntries); while (ret.size() < numBattlers) { for (BattleConstants.PokedexEntry d : pokeEntries) { if (((d.dummyBattler.getStats().isBoss()) && (hell)) || ((!d.dummyBattler.getStats().isBoss()) && (!hell))) { if (!hell) { if ((d.dummyBattler.getLevel() <= averageLevel + highRange) && (d.dummyBattler.getLevel() >= averageLevel + lowRange) && (Randomizer.nextInt(numBattlers) == 0)) { ret.add(d.id); if (ret.size() >= numBattlers) { break; } } } else if ((d.dummyBattler.getFamily().type != BattleConstants.MobExp.EASY) && (d.dummyBattler.getLevel() >= neededLevel) && (d.dummyBattler.getLevel() <= averageLevel) && (Randomizer.nextInt(numBattlers) == 0)) { ret.add(d.id); if (ret.size() >= numBattlers) { break; } } } } } return ret; } public BattleConstants.HoldItem[] getAllHoldItems() { return BattleConstants.HoldItem.values(); } public void handleDivorce() { if (getPlayer().getMarriageId() <= 0) { sendNext("你还没结婚,怎么能离婚呢?"); return; } int chz = WorldFindService.getInstance().findChannel(getPlayer().getMarriageId()); MapleRing mRing = getPlayer().getMarriageRing(); if (chz == -1) { try { Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("UPDATE queststatus SET customData = ? WHERE characterid = ? AND (quest = ? OR quest = ?)"); ps.setString(1, "0"); ps.setInt(2, getPlayer().getMarriageId()); ps.setInt(3, 160001); ps.setInt(4, 160002); ps.executeUpdate(); ps.close(); ps = con.prepareStatement("UPDATE characters SET marriageid = ? WHERE id = ?"); ps.setInt(1, 0); ps.setInt(2, getPlayer().getMarriageId()); ps.executeUpdate(); ps.close(); if (mRing != null) { ps = DatabaseConnection.getConnection().prepareStatement("DELETE FROM inventoryitems WHERE itemid = ? AND characterid = ?"); ps.setInt(1, mRing.getItemId()); ps.setInt(2, getPlayer().getMarriageId()); ps.executeUpdate(); ps.close(); } } catch (SQLException e) { outputFileError(e); return; } if (mRing != null) { getPlayer().removeAll(mRing.getItemId(), true, true); MapleRing.removeRingFromDb(mRing.getRingId(), mRing.getPartnerRingId()); WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.yellowChat(new StringBuilder().append("[系统公告] ").append(getPlayer().getName()).append(" 和 ").append(mRing.getPartnerName()).append(" 离婚了。").toString())); } setQuestRecord(getPlayer(), 160001, "0"); setQuestRecord(getPlayer(), 160002, "0"); getPlayer().setMarriageId(0); sendNext("离婚成功..."); return; } if (chz < -1) { sendNext("请确保你的伴侣是在线的."); return; } MapleCharacter cPlayer = ChannelServer.getInstance(chz).getPlayerStorage().getCharacterById(getPlayer().getMarriageId()); if (cPlayer != null) { if (mRing != null) { cPlayer.removeAll(mRing.getItemId(), true, true); getPlayer().removeAll(mRing.getItemId(), true, true); MapleRing.removeRingFromDb(mRing.getRingId(), mRing.getPartnerRingId()); } WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.yellowChat(new StringBuilder().append("[系统公告] ").append(getPlayer().getName()).append(" 和 ").append(cPlayer.getName()).append(" 离婚了。").toString())); cPlayer.dropMessage(1, "你的伴侣和你离婚了."); cPlayer.setMarriageId(0); setQuestRecord(cPlayer, 160001, "0"); setQuestRecord(getPlayer(), 160001, "0"); setQuestRecord(cPlayer, 160002, "0"); setQuestRecord(getPlayer(), 160002, "0"); getPlayer().setMarriageId(0); sendNext("离婚成功..."); } else { sendNext("出现了未知的错误..."); } } public String getReadableMillis(long startMillis, long endMillis) { return StringUtil.getReadableMillis(startMillis, endMillis); } public boolean canCreateUltimate() { if (getPlayer().getLevel() < 120) { return false; } int jobId = getPlayer().getJob(); return (jobId == 1111) || (jobId == 1112) || (jobId == 1211) || (jobId == 1212) || (jobId == 1311) || (jobId == 1312) || (jobId == 1411) || (jobId == 1412) || (jobId == 1511) || (jobId == 1512); } public void sendUltimateExplorer() { getClient().getSession().write(MaplePacketCreator.ultimateExplorer()); } public String getRankingInformation(int job) { StringBuilder sb = new StringBuilder(); for (RankingWorker.RankingInformation pi : RankingWorker.getRankingInfo(job)) { sb.append(pi.toString()); } return sb.toString(); } public String getPokemonRanking() { StringBuilder sb = new StringBuilder(); for (RankingWorker.PokemonInformation pi : RankingWorker.getPokemonInfo()) { sb.append(pi.toString()); } return sb.toString(); } public String getPokemonRanking_Caught() { StringBuilder sb = new StringBuilder(); for (RankingWorker.PokedexInformation pi : RankingWorker.getPokemonCaught()) { sb.append(pi.toString()); } return sb.toString(); } public String getPokemonRanking_Ratio() { StringBuilder sb = new StringBuilder(); for (RankingWorker.PokebattleInformation pi : RankingWorker.getPokemonRatio()) { sb.append(pi.toString()); } return sb.toString(); } public void sendPendant(boolean b) { this.c.getSession().write(MaplePacketCreator.pendantSlot(b)); } public Triple<Integer, Integer, Integer> getCompensation() { Triple ret = null; try { try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("SELECT * FROM compensationlog_confirmed WHERE chrname LIKE ?")) { ps.setString(1, getPlayer().getName()); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { ret = new Triple(rs.getInt("value"), rs.getInt("taken"), rs.getInt("donor")); } } ps.close(); } return ret; } catch (SQLException e) { FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, e); } return ret; } public boolean deleteCompensation(int taken) { try { try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("UPDATE compensationlog_confirmed SET taken = ? WHERE chrname LIKE ?")) { ps.setInt(1, taken); ps.setString(2, getPlayer().getName()); ps.executeUpdate(); ps.close(); } return true; } catch (SQLException e) { FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, e); } return false; } public void testPacket(String testmsg) { this.c.getSession().write(MaplePacketCreator.testPacket(testmsg)); } public void testPacket(String op, String msg) { this.c.getSession().write(MaplePacketCreator.testPacket(op, msg)); } public short getSpace(byte type) { return getPlayer().getSpace(type); } public boolean haveSpace(int type) { return getPlayer().haveSpace(type); } public boolean haveSpaceForId(int itemid) { return getPlayer().haveSpaceForId(itemid); } public int getMoney() { int money = 0; try { int cid = getPlayer().getId(); Connection con = DatabaseConnection.getConnection(); ResultSet rs; try (PreparedStatement ps = con.prepareStatement("select * from bank where charid=?")) { ps.setInt(1, cid); rs = ps.executeQuery(); if (rs.next()) { money = rs.getInt("money"); } else { try (PreparedStatement psu = con.prepareStatement("insert into bank (charid, money) VALUES (?, ?)")) { psu.setInt(1, cid); psu.setInt(2, 0); psu.executeUpdate(); ps.close(); } } } rs.close(); } catch (SQLException ex) { _log.error("银行存款获取信息发生错误", ex); } return money; } public int addMoney(int money, int type) { try { int cid = getPlayer().getId(); Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("select * from bank where charid=?"); ps.setInt(1, cid); ResultSet rs = ps.executeQuery(); if (rs.next()) { if ((type == 1) && (money > rs.getInt("money"))) { return -1; } ps = con.prepareStatement(new StringBuilder().append("UPDATE bank SET money =money+ ").append(money).append(" WHERE charid = ").append(cid).append("").toString()); return ps.executeUpdate(); } ps.close(); rs.close(); } catch (SQLException ex) { _log.error("银行存款添加数量发生错误", ex); } return 0; } public int getHyPay(int type) { return getPlayer().getHyPay(type); } public int addHyPay(int hypay) { return getPlayer().addHyPay(hypay); } public int delPayReward(int pay) { return getPlayer().delPayReward(pay); } public void fakeRelog() { if ((!this.c.getPlayer().isAlive()) || (this.c.getPlayer().getEventInstance() != null) || (FieldLimitType.ChannelSwitch.check(this.c.getPlayer().getMap().getFieldLimit()))) { this.c.getPlayer().dropMessage(1, "刷新人物数据失败."); return; } this.c.getPlayer().dropMessage(5, "正在刷新人数据.请等待..."); this.c.getPlayer().fakeRelog(); } public MapleCharacter getCharByName(String name) { try { return this.c.getChannelServer().getPlayerStorage().getCharacterByName(name); } catch (Exception e) { } return null; } public String EquipList(MapleClient c) { StringBuilder str = new StringBuilder(); MapleInventory equip = c.getPlayer().getInventory(MapleInventoryType.EQUIP); List<String> stra = new LinkedList(); for (Item item : equip.list()) { stra.add(new StringBuilder().append("#L").append(item.getPosition()).append("##v").append(item.getItemId()).append("##l").toString()); } for (String strb : stra) { str.append(strb); } return str.toString(); } public String UseList(MapleClient c) { StringBuilder str = new StringBuilder(); MapleInventory use = c.getPlayer().getInventory(MapleInventoryType.USE); List<String> stra = new LinkedList(); for (Item item : use.list()) { stra.add(new StringBuilder().append("#L").append(item.getPosition()).append("##v").append(item.getItemId()).append("##l").toString()); } for (String strb : stra) { str.append(strb); } return str.toString(); } public String CashList(MapleClient c) { StringBuilder str = new StringBuilder(); MapleInventory cash = c.getPlayer().getInventory(MapleInventoryType.CASH); List<String> stra = new LinkedList(); for (Item item : cash.list()) { stra.add(new StringBuilder().append("#L").append(item.getPosition()).append("##v").append(item.getItemId()).append("##l").toString()); } for (String strb : stra) { str.append(strb); } return str.toString(); } public String EtcList(MapleClient c) { StringBuilder str = new StringBuilder(); MapleInventory etc = c.getPlayer().getInventory(MapleInventoryType.ETC); List<String> stra = new LinkedList(); for (Item item : etc.list()) { stra.add(new StringBuilder().append("#L").append(item.getPosition()).append("##v").append(item.getItemId()).append("##l").toString()); } for (String strb : stra) { str.append(strb); } return str.toString(); } public String SetupList(MapleClient c) { StringBuilder str = new StringBuilder(); MapleInventory setup = c.getPlayer().getInventory(MapleInventoryType.SETUP); List<String> stra = new LinkedList(); for (Item item : setup.list()) { stra.add(new StringBuilder().append("#L").append(item.getPosition()).append("##v").append(item.getItemId()).append("##l").toString()); } for (String strb : stra) { str.append(strb); } return str.toString(); } public void deleteAll(int itemId) { MapleInventoryManipulator.removeAllById(getClient(), itemId, true); } public int getCurrentSharesPrice() { return ChannelServer.getInstance(1).getSharePrice(); } public int getDollars() { return getPlayer().getDollars(); } public int getShareLots() { return getPlayer().getShareLots(); } public void addDollars(int n) { getPlayer().addDollars(n); } public void addShareLots(int n) { getPlayer().addShareLots(n); } public void giveMountSkill(int itemId, int mountSkillId, long period) { giveMountSkill(itemId, mountSkillId, period, false); } public void giveMountSkill(int itemId, int mountSkillId, long period, boolean test) { if ((mountSkillId > 0) && (haveItem(itemId))) { if (test) { System.err.println(new StringBuilder().append("骑宠技能 - 1 ").append(mountSkillId).append(" LinkedMountItem: ").append(mountSkillId % 1000).toString()); } mountSkillId = mountSkillId > 80001000 ? mountSkillId : PlayerStats.getSkillByJob(mountSkillId, this.c.getPlayer().getJob()); int fk = GameConstants.getMountItem(mountSkillId, this.c.getPlayer()); if (test) { System.err.println(new StringBuilder().append("骑宠技能 - 2 ").append(mountSkillId).append(" 骑宠ID: ").append(fk).toString()); } if ((fk > 0) && (mountSkillId < 80001000)) { for (int i = 80001001; i < 80001999; i++) { Skill skill = SkillFactory.getSkill(i); if ((skill != null) && (GameConstants.getMountItem(skill.getId(), this.c.getPlayer()) == fk)) { mountSkillId = i; break; } } } if (test) { System.err.println(new StringBuilder().append("骑宠技能 - 3 ").append(mountSkillId).append(" 技能是否为空: ").append(SkillFactory.getSkill(mountSkillId) == null).append(" 骑宠: ").append(GameConstants.getMountItem(mountSkillId, this.c.getPlayer()) == 0).toString()); } if (this.c.getPlayer().getSkillLevel(mountSkillId) > 0) { this.c.getPlayer().dropMessage(1, new StringBuilder().append("您已经拥有了[").append(SkillFactory.getSkill(mountSkillId).getName()).append("]这个骑宠的技能,无法使用该道具。").toString()); } else if ((SkillFactory.getSkill(mountSkillId) == null) || (GameConstants.getMountItem(mountSkillId, this.c.getPlayer()) == 0)) { this.c.getPlayer().dropMessage(1, "暂时无法使用这个骑宠的技能."); } else if (period > 0L) { gainItem(itemId, (short) -1); this.c.getPlayer().changeSingleSkillLevel(SkillFactory.getSkill(mountSkillId), (byte) 1, (byte) 1, System.currentTimeMillis() + period * 24L * 60L * 60L * 1000L); this.c.getPlayer().dropMessage(1, new StringBuilder().append("恭喜您获得[").append(SkillFactory.getSkill(mountSkillId).getName()).append("]骑宠技能 ").append(period).append(" 权。").toString()); } else if (period == -1L) { gainItem(itemId, (short) -1); this.c.getPlayer().changeSingleSkillLevel(SkillFactory.getSkill(mountSkillId), (byte) 1, (byte) 1, -1L); this.c.getPlayer().dropMessage(1, new StringBuilder().append("恭喜您获得[").append(SkillFactory.getSkill(mountSkillId).getName()).append("]骑宠技能永久权。").toString()); } } else { this.c.getPlayer().dropMessage(1, new StringBuilder().append("暂时无法使用这个骑宠的技能\r\n我的道具ID为: ").append(itemId).toString()); } this.c.getSession().write(MaplePacketCreator.enableActions()); } public boolean checkLevelAndItem(int minLevel, int maxLevel, int itemId) { return checkLevelAndItem(minLevel, maxLevel, itemId, 2); } public boolean checkLevelAndItem(int minLevel, int maxLevel, int itemId, int minSize) { MapleParty party = this.c.getPlayer().getParty(); if ((party == null) || (party.getLeader().getId() != this.c.getPlayer().getId())) { this.c.getPlayer().dropMessage(5, "您没有队伍 或者 不是队长.."); return false; } int partySize = party.getMembers().size(); if (partySize < minSize) { this.c.getPlayer().dropMessage(5, new StringBuilder().append("队伍的人数成员不够 必须 ").append(minSize).append(" 人才可以开始组队任务,当前队伍人数: ").append(partySize).toString()); return false; } int chrSize = 0; for (MaplePartyCharacter partyPlayer : party.getMembers()) { MapleCharacter player = getPlayer().getMap().getCharacterById(partyPlayer.getId()); if (player == null) { this.c.getPlayer().dropMessage(5, new StringBuilder().append("队伍中的成员 ").append(partyPlayer.getName()).append(" 不在线 或者 不在同一地图.").toString()); } else if ((player.getLevel() < minLevel) || (player.getLevel() > maxLevel)) { this.c.getPlayer().dropMessage(5, new StringBuilder().append("队伍中的成员 ").append(partyPlayer.getName()).append(" 等级不符合要求.等级限制: Lv.").append(minLevel).append("~").append(maxLevel).toString()); } else if (!player.haveItem(itemId)) { this.c.getPlayer().dropMessage(5, new StringBuilder().append("队伍中的成员 ").append(partyPlayer.getName()).append(" 没有开始组队任务需要的道具.").toString()); } else { chrSize++; } } return partySize == chrSize; } public int getMin() { return Calendar.getInstance().get(Calendar.MINUTE); } public int getSec() { return Calendar.getInstance().get(Calendar.SECOND); } public void environmentChange(String env) { environmentChange(env, 2); } public void environmentChange(String env, int info) { environmentChange(false, env, info); } public void environmentChange(boolean broadcast, String env, int info) { if (broadcast) { c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.environmentChange(env, info)); } else { c.getSession().write(MaplePacketCreator.environmentChange(env, info)); } } public void sendchangeMap(int mapid) { final MapleMap mapto = c.getChannelServer().getMapFactory().getMap(mapid); c.getPlayer().changeMap(mapto, mapto.getPortal(0)); } public void directionEffect(String data, int value, int x, int y, int npc) { c.getSession().write(UIPacket.getDirectionEffect(data, value, x, y, npc)); } /** * 是否为新手 * @return */ public boolean isBeginner(){ return c.getPlayer().getJob() == MapleJob.新手.getId(); } public boolean isMagician(){ return c.getPlayer().getJob() == MapleJob.魔法师.getId();} @Override public void getDirectionInfo(byte type, int value) { super.getDirectionInfo(type, value); } @Override public void getDirectionInfoNew(byte type, int value) { super.getDirectionInfoNew(type, value); } @Override public void playMovie(String data, boolean show) { super.playMovie(data, show); } }