diff --git a/src/server/maps/MapleMap.java b/src/server/maps/MapleMap.java index aa30315856..131c94ffed 100644 --- a/src/server/maps/MapleMap.java +++ b/src/server/maps/MapleMap.java @@ -115,6 +115,7 @@ public class MapleMap { private Map droppedItems = new LinkedHashMap<>(); private LinkedList> registeredDrops = new LinkedList<>(); private Map mobLootEntries = new HashMap(20); + private List statUpdateRunnables = new ArrayList(50); private List areas = new ArrayList<>(); private MapleFootholdTree footholds = null; private Pair xLimits; // caches the min and max x's with available footholds @@ -150,6 +151,7 @@ public class MapleMap { private ScheduledFuture itemMonitor = null; private ScheduledFuture expireItemsTask = null; private ScheduledFuture mobSpawnLootTask = null; + private ScheduledFuture characterStatUpdateTask = null; private short itemMonitorTimeout; private Pair timeMob = null; private short mobInterval = 5000; @@ -779,6 +781,9 @@ public class MapleMap { mobSpawnLootTask.cancel(false); mobSpawnLootTask = null; } + + characterStatUpdateTask.cancel(false); + characterStatUpdateTask = null; } private void cleanItemMonitor() { @@ -856,6 +861,13 @@ public class MapleMap { } }, 200, 200); } + + characterStatUpdateTask = TimerManager.getInstance().register(new Runnable() { + @Override + public void run() { + runCharacterStatUpdate(); + } + }, 200, 200); itemMonitorTimeout = 1; } finally { @@ -3367,10 +3379,6 @@ public class MapleMap { return clock; } - public void addClock(int seconds) { - broadcastMessage(MaplePacketCreator.getClock(seconds)); - } - public void setTown(boolean isTown) { this.town = isTown; } @@ -4491,6 +4499,21 @@ public class MapleMap { return false; } + public void runCharacterStatUpdate() { + if (!statUpdateRunnables.isEmpty()) { + List toRun = new ArrayList<>(statUpdateRunnables); + statUpdateRunnables.clear(); + + for (Runnable r : toRun) { + r.run(); + } + } + } + + public void registerCharacterStatUpdate(Runnable r) { + statUpdateRunnables.add(r); + } + public void dispose() { for(MapleMonster mm : this.getAllMonsters()) { mm.dispose(); @@ -4527,6 +4550,11 @@ public class MapleMap { mobSpawnLootTask.cancel(false); mobSpawnLootTask = null; } + + if(characterStatUpdateTask != null) { + characterStatUpdateTask.cancel(false); + characterStatUpdateTask = null; + } } finally { chrWLock.unlock(); } diff --git a/src/server/partyquest/MonsterCarnival.java b/src/server/partyquest/MonsterCarnival.java index 5fde37b3a4..45d234dbf9 100644 --- a/src/server/partyquest/MonsterCarnival.java +++ b/src/server/partyquest/MonsterCarnival.java @@ -356,7 +356,9 @@ public class MonsterCarnival { chrMap.dropMessage(5, LanguageConstants.Languages(chrMap).CPQExtendTime); } startTime = System.currentTimeMillis() + 3 * 60 * 1000; - map.addClock(3 * 60); + + map.broadcastMessage(MaplePacketCreator.getClock(3 * 60)); + timer = TimerManager.getInstance().schedule(new Runnable() { @Override public void run() {