package scripting.event; import client.MapleCharacter; import client.MapleQuestStatus; import client.SkillFactory; import handling.channel.ChannelServer; import handling.world.WrodlPartyService; import handling.world.party.MapleParty; import handling.world.party.MaplePartyCharacter; import handling.world.party.PartySearch; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.script.ScriptException; import org.apache.log4j.Logger; import server.MapleCarnivalParty; import server.MapleItemInformationProvider; import server.Timer.EventTimer; import server.life.MapleMonster; import server.maps.MapleMap; import server.maps.MapleMapFactory; import server.quest.MapleQuest; import server.squad.MapleSquad; import tools.FileoutputUtil; import tools.MaplePacketCreator; import tools.Pair; import tools.packet.UIPacket; public class EventInstanceManager { private List<MapleCharacter> chars = new LinkedList(); private List<Integer> dced = new LinkedList(); private List<MapleMonster> mobs = new LinkedList(); private Map<Integer, Integer> killCount = new HashMap(); private final EventManager em; private final int channel; private final String name; private Properties props = new Properties(); private long timeStarted = 0L; private long eventTime = 0L; private List<Integer> mapIds = new LinkedList(); private List<Boolean> isInstanced = new LinkedList(); private ScheduledFuture<?> eventTimer; private final ReentrantReadWriteLock mutex = new ReentrantReadWriteLock(); private final Lock rL = this.mutex.readLock(); private final Lock wL = this.mutex.writeLock(); private boolean disposed = false; private static final Logger log = Logger.getLogger(EventInstanceManager.class); public EventInstanceManager(EventManager em, String name, int channel) { this.em = em; this.name = name; this.channel = channel; } /** * 注册角色 * @param chr */ public void registerPlayer(MapleCharacter chr) { if ((this.disposed) || (chr == null)) { return; } try { this.wL.lock(); try { this.chars.add(chr); } finally { this.wL.unlock(); } chr.setEventInstance(this); this.em.getIv().invokeFunction("playerEntry", new Object[]{this, chr}); } catch (NullPointerException ex) { FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerEntry:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerEntry:\r\n").append(ex).toString()); } } /** * 玩家换地图 * @param chr * @param mapid */ public void changedMap(MapleCharacter chr, int mapid) { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("changedMap", new Object[]{this, chr, mapid}); } catch (NullPointerException npe) { } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : changedMap:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : changedMap:\r\n").append(ex).toString()); } } public void timeOut(long delay, final EventInstanceManager eim) { if ((this.disposed) || (eim == null)) { return; } this.eventTimer = EventTimer.getInstance().schedule(new Runnable() { @Override public void run() { if ((EventInstanceManager.this.disposed) || (eim == null) || (EventInstanceManager.this.em == null)) { return; } try { EventInstanceManager.this.em.getIv().invokeFunction("scheduledTimeout", new Object[]{eim}); } catch (ScriptException | NoSuchMethodException ex) { EventInstanceManager.log.error("Event name" + EventInstanceManager.this.em.getName() + ", Instance name : " + EventInstanceManager.this.name + ", method Name : scheduledTimeout:\r\n" + ex); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, "Event name" + EventInstanceManager.this.em.getName() + ", Instance name : " + EventInstanceManager.this.name + ", method Name : scheduledTimeout:\r\n" + ex); } } }, delay); } public void stopEventTimer() { this.eventTime = 0L; this.timeStarted = 0L; if (this.eventTimer != null) { this.eventTimer.cancel(false); } } public void restartEventTimer(long time) { try { if (this.disposed) { return; } this.timeStarted = System.currentTimeMillis(); this.eventTime = time; if (this.eventTimer != null) { this.eventTimer.cancel(false); } this.eventTimer = null; int timesend = (int) time / 1000; for (MapleCharacter chr : getPlayers()) { if (this.name.startsWith("PVP")) { chr.getClient().getSession().write(MaplePacketCreator.getPVPClock(Integer.parseInt(getProperty("type")), timesend)); } else { chr.getClient().getSession().write(MaplePacketCreator.getClock(timesend)); } } timeOut(time, this); } catch (NumberFormatException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : restartEventTimer:\r\n").append(ex).toString()); FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } } public void startEventTimer(long time) { restartEventTimer(time); } public void startEventClock(long time) { if (this.disposed) { return; } int timesend = (int) time / 1000; for (MapleCharacter chr : getPlayers()) { chr.getClient().getSession().write(MaplePacketCreator.getClock(timesend)); } } public void stopEventClock() { if (this.disposed) { return; } for (MapleCharacter chr : getPlayers()) { chr.getClient().getSession().write(MaplePacketCreator.stopClock()); } } public boolean isTimerStarted() { return (this.eventTime > 0L) && (this.timeStarted > 0L); } public long getTimeLeft() { return this.eventTime - (System.currentTimeMillis() - this.timeStarted); } public void registerParty(MapleParty party, MapleMap map) { if (this.disposed) { return; } for (MaplePartyCharacter pc : party.getMembers()) { registerPlayer(map.getCharacterById(pc.getId())); } PartySearch ps = WrodlPartyService.getInstance().getSearch(party); if (ps != null) { WrodlPartyService.getInstance().removeSearch(ps, "开始组队任务,组队广告已被删除。"); } } public void unregisterPlayer(MapleCharacter chr) { if (this.disposed) { chr.setEventInstance(null); return; } this.wL.lock(); try { unregisterPlayer_NoLock(chr); } finally { this.wL.unlock(); } } private boolean unregisterPlayer_NoLock(MapleCharacter chr) { if (this.name.equals("CWKPQ")) { MapleSquad squad = ChannelServer.getInstance(this.channel).getMapleSquad("CWKPQ"); if (squad != null) { squad.removeMember(chr.getName()); if (squad.getLeaderName().equals(chr.getName())) { this.em.setProperty("leader", "false"); } } } chr.setEventInstance(null); if (this.disposed) { return false; } if (this.chars.contains(chr)) { this.chars.remove(chr); return true; } return false; } public boolean disposeIfPlayerBelow(byte size, int towarp) { if (this.disposed) { return true; } MapleMap map = null; if (towarp > 0) { map = getMapFactory().getMap(towarp); } this.wL.lock(); try { if ((this.chars != null) && (this.chars.size() <= size)) { List<MapleCharacter> chrs = new LinkedList(this.chars); for (MapleCharacter chr : chrs) { if (chr == null) { continue; } unregisterPlayer_NoLock(chr); if (towarp > 0 && map != null) { chr.changeMap(map, map.getPortal(0)); } } dispose_NoLock(); return true; } } catch (Exception ex) { FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } finally { this.wL.unlock(); } return false; } public void saveBossQuest(int points) { if (this.disposed) { return; } for (MapleCharacter chr : getPlayers()) { MapleQuestStatus record = chr.getQuestNAdd(MapleQuest.getInstance(150001)); if (record.getCustomData() != null) { record.setCustomData(String.valueOf(points + Integer.parseInt(record.getCustomData()))); } else { record.setCustomData(String.valueOf(points)); } chr.modifyCSPoints(2, points / 5, true); } } public void saveNX(int points) { if (this.disposed) { return; } for (MapleCharacter chr : getPlayers()) { chr.modifyCSPoints(2, points, true); } } public void EventGainNX() { if (this.disposed) { return; } int averlevel = 0; Iterator<MapleCharacter> partyer = getPlayers().iterator(); while (partyer.hasNext()) { MapleCharacter i = partyer.next(); averlevel += i.getLevel(); } for (MapleCharacter chr : getPlayers()) { chr.modifyCSPoints(1, averlevel / 250 * 1000, true); } } public List<MapleCharacter> getPlayers() { if (this.disposed) { return Collections.emptyList(); } this.rL.lock(); try { LinkedList localLinkedList = new LinkedList(this.chars); return localLinkedList; } finally { this.rL.unlock(); } } public List<Integer> getDisconnected() { return this.dced; } public int getPlayerCount() { if (this.disposed) { return 0; } return this.chars.size(); } /** * 注册一个怪物 * @param mob */ public void registerMonster(MapleMonster mob) { if (this.disposed) { return; } this.mobs.add(mob); mob.setEventInstance(this); } public void unregisterMonster(MapleMonster mob) { mob.setEventInstance(null); if (this.disposed) { return; } if (this.mobs.contains(mob)) { this.mobs.remove(mob); } if (this.mobs.isEmpty()) { try { this.em.getIv().invokeFunction("allMonstersDead", new Object[]{this}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : allMonstersDead:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : allMonstersDead:\r\n").append(ex).toString()); } } } public void playerKilled(MapleCharacter chr) { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("playerDead", new Object[]{this, chr}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerDead:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerDead:\r\n").append(ex).toString()); } } public boolean revivePlayer(MapleCharacter chr) { if (this.disposed) { return false; } try { Object b = this.em.getIv().invokeFunction("playerRevive", new Object[]{this, chr}); if ((b instanceof Boolean)) { return ((Boolean) b); } } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerRevive:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerRevive:\r\n").append(ex).toString()); } return true; } public void playerDisconnected(MapleCharacter chr, int idz) { if (this.disposed) { return; } byte ret; try { ret = ((Double) this.em.getIv().invokeFunction("playerDisconnected", new Object[]{this, chr})).byteValue(); } catch (ScriptException | NoSuchMethodException e) { ret = 0; } this.wL.lock(); try { if (this.disposed) { return; } if ((chr == null) || (chr.isAlive())) { this.dced.add(idz); } if (chr != null) { unregisterPlayer_NoLock(chr); } if (ret == 0) { if (getPlayerCount() <= 0) { dispose_NoLock(); } } else if (((ret > 0) && (getPlayerCount() < ret)) || ((ret < 0) && ((isLeader(chr)) || (getPlayerCount() < ret * -1)))) { List<MapleCharacter> chrs = new LinkedList(this.chars); for (MapleCharacter player : chrs) { if (player.getId() != idz) { removePlayer(player); } } dispose_NoLock(); } } catch (Exception ex) { FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } finally { this.wL.unlock(); } } public void monsterKilled(MapleCharacter chr, MapleMonster mob) { if (this.disposed) { return; } try { int inc = ((Double) this.em.getIv().invokeFunction("monsterValue", new Object[]{this, mob.getId()})).intValue(); if ((this.disposed) || (chr == null)) { return; } Integer kc = this.killCount.get(Integer.valueOf(chr.getId())); if (kc == null) { kc = inc; } else { kc = kc + inc; } this.killCount.put(chr.getId(), kc); if ((chr.getCarnivalParty() != null) && ((mob.getStats().getPoint() > 0) || (mob.getStats().getCP() > 0))) { this.em.getIv().invokeFunction("monsterKilled", new Object[]{this, chr, mob.getStats().getCP() > 0 ? mob.getStats().getCP() : mob.getStats().getPoint()}); } } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em == null ? "null" : this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : monsterValue:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em == null ? "null" : this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : monsterValue:\r\n").append(ex).toString()); } catch (Exception ex) { FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } } public void monsterDamaged(MapleCharacter chr, MapleMonster mob, int damage) { if ((this.disposed) || (mob.getId() != 9700037)) { return; } try { this.em.getIv().invokeFunction("monsterDamaged", new Object[]{this, chr, mob.getId(), damage}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em == null ? "null" : this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : monsterValue:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em == null ? "null" : this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : monsterValue:\r\n").append(ex).toString()); } catch (Exception ex) { FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } } public void addPVPScore(MapleCharacter chr, int score) { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("addPVPScore", new Object[]{this, chr, score}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em == null ? "null" : this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : monsterValue:\r\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em == null ? "null" : this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : monsterValue:\r\n").append(ex).toString()); } catch (Exception ex) { FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } } public int getKillCount(MapleCharacter chr) { if (this.disposed) { return 0; } Integer kc = this.killCount.get(Integer.valueOf(chr.getId())); if (kc == null) { return 0; } return kc; } public void dispose_NoLock() { if ((this.disposed) || (this.em == null)) { return; } String emName = this.em.getName(); try { this.disposed = true; for (MapleCharacter chr : this.chars) { chr.setEventInstance(null); } this.chars.clear(); this.chars = null; if (this.mobs.size() >= 1) { for (MapleMonster mob : this.mobs) { if (mob != null) { mob.setEventInstance(null); } } } this.mobs.clear(); this.mobs = null; this.killCount.clear(); this.killCount = null; this.dced.clear(); this.dced = null; this.timeStarted = 0L; this.eventTime = 0L; this.props.clear(); this.props = null; for (int i = 0; i < this.mapIds.size(); i++) { if ((this.isInstanced.get(i))) { getMapFactory().removeInstanceMap((this.mapIds.get(i))); } } this.mapIds.clear(); this.mapIds = null; this.isInstanced.clear(); this.isInstanced = null; this.em.disposeInstance(this.name); } catch (Exception e) { log.error(new StringBuilder().append("Caused by : ").append(emName).append(" instance name: ").append(this.name).append(" method: dispose:").toString()); FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, e); } } public void dispose() { this.wL.lock(); try { dispose_NoLock(); } finally { this.wL.unlock(); } } public ChannelServer getChannelServer() { return ChannelServer.getInstance(this.channel); } public List<MapleMonster> getMobs() { return this.mobs; } public void broadcastPlayerMsg(int type, String msg) { if (this.disposed) { return; } for (MapleCharacter chr : getPlayers()) { chr.dropMessage(type, msg); } } public List<Pair<Integer, String>> newPair() { return new ArrayList(); } public void addToPair(List<Pair<Integer, String>> e, int e1, String e2) { e.add(new Pair(e1, e2)); } public List<Pair<Integer, MapleCharacter>> newPair_chr() { return new ArrayList(); } public void addToPair_chr(List<Pair<Integer, MapleCharacter>> e, int e1, MapleCharacter e2) { e.add(new Pair(e1, e2)); } public void broadcastPacket(byte[] packet) { if (this.disposed) { return; } for (MapleCharacter chr : getPlayers()) { chr.getClient().getSession().write(packet); } } public void broadcastTeamPacket(byte[] packet, int team) { if (this.disposed) { return; } for (MapleCharacter chr : getPlayers()) { if (chr.getTeam() == team) { chr.getClient().getSession().write(packet); } } } /** * 创建一个地图实例 * @param mapid * @return */ public MapleMap createInstanceMap(int mapid) { if (this.disposed) { return null; } int assignedid = EventScriptManager.getNewInstanceMapId(); this.mapIds.add(assignedid); this.isInstanced.add(true); return getMapFactory().CreateInstanceMap(mapid, true, true, true, assignedid); } public MapleMap createInstanceMapS(int mapid) { if (this.disposed) { return null; } int assignedid = EventScriptManager.getNewInstanceMapId(); this.mapIds.add(assignedid); this.isInstanced.add(true); return getMapFactory().CreateInstanceMap(mapid, false, false, false, assignedid); } public MapleMap setInstanceMap(int mapid) { if (this.disposed) { return getMapFactory().getMap(mapid); } this.mapIds.add(mapid); this.isInstanced.add(false); return getMapFactory().getMap(mapid); } public MapleMapFactory getMapFactory() { return getChannelServer().getMapFactory(); } public MapleMap getMapInstance(int args) { if (this.disposed) { return null; } try { boolean instanced = false; int trueMapID; if (args >= this.mapIds.size()) { trueMapID = args; } else { trueMapID = (this.mapIds.get(args)); instanced = (this.isInstanced.get(args)); } MapleMap map; if (!instanced) { map = getMapFactory().getMap(trueMapID); if (map == null) { return null; } if ((map.getCharactersSize() == 0) && (this.em.getProperty("shuffleReactors") != null) && (this.em.getProperty("shuffleReactors").equals("true"))) { map.shuffleReactors(); } } else { map = getMapFactory().getInstanceMap(trueMapID); if (map == null) { return null; } if ((map.getCharactersSize() == 0) && (this.em.getProperty("shuffleReactors") != null) && (this.em.getProperty("shuffleReactors").equals("true"))) { map.shuffleReactors(); } } return map; } catch (NullPointerException ex) { FileoutputUtil.outputFileError(FileoutputUtil.Event_ScriptEx_Log, ex); } return null; } public void schedule(final String methodName, long delay) { if (this.disposed) { return; } EventTimer.getInstance().schedule(new Runnable() { @Override public void run() { if ((EventInstanceManager.this.disposed) || (EventInstanceManager.this == null) || (EventInstanceManager.this.em == null)) { return; } try { EventInstanceManager.this.em.getIv().invokeFunction(methodName, new Object[]{EventInstanceManager.this}); } catch (NullPointerException npe) { } catch (ScriptException | NoSuchMethodException ex) { EventInstanceManager.log.error("Event name" + EventInstanceManager.this.em.getName() + ", Instance name : " + EventInstanceManager.this.name + ", method Name : " + methodName + ":\n" + ex); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, "Event name" + EventInstanceManager.this.em.getName() + ", Instance name : " + EventInstanceManager.this.name + ", method Name(schedule) : " + methodName + " :\n" + ex); } } }, delay*1000); } public String getName() { return this.name; } public void setProperty(String key, String value) { if (this.disposed) { return; } this.props.setProperty(key, value); } public Object setProperty(String key, String value, boolean prev) { if (this.disposed) { return null; } return this.props.setProperty(key, value); } public String getProperty(String key) { if (this.disposed) { return ""; } return this.props.getProperty(key); } public Properties getProperties() { return this.props; } public void leftParty(MapleCharacter chr) { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("leftParty", new Object[]{this, chr}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : leftParty:\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : leftParty:\n").append(ex).toString()); } } public void disbandParty() { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("disbandParty", new Object[]{this}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : disbandParty:\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : disbandParty:\n").append(ex).toString()); } } public void finishPQ() { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("clearPQ", new Object[]{this}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : clearPQ:\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : clearPQ:\n").append(ex).toString()); } } public void removePlayer(MapleCharacter chr) { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("playerExit", new Object[]{this, chr}); } catch (ScriptException | NoSuchMethodException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerExit:\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : playerExit:\n").append(ex).toString()); } } public void registerCarnivalParty(MapleCharacter leader, MapleMap map, byte team) { if (this.disposed) { return; } leader.clearCarnivalRequests(); List characters = new LinkedList(); MapleParty party = leader.getParty(); if (party == null) { return; } for (MaplePartyCharacter pc : party.getMembers()) { MapleCharacter c = map.getCharacterById(pc.getId()); if (c != null) { characters.add(c); registerPlayer(c); c.resetCP(); } } PartySearch ps = WrodlPartyService.getInstance().getSearch(party); if (ps != null) { WrodlPartyService.getInstance().removeSearch(ps, "The Party Listing has been removed because the Party Quest started."); } MapleCarnivalParty carnivalParty = new MapleCarnivalParty(leader, characters, team); try { this.em.getIv().invokeFunction("registerCarnivalParty", new Object[]{this, carnivalParty}); } catch (ScriptException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : registerCarnivalParty:\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : registerCarnivalParty:\n").append(ex).toString()); } catch (NoSuchMethodException ex) { } } public void onMapLoad(MapleCharacter chr) { if (this.disposed) { return; } try { this.em.getIv().invokeFunction("onMapLoad", new Object[]{this, chr}); } catch (ScriptException ex) { log.error(new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : onMapLoad:\n").append(ex).toString()); FileoutputUtil.log(FileoutputUtil.Event_ScriptEx_Log, new StringBuilder().append("Event name").append(this.em.getName()).append(", Instance name : ").append(this.name).append(", method Name : onMapLoad:\n").append(ex).toString()); } catch (NoSuchMethodException ex) { } } public boolean isLeader(MapleCharacter chr) { return (chr != null) && (chr.getParty() != null) && (chr.getParty().getLeader().getId() == chr.getId()); } public void registerSquad(MapleSquad squad, MapleMap map, int questID) { if (this.disposed) { return; } int mapid = map.getId(); for (String chr : squad.getMembers()) { MapleCharacter player = squad.getChar(chr); if ((player != null) && (player.getMapId() == mapid)) { if (questID > 0) { player.getQuestNAdd(MapleQuest.getInstance(questID)).setCustomData(String.valueOf(System.currentTimeMillis())); } registerPlayer(player); if (player.getParty() != null) { PartySearch ps = WrodlPartyService.getInstance().getSearch(player.getParty()); if (ps != null) { WrodlPartyService.getInstance().removeSearch(ps, "开始组队任务,组队广告已被删除。"); } } } } squad.setStatus((byte) 2); squad.getBeginMap().broadcastMessage(MaplePacketCreator.stopClock()); } public void registerSquad(MapleSquad squad, MapleMap map, String bossid) { if (this.disposed) { return; } int mapid = map.getId(); for (String chr : squad.getMembers()) { MapleCharacter player = squad.getChar(chr); if ((player != null) && (player.getMapId() == mapid)) { if (bossid != null) { player.setPQLog(bossid); } registerPlayer(player); if (player.getParty() != null) { PartySearch ps = WrodlPartyService.getInstance().getSearch(player.getParty()); if (ps != null) { WrodlPartyService.getInstance().removeSearch(ps, "开始组队任务,组队广告已被删除。"); } } } } squad.setStatus((byte) 2); squad.getBeginMap().broadcastMessage(MaplePacketCreator.stopClock()); } public boolean isDisconnected(MapleCharacter chr) { if (this.disposed) { return false; } return this.dced.contains(chr.getId()); } public void removeDisconnected(int id) { if (this.disposed) { return; } if (this.dced.contains(id)) { this.dced.remove(id); } } public EventManager getEventManager() { return this.em; } public void applyBuff(MapleCharacter chr, int id) { MapleItemInformationProvider.getInstance().getItemEffect(id).applyTo(chr); } public void applySkill(MapleCharacter chr, int id) { SkillFactory.getSkill(id).getEffect(1).applyTo(chr); } }