Index: D:/dev/L2_GameServer_t1_clean/java/net/sf/l2j/gameserver/GameTimeController.java =================================================================== --- D:/dev/L2_GameServer_t1_clean/java/net/sf/l2j/gameserver/GameTimeController.java (revision 1711) +++ D:/dev/L2_GameServer_t1_clean/java/net/sf/l2j/gameserver/GameTimeController.java (working copy) @@ -16,10 +16,12 @@ import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Map; import java.util.concurrent.ScheduledFuture; import java.util.logging.Logger; import javolution.util.FastList; +import javolution.util.FastMap; import net.sf.l2j.gameserver.ai.CtrlEvent; import net.sf.l2j.gameserver.instancemanager.DayNightSpawnManager; import net.sf.l2j.gameserver.model.L2Character; @@ -42,7 +44,7 @@ protected static long _gameStartTime; protected static boolean _isNight = false; - private static FastList _movingObjects = new FastList(); + private static Map _movingObjects = new FastMap().setShared(true); protected static TimerThread _timer; private ScheduledFuture _timerWatcher; @@ -95,10 +97,7 @@ public void registerMovingObject(L2Character cha) { if(cha == null) return; - synchronized (_movingObjects) - { - if (!_movingObjects.contains(cha)) _movingObjects.add(cha); - } + if (!_movingObjects.containsKey(cha.getObjectId())) _movingObjects.put(cha.getObjectId(),cha); } /** @@ -120,35 +119,29 @@ FastList ended = null; // Go throw the table containing L2Character in movement - synchronized (_movingObjects) - { - for (FastList.Node ch = _movingObjects.head(), e = _movingObjects.tail(); (ch = ch.getNext()) != e;) + for (L2Character ch: _movingObjects.values()) { - - L2Character cha = ch.getValue(); - // If movement is finished, the L2Character is removed from // movingObjects and added to the ArrayList ended - if (cha != null) - if (cha.updatePosition(_gameTicks)) + if (ch != null) + if (ch.updatePosition(_gameTicks)) { - ch = ch.getPrevious(); - _movingObjects.remove(cha); if (ended == null) ended = new FastList(); - ended.add(cha); + ended.add(ch); } } - } + if (ended != null) _movingObjects.values().removeAll(ended); // Create a task to update the _knownObject and _knowPlayers of each L2Character that finished its movement and of their already known L2Object // then notify AI with EVT_ARRIVED // KnownObjects updates is kinda expensive operation, so i splited tasks to avoid blocking of too many parts of code (Julian) // TODO: maybe a general TP is needed for that kinda stuff (all knownlist updates should be done in a TP anyway). if (ended != null) { - for (FastList.Node ch = ended.head(), e = ended.tail(); (ch = ch.getNext()) != e;) - ThreadPoolManager.getInstance().executeTask(new MovingObjectArrived(ch.getValue())); + for (L2Character ch: ended) + if (ch != null) // Disconnected? + ThreadPoolManager.getInstance().executeTask(new MovingObjectArrived(ch)); ended.clear(); } @@ -203,6 +196,7 @@ catch (Exception e) { _error = e; + e.printStackTrace(); } } } @@ -244,6 +238,7 @@ } catch (NullPointerException e) { + e.printStackTrace(); } } }