Browse Source

L2World maps(_allPlayers, _allObjects, _petsInstance) reworked. They are now TIntObjectHashMap surrounded by ReentrantReadWriteLock working as synchronization. Keep in mind that FastMap<K,V>.shared() drains a lot of CPU usage, because the whole map is filled with synchronizations. ReentrantLock is much faster than synchronized and it does the same job, even better.
Generally this change is to optimize CPU Usage, memory usage and prevent some deadlocks. Big servers will easily notice the change.

Nik 13 years ago
parent
commit
a731a3de61
18 changed files with 583 additions and 213 deletions
  1. 1 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/LoginServerThread.java
  2. 60 29
      L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSigns.java
  3. 22 18
      L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSignsFestival.java
  4. 12 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/Shutdown.java
  5. 4 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java
  6. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/OfflineTradersTable.java
  7. 40 37
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/BoatManager.java
  8. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/TerritoryWarManager.java
  9. 12 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java
  10. 291 51
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2World.java
  11. 23 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleTeleporterInstance.java
  12. 24 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherNpcInstance.java
  13. 17 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Fort.java
  14. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/L2Event.java
  15. 16 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java
  16. 18 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java
  17. 38 14
      L2J_Server_BETA/java/com/l2jserver/gameserver/util/Broadcast.java
  18. 2 5
      L2J_Server_BETA/java/com/l2jserver/status/GameStatusThread.java

+ 1 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/LoginServerThread.java

@@ -32,7 +32,6 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Level;
@@ -292,10 +291,9 @@ public class LoginServerThread extends Thread
 							if (L2World.getInstance().getAllPlayersCount() > 0)
 							if (L2World.getInstance().getAllPlayersCount() > 0)
 							{
 							{
 								FastList<String> playerList = new FastList<String>();
 								FastList<String> playerList = new FastList<String>();
-								Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
 								//synchronized (L2World.getInstance().getAllPlayers())
 								//synchronized (L2World.getInstance().getAllPlayers())
 								{
 								{
-									for (L2PcInstance player : pls)
+									for (L2PcInstance player : L2World.getInstance().getAllPlayersArray())
 										playerList.add(player.getAccountName());
 										playerList.add(player.getAccountName());
 								}
 								}
 								PlayerInGame pig = new PlayerInGame(playerList);
 								PlayerInGame pig = new PlayerInGame(playerList);

+ 60 - 29
L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSigns.java

@@ -14,12 +14,13 @@
  */
  */
 package com.l2jserver.gameserver;
 package com.l2jserver.gameserver;
 
 
+import gnu.trove.TObjectProcedure;
+
 import java.sql.Connection;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.SQLException;
 import java.util.Calendar;
 import java.util.Calendar;
-import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Level;
@@ -1383,20 +1384,28 @@ public class SevenSigns
 	 */
 	 */
 	protected void teleLosingCabalFromDungeons(String compWinner)
 	protected void teleLosingCabalFromDungeons(String compWinner)
 	{
 	{
-		Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-		//synchronized (L2World.getInstance().getAllPlayers())
+		L2World.getInstance().forEachPlayer(new teleLosingCabalFromDungeons(compWinner));
+	}
+	
+	private final class teleLosingCabalFromDungeons implements TObjectProcedure<L2PcInstance>
+	{
+		private final String _cmpWinner;
+		
+		private teleLosingCabalFromDungeons(final String compWinner)
+		{
+			_cmpWinner = compWinner;
+		}
+		
+		@Override
+		public final boolean execute(final L2PcInstance onlinePlayer)
 		{
 		{
-			StatsSet currPlayer;
-			for (L2PcInstance onlinePlayer : pls)
+			if (onlinePlayer != null)
 			{
 			{
-				if (onlinePlayer == null)
-					continue;
-				
-				currPlayer = _signsPlayerData.get(onlinePlayer.getObjectId());
+				StatsSet currPlayer = _signsPlayerData.get(onlinePlayer.getObjectId());
 				
 				
 				if (isSealValidationPeriod() || isCompResultsPeriod())
 				if (isSealValidationPeriod() || isCompResultsPeriod())
 				{
 				{
-					if (!onlinePlayer.isGM() && onlinePlayer.isIn7sDungeon() && (currPlayer == null || !currPlayer.getString("cabal").equals(compWinner)))
+					if (!onlinePlayer.isGM() && onlinePlayer.isIn7sDungeon() && (currPlayer == null || !currPlayer.getString("cabal").equals(_cmpWinner)))
 					{
 					{
 						onlinePlayer.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 						onlinePlayer.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 						onlinePlayer.setIsIn7sDungeon(false);
 						onlinePlayer.setIsIn7sDungeon(false);
@@ -1413,6 +1422,8 @@ public class SevenSigns
 					}
 					}
 				}
 				}
 			}
 			}
+			
+			return true;
 		}
 		}
 	}
 	}
 	
 	
@@ -1574,33 +1585,53 @@ public class SevenSigns
 	
 	
 	public void giveCPMult(int StrifeOwner)
 	public void giveCPMult(int StrifeOwner)
 	{
 	{
-		int cabal;
-		//Gives "Victor of War" passive skill to all online characters with Cabal, which controls Seal of Strife
-		for (L2PcInstance character : L2World.getInstance().getAllPlayers().values())
+		L2World.getInstance().forEachPlayer(new giveCPMult(StrifeOwner));
+	}
+	
+	private final class giveCPMult implements TObjectProcedure<L2PcInstance>
+	{
+		private final int _strifeOwner;
+		
+		private giveCPMult(int strifeOwner)
+		{
+			_strifeOwner = strifeOwner;
+		}
+		@Override
+		public final boolean execute(final L2PcInstance character)
 		{
 		{
-			if (character == null)
-				continue;
+			if (character != null)
+			{
+				//Gives "Victor of War" passive skill to all online characters with Cabal, which controls Seal of Strife
+				int cabal = getPlayerCabal(character.getObjectId());
+				if (cabal != SevenSigns.CABAL_NULL)
+					if (cabal == _strifeOwner)
+						character.addSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill());
+					else
+						//Gives "The Vanquished of War" passive skill to all online characters with Cabal, which does not control Seal of Strife
+						character.addSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill());
+			}
 			
 			
-			cabal = getPlayerCabal(character.getObjectId());
-			if (cabal != SevenSigns.CABAL_NULL)
-				if (cabal == StrifeOwner)
-					character.addSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill());
-				else
-					//Gives "The Vanquished of War" passive skill to all online characters with Cabal, which does not control Seal of Strife
-					character.addSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill());
+			return true;
 		}
 		}
 	}
 	}
 	
 	
 	public void removeCPMult()
 	public void removeCPMult()
 	{
 	{
-		for (L2PcInstance character : L2World.getInstance().getAllPlayers().values())
+		L2World.getInstance().forEachPlayer(new removeCPMult());
+	}
+	
+	private final class removeCPMult implements TObjectProcedure<L2PcInstance>
+	{	
+		@Override
+		public final boolean execute(final L2PcInstance character)
 		{
 		{
-			if (character == null)
-				continue;
-			
-			//Remove SevenSigns' buffs/debuffs.
-			character.removeSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill());
-			character.removeSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill());
+			if (character != null)
+			{
+				//Remove SevenSigns' buffs/debuffs.
+				character.removeSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill());
+				character.removeSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill());
+			}
+			return true;
 		}
 		}
 	}
 	}
 	
 	

+ 22 - 18
L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSignsFestival.java

@@ -14,12 +14,13 @@
  */
  */
 package com.l2jserver.gameserver;
 package com.l2jserver.gameserver;
 
 
+import gnu.trove.TObjectProcedure;
+
 import java.sql.Connection;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledFuture;
@@ -1251,23 +1252,7 @@ public class SevenSignsFestival implements SpawnListener
 		saveFestivalData(updateSettings);
 		saveFestivalData(updateSettings);
 		
 		
 		// Remove any unused blood offerings from online players.
 		// Remove any unused blood offerings from online players.
-		Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-		//synchronized (L2World.getInstance().getAllPlayers())
-		{
-			for (L2PcInstance onlinePlayer : pls)
-			{
-				try
-				{
-					L2ItemInstance bloodOfferings = onlinePlayer.getInventory().getItemByItemId(FESTIVAL_OFFERING_ID);
-					
-					if (bloodOfferings != null)
-						onlinePlayer.destroyItem("SevenSigns", bloodOfferings, null, false);
-				}
-				catch (NullPointerException e)
-				{
-				}
-			}
-		}
+		L2World.getInstance().forEachPlayer(new ForEachPlayerRemoveUnusedBloodOfferings());
 		
 		
 		_log.info("SevenSignsFestival: Reinitialized engine for next competition period.");
 		_log.info("SevenSignsFestival: Reinitialized engine for next competition period.");
 	}
 	}
@@ -2450,6 +2435,25 @@ public class SevenSignsFestival implements SpawnListener
 		}
 		}
 	}
 	}
 	
 	
+	private final class ForEachPlayerRemoveUnusedBloodOfferings implements TObjectProcedure<L2PcInstance>
+	{	
+		@Override
+		public final boolean execute(final L2PcInstance onlinePlayer)
+		{
+			try
+			{
+				L2ItemInstance bloodOfferings = onlinePlayer.getInventory().getItemByItemId(FESTIVAL_OFFERING_ID);
+				
+				if (bloodOfferings != null)
+					onlinePlayer.destroyItem("SevenSigns", bloodOfferings, null, false);
+			}
+			catch (NullPointerException e)
+			{
+			}
+			return true;
+		}
+	}
+	
 	@SuppressWarnings("synthetic-access")
 	@SuppressWarnings("synthetic-access")
 	private static class SingletonHolder
 	private static class SingletonHolder
 	{
 	{

+ 12 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/Shutdown.java

@@ -14,7 +14,8 @@
  */
  */
 package com.l2jserver.gameserver;
 package com.l2jserver.gameserver;
 
 
-import java.util.Collection;
+import gnu.trove.TObjectProcedure;
+
 import java.util.logging.Level;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.Logger;
 
 
@@ -576,13 +577,16 @@ public class Shutdown extends Thread
 	 */
 	 */
 	private void disconnectAllCharacters()
 	private void disconnectAllCharacters()
 	{
 	{
-		Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-		//synchronized (L2World.getInstance().getAllPlayers())
+		L2World.getInstance().forEachPlayer(new disconnectAllCharacters());
+	}
+	
+	private final class disconnectAllCharacters implements TObjectProcedure<L2PcInstance>
+	{
+		@Override
+		public final boolean execute(final L2PcInstance player)
 		{
 		{
-			for (L2PcInstance player : pls)
+			if (player != null)
 			{
 			{
-				if (player == null)
-					continue;
 				//Logout Character
 				//Logout Character
 				try
 				try
 				{
 				{
@@ -597,9 +601,10 @@ public class Shutdown extends Thread
 				}
 				}
 				catch (Throwable t)
 				catch (Throwable t)
 				{
 				{
-					_log.log(Level.WARNING, "Failed logour char "+player, t);
+					_log.log(Level.WARNING, "Failed logour char " + player, t);
 				}
 				}
 			}
 			}
+			return true;
 		}
 		}
 	}
 	}
 	
 	

+ 4 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java

@@ -272,12 +272,11 @@ public class RegionBBSManager extends BaseBBSManager
 		return SingletonHolder._instance;
 		return SingletonHolder._instance;
 	}
 	}
 	
 	
-	public /*synchronized */ void changeCommunityBoard()
+	public/*synchronized */void changeCommunityBoard()
 	{
 	{
 		FastList<L2PcInstance> sortedPlayers = new FastList<L2PcInstance>();
 		FastList<L2PcInstance> sortedPlayers = new FastList<L2PcInstance>();
-		sortedPlayers.addAll(L2World.getInstance().getAllPlayers().values());
-		
-		Collections.sort(sortedPlayers, new Comparator<L2PcInstance>() 
+		Collections.addAll(sortedPlayers, L2World.getInstance().getAllPlayersArray());
+		Collections.sort(sortedPlayers, new Comparator<L2PcInstance>()
 		{
 		{
 			@Override
 			@Override
 			public int compare(L2PcInstance p1, L2PcInstance p2)
 			public int compare(L2PcInstance p1, L2PcInstance p2)
@@ -298,7 +297,7 @@ public class RegionBBSManager extends BaseBBSManager
 		_communityPages.clear();
 		_communityPages.clear();
 		writeCommunityPages();
 		writeCommunityPages();
 	}
 	}
-	
+
 	private void addOnlinePlayer(L2PcInstance player)
 	private void addOnlinePlayer(L2PcInstance player)
 	{
 	{
 		boolean added = false;
 		boolean added = false;

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/OfflineTradersTable.java

@@ -62,7 +62,7 @@ public class OfflineTradersTable
 			PreparedStatement stm_items = con.prepareStatement(SAVE_ITEMS);
 			PreparedStatement stm_items = con.prepareStatement(SAVE_ITEMS);
 			
 			
 			//TextBuilder items = TextBuilder.newInstance();
 			//TextBuilder items = TextBuilder.newInstance();
-			for (L2PcInstance pc : L2World.getInstance().getAllPlayers().values())
+			for (L2PcInstance pc : L2World.getInstance().getAllPlayersArray())
 			{
 			{
 				try
 				try
 				{
 				{

+ 40 - 37
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/BoatManager.java

@@ -14,7 +14,8 @@
  */
  */
 package com.l2jserver.gameserver.instancemanager;
 package com.l2jserver.gameserver.instancemanager;
 
 
-import java.util.Collection;
+import gnu.trove.TObjectProcedure;
+
 import java.util.Map;
 import java.util.Map;
 
 
 import javolution.util.FastMap;
 import javolution.util.FastMap;
@@ -152,25 +153,8 @@ public class BoatManager
 	 */
 	 */
 	public void broadcastPacket(VehiclePathPoint point1, VehiclePathPoint point2, L2GameServerPacket packet)
 	public void broadcastPacket(VehiclePathPoint point1, VehiclePathPoint point2, L2GameServerPacket packet)
 	{
 	{
-		double dx, dy;
-		final Collection<L2PcInstance> players = L2World.getInstance().getAllPlayers().values();
-		for (L2PcInstance player : players)
-		{
-			if (player == null)
-				continue;
-			
-			dx = (double)player.getX() - point1.x;
-			dy = (double)player.getY() - point1.y;
-			if (Math.sqrt(dx*dx + dy*dy) < Config.BOAT_BROADCAST_RADIUS)
-				player.sendPacket(packet);
-			else
-			{
-				dx = (double)player.getX() - point2.x;
-				dy = (double)player.getY() - point2.y;
-				if (Math.sqrt(dx*dx + dy*dy) < Config.BOAT_BROADCAST_RADIUS)
-					player.sendPacket(packet);
-			}
-		}
+		
+		L2World.getInstance().forEachPlayer(new ForEachPlayerBroadcastPackets(point1, point2, packet));
 	}
 	}
 	
 	
 	/**
 	/**
@@ -178,27 +162,46 @@ public class BoatManager
 	 */
 	 */
 	public void broadcastPackets(VehiclePathPoint point1, VehiclePathPoint point2, L2GameServerPacket... packets)
 	public void broadcastPackets(VehiclePathPoint point1, VehiclePathPoint point2, L2GameServerPacket... packets)
 	{
 	{
-		double dx, dy;
-		final Collection<L2PcInstance> players = L2World.getInstance().getAllPlayers().values();
-		for (L2PcInstance player : players)
+		L2World.getInstance().forEachPlayer(new ForEachPlayerBroadcastPackets(point1, point2, packets));
+	}
+	
+	private final class ForEachPlayerBroadcastPackets implements TObjectProcedure<L2PcInstance>
+	{
+		VehiclePathPoint _point1, _point2;
+		L2GameServerPacket[] _packets;
+		
+		private ForEachPlayerBroadcastPackets(VehiclePathPoint point1, VehiclePathPoint point2, L2GameServerPacket ... packets)
 		{
 		{
-			if (player == null)
-				continue;
-			dx = (double)player.getX() - point1.x;
-			dy = (double)player.getY() - point1.y;
-			if (Math.sqrt(dx*dx + dy*dy) < Config.BOAT_BROADCAST_RADIUS)
-			{
-				for (L2GameServerPacket p : packets)
-					player.sendPacket(p);
-			}
-			else
+			_point1 = point1;
+			_point2 = point2;
+			_packets = packets;
+		}
+		
+		@Override
+		public final boolean execute(final L2PcInstance player)
+		{
+			if (player != null)
 			{
 			{
-				dx = (double)player.getX() - point2.x;
-				dy = (double)player.getY() - point2.y;
-				if (Math.sqrt(dx*dx + dy*dy) < Config.BOAT_BROADCAST_RADIUS)
-					for (L2GameServerPacket p : packets)
+				double dx = (double) player.getX() - _point1.x;
+				double dy = (double) player.getY() - _point1.y;
+				if (Math.sqrt(dx * dx + dy * dy) < Config.BOAT_BROADCAST_RADIUS)
+				{
+					for (L2GameServerPacket p : _packets)
 						player.sendPacket(p);
 						player.sendPacket(p);
+				}
+				else
+				{
+					dx = (double) player.getX() - _point2.x;
+					dy = (double) player.getY() - _point2.y;
+					if (Math.sqrt(dx * dx + dy * dy) < Config.BOAT_BROADCAST_RADIUS)
+					{
+						for (L2GameServerPacket p : _packets)
+							player.sendPacket(p);
+					}
+				}
 			}
 			}
+			
+			return true;
 		}
 		}
 	}
 	}
 	
 	

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/TerritoryWarManager.java

@@ -1118,7 +1118,7 @@ public class TerritoryWarManager implements Siegable
 		{
 		{
 			if (isTWInProgress())
 			if (isTWInProgress())
 			{
 			{
-				for(L2PcInstance player : L2World.getInstance().getAllPlayers().values())
+				for(L2PcInstance player : L2World.getInstance().getAllPlayersArray())
 					if (player != null && player.getSiegeSide() > 0)
 					if (player != null && player.getSiegeSide() > 0)
 						giveTWPoint(player, 1000, 6);
 						giveTWPoint(player, 1000, 6);
 			}
 			}

+ 12 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java

@@ -15,6 +15,8 @@
 
 
 package com.l2jserver.gameserver.instancemanager;
 package com.l2jserver.gameserver.instancemanager;
 
 
+import gnu.trove.TObjectProcedure;
+
 import java.io.File;
 import java.io.File;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Constructor;
 import java.util.Collection;
 import java.util.Collection;
@@ -97,11 +99,18 @@ public class ZoneManager
 		_log.info("Removed zones in " + count + " regions.");
 		_log.info("Removed zones in " + count + " regions.");
 		// Load the zones
 		// Load the zones
 		load();
 		load();
-		
-		for (L2Object o : L2World.getInstance().getAllVisibleObjects().values())
-		{ 
+		L2World.getInstance().forEachObject(new ForEachCharacterRevalidateZone());
+
+	}
+	
+	private final class ForEachCharacterRevalidateZone implements TObjectProcedure<L2Object>
+	{	
+		@Override
+		public final boolean execute(final L2Object o)
+		{
 			if (o instanceof L2Character)
 			if (o instanceof L2Character)
 				((L2Character) o).revalidateZone(true);
 				((L2Character) o).revalidateZone(true);
+			return true;
 		}
 		}
 	}
 	}
 	
 	

+ 291 - 51
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2World.java

@@ -14,14 +14,18 @@
  */
  */
 package com.l2jserver.gameserver.model;
 package com.l2jserver.gameserver.model;
 
 
+import gnu.trove.TIntObjectHashMap;
+import gnu.trove.TObjectProcedure;
+
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.logging.Logger;
 import java.util.logging.Logger;
 
 
 import javolution.util.FastList;
 import javolution.util.FastList;
-import javolution.util.FastMap;
 
 
 import com.l2jserver.Config;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GmListTable;
 import com.l2jserver.gameserver.GmListTable;
@@ -75,13 +79,19 @@ public final class L2World
 	//private FastMap<String, L2PcInstance> _allGms;
 	//private FastMap<String, L2PcInstance> _allGms;
 	
 	
 	/** HashMap(Integer Player id, L2PcInstance) containing all the players in game */
 	/** HashMap(Integer Player id, L2PcInstance) containing all the players in game */
-	private Map<Integer, L2PcInstance> _allPlayers;
+	private TIntObjectHashMap<L2PcInstance> _allPlayers;
+	private final Lock _apRL;
+	private final Lock _apWL;
 	
 	
 	/** L2ObjectHashMap(L2Object) containing all visible objects */
 	/** L2ObjectHashMap(L2Object) containing all visible objects */
-	private Map<Integer, L2Object> _allObjects;
+	private TIntObjectHashMap<L2Object> _allObjects;
+	private final Lock _aoRL;
+	private final Lock _aoWL;
 	
 	
 	/** List with the pets instances and their owner id */
 	/** List with the pets instances and their owner id */
-	private Map<Integer, L2PetInstance> _petsInstance;
+	private TIntObjectHashMap<L2PetInstance> _petsInstance;
+	private final Lock _piRL;
+	private final Lock _piWL;
 	
 	
 	private L2WorldRegion[][] _worldRegions;
 	private L2WorldRegion[][] _worldRegions;
 	
 	
@@ -90,10 +100,20 @@ public final class L2World
 	 */
 	 */
 	private L2World()
 	private L2World()
 	{
 	{
-		//_allGms	 = new FastMap<String, L2PcInstance>();
-		_allPlayers = new FastMap<Integer, L2PcInstance>().shared();
-		_petsInstance = new FastMap<Integer, L2PetInstance>().shared();
-		_allObjects = new FastMap<Integer, L2Object>().shared();
+		ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+		_apRL = lock.readLock();
+		_apWL = lock.writeLock();
+		_allPlayers = new TIntObjectHashMap<L2PcInstance>();
+		
+		lock = new ReentrantReadWriteLock();
+		_aoRL = lock.readLock();
+		_aoWL = lock.writeLock();
+		_allObjects = new TIntObjectHashMap<L2Object>();
+		
+		lock = new ReentrantReadWriteLock();
+		_piRL = lock.readLock();
+		_piWL = lock.writeLock();
+		_petsInstance = new TIntObjectHashMap<L2PetInstance>();
 		
 		
 		initRegions();
 		initRegions();
 	}
 	}
@@ -115,24 +135,52 @@ public final class L2World
 	 */
 	 */
 	public void storeObject(L2Object object)
 	public void storeObject(L2Object object)
 	{
 	{
-		assert !_allObjects.containsKey(object.getObjectId());
-		
-		if (_allObjects.containsKey(object.getObjectId()))
+		_aoWL.lock();
+		try
 		{
 		{
-			_log.warning("[L2World] object: " + object + " already exist in OID map!");
-			_log.info(StringUtil.getTraceString(Thread.currentThread().getStackTrace()));
-			return;
+			_aoRL.lock();
+			try
+			{
+				assert !_allObjects.containsKey(object.getObjectId());
+				
+				if (_allObjects.containsKey(object.getObjectId()))
+				{
+					if (Config.DEBUG)
+					{
+						_log.warning("[L2World] object: " + object + " already exist in OID map!");
+						_log.info(StringUtil.getTraceString(Thread.currentThread().getStackTrace()));
+						return;
+					}
+				}
+			}
+			finally
+			{
+				_aoRL.unlock();
+			}
+			
+			_allObjects.put(object.getObjectId(), object);
+		}
+		finally
+		{
+			_aoWL.unlock();
 		}
 		}
-		
-		_allObjects.put(object.getObjectId(), object);
 	}
 	}
 	
 	
 	public long timeStoreObject(L2Object object)
 	public long timeStoreObject(L2Object object)
 	{
 	{
-		long time = System.nanoTime();
-		_allObjects.put(object.getObjectId(), object);
-		time = System.nanoTime() - time;
-		return time;
+		_aoWL.lock();
+		
+		try
+		{
+			long time = System.nanoTime();
+			_allObjects.put(object.getObjectId(), object);
+			time = System.nanoTime() - time;
+			return time;
+		}
+		finally
+		{
+			_aoWL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -148,33 +196,69 @@ public final class L2World
 	 */
 	 */
 	public void removeObject(L2Object object)
 	public void removeObject(L2Object object)
 	{
 	{
-		_allObjects.remove(Integer.valueOf(object.getObjectId())); // suggestion by whatev
-		//IdFactory.getInstance().releaseId(object.getObjectId());
+		_aoWL.lock();
+		
+		try
+		{
+			_allObjects.remove(object.getObjectId()); // suggestion by whatev
+			//IdFactory.getInstance().releaseId(object.getObjectId());
+		}
+		finally
+		{
+			_aoWL.unlock();
+		}
 	}
 	}
 	
 	
 	public void removeObjects(List<L2Object> list)
 	public void removeObjects(List<L2Object> list)
 	{
 	{
-		for (L2Object o : list)
+		_aoWL.lock();
+		
+		try
+		{
+			for (L2Object o : list)
+			{
+				if (o != null)
+					_allObjects.remove(o.getObjectId()); // suggestion by whatev
+			}
+			//IdFactory.getInstance().releaseId(object.getObjectId());
+		}
+		finally
 		{
 		{
-			if (o != null)
-				_allObjects.remove(Integer.valueOf(o.getObjectId())); // suggestion by whatev
+			_aoWL.unlock();
 		}
 		}
-		//IdFactory.getInstance().releaseId(object.getObjectId());
 	}
 	}
 	
 	
 	public void removeObjects(L2Object[] objects)
 	public void removeObjects(L2Object[] objects)
 	{
 	{
-		for (L2Object o : objects)
-			_allObjects.remove(Integer.valueOf(o.getObjectId())); // suggestion by whatev
-		//IdFactory.getInstance().releaseId(object.getObjectId());
+		_aoWL.lock();
+		
+		try
+		{
+			for (L2Object o : objects)
+				_allObjects.remove(o.getObjectId()); // suggestion by whatev
+			//IdFactory.getInstance().releaseId(object.getObjectId());
+		}
+		finally
+		{
+			_aoWL.unlock();
+		}
 	}
 	}
 	
 	
 	public long timeRemoveObject(L2Object object)
 	public long timeRemoveObject(L2Object object)
 	{
 	{
-		long time = System.nanoTime();
-		_allObjects.remove(Integer.valueOf(object.getObjectId()));
-		time = System.nanoTime() - time;
-		return time;
+		_aoWL.lock();
+		
+		try
+		{
+			long time = System.nanoTime();
+			_allObjects.remove(object.getObjectId());
+			time = System.nanoTime() - time;
+			return time;
+		}
+		finally
+		{
+			_aoWL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -187,15 +271,33 @@ public final class L2World
 	 */
 	 */
 	public L2Object findObject(int oID)
 	public L2Object findObject(int oID)
 	{
 	{
-		return _allObjects.get(Integer.valueOf(oID));
+		_aoRL.lock();
+		
+		try
+		{
+			return _allObjects.get(oID);
+		}
+		finally
+		{
+			_aoRL.unlock();
+		}
 	}
 	}
 	
 	
 	public long timeFindObject(int objectID)
 	public long timeFindObject(int objectID)
 	{
 	{
-		long time = System.nanoTime();
-		_allObjects.get(Integer.valueOf(objectID));
-		time = System.nanoTime() - time;
-		return time;
+		_aoRL.lock();
+		
+		try
+		{
+			long time = System.nanoTime();
+			_allObjects.get(objectID);
+			time = System.nanoTime() - time;
+			return time;
+		}
+		finally
+		{
+			_aoRL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -207,9 +309,46 @@ public final class L2World
 	 * @deprecated
 	 * @deprecated
 	 */
 	 */
 	@Deprecated
 	@Deprecated
-	public final Map<Integer, L2Object> getAllVisibleObjects()
+	public final TIntObjectHashMap<L2Object> getAllVisibleObjects()
+	{
+		_aoRL.lock();
+		
+		try
+		{
+			return _allObjects;
+		}
+		finally
+		{
+			_aoRL.unlock();
+		}
+	}
+	
+	public final L2Object[] getAllVisibleObjectsArray()
 	{
 	{
-		return _allObjects;
+		_aoRL.lock();
+		
+		try
+		{
+			return _allObjects.getValues(new L2Object[_allObjects.size()]);
+		}
+		finally
+		{
+			_aoRL.unlock();
+		}
+	}
+	
+	public final boolean forEachObject(final TObjectProcedure<L2Object> proc)
+	{
+		_aoRL.lock();
+		
+		try
+		{
+			return _allObjects.forEachValue(proc);
+		}
+		finally
+		{
+			_aoRL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -231,9 +370,46 @@ public final class L2World
 		return GmListTable.getInstance().getAllGms(true);
 		return GmListTable.getInstance().getAllGms(true);
 	}
 	}
 	
 	
-	public Map<Integer, L2PcInstance> getAllPlayers()
+	public TIntObjectHashMap<L2PcInstance> getAllPlayers()
 	{
 	{
-		return _allPlayers;
+		_apRL.lock();
+		
+		try
+		{
+			return _allPlayers;
+		}
+		finally
+		{
+			_apRL.unlock();
+		}
+	}
+	
+	public final L2PcInstance[] getAllPlayersArray()
+	{
+		_apRL.lock();
+		
+		try
+		{
+			return _allPlayers.getValues(new L2PcInstance[_allPlayers.size()]);
+		}
+		finally
+		{
+			_apRL.unlock();
+		}
+	}
+	
+	public final boolean forEachPlayer(final TObjectProcedure<L2PcInstance> proc)
+	{
+		_apRL.lock();
+		
+		try
+		{
+			return _allPlayers.forEachValue(proc);
+		}
+		finally
+		{
+			_apRL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -264,7 +440,16 @@ public final class L2World
 	 */
 	 */
 	public L2PcInstance getPlayer(int playerObjId)
 	public L2PcInstance getPlayer(int playerObjId)
 	{
 	{
-		return _allPlayers.get(Integer.valueOf(playerObjId));
+		_apRL.lock();
+		
+		try
+		{
+			return _allPlayers.get(playerObjId);
+		}
+		finally
+		{
+			_apRL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -274,7 +459,16 @@ public final class L2World
 	 */
 	 */
 	public L2PetInstance getPet(int ownerId)
 	public L2PetInstance getPet(int ownerId)
 	{
 	{
-		return _petsInstance.get(Integer.valueOf(ownerId));
+		_piRL.lock();
+		
+		try
+		{
+			return _petsInstance.get(ownerId);
+		}
+		finally
+		{
+			_piRL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -285,7 +479,16 @@ public final class L2World
 	 */
 	 */
 	public L2PetInstance addPet(int ownerId, L2PetInstance pet)
 	public L2PetInstance addPet(int ownerId, L2PetInstance pet)
 	{
 	{
-		return _petsInstance.put(ownerId, pet);
+		_piWL.lock();
+		
+		try
+		{
+			return _petsInstance.put(ownerId, pet);
+		}
+		finally
+		{
+			_piWL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -295,7 +498,16 @@ public final class L2World
 	 */
 	 */
 	public void removePet(int ownerId)
 	public void removePet(int ownerId)
 	{
 	{
-		_petsInstance.remove(Integer.valueOf(ownerId));
+		_piWL.lock();
+		
+		try
+		{
+			_petsInstance.remove(ownerId);
+		}
+		finally
+		{
+			_piWL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -305,7 +517,16 @@ public final class L2World
 	 */
 	 */
 	public void removePet(L2PetInstance pet)
 	public void removePet(L2PetInstance pet)
 	{
 	{
-		_petsInstance.remove(Integer.valueOf(pet.getOwner().getObjectId()));
+		_piWL.lock();
+		
+		try
+		{
+			_petsInstance.remove(pet.getOwner().getObjectId());
+		}
+		finally
+		{
+			_piWL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -348,7 +569,7 @@ public final class L2World
 			
 			
 			if (!player.isTeleporting())
 			if (!player.isTeleporting())
 			{
 			{
-				L2PcInstance tmp = _allPlayers.get(Integer.valueOf(player.getObjectId()));
+				L2PcInstance tmp = getPlayer(player.getObjectId());
 				if (tmp != null)
 				if (tmp != null)
 				{
 				{
 					_log.warning("Duplicate character!? Closing both characters (" + player.getName() + ")");
 					_log.warning("Duplicate character!? Closing both characters (" + player.getName() + ")");
@@ -356,7 +577,7 @@ public final class L2World
 					tmp.logout();
 					tmp.logout();
 					return;
 					return;
 				}
 				}
-				_allPlayers.put(player.getObjectId(), player);
+				addToAllPlayers(player);
 			}
 			}
 		}
 		}
 		
 		
@@ -394,7 +615,16 @@ public final class L2World
 	 */
 	 */
 	public void addToAllPlayers(L2PcInstance cha)
 	public void addToAllPlayers(L2PcInstance cha)
 	{
 	{
-		_allPlayers.put(cha.getObjectId(), cha);
+		_apWL.lock();
+		
+		try
+		{
+			_allPlayers.put(cha.getObjectId(), cha);
+		}
+		finally
+		{
+			_apWL.unlock();
+		}
 	}
 	}
 	
 	
 	/**
 	/**
@@ -406,7 +636,17 @@ public final class L2World
 	 */
 	 */
 	public void removeFromAllPlayers(L2PcInstance cha)
 	public void removeFromAllPlayers(L2PcInstance cha)
 	{
 	{
-		_allPlayers.remove(Integer.valueOf(cha.getObjectId()));
+		_apWL.lock();
+		
+		try
+		{
+			_allPlayers.remove(cha.getObjectId());
+		}
+		finally
+		{
+			_apWL.unlock();
+		}
+
 	}
 	}
 	
 	
 	/**
 	/**

+ 23 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleTeleporterInstance.java

@@ -14,7 +14,8 @@
  */
  */
 package com.l2jserver.gameserver.model.actor.instance;
 package com.l2jserver.gameserver.model.actor.instance;
 
 
-import java.util.Collection;
+import gnu.trove.TObjectProcedure;
+
 import java.util.StringTokenizer;
 import java.util.StringTokenizer;
 import java.util.logging.Level;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.Logger;
@@ -110,15 +111,7 @@ public final class L2CastleTeleporterInstance extends L2Npc
 				NpcSay cs = new NpcSay(getObjectId(), 1, getNpcId(), 1000443); // The defenders of $s1 castle will be teleported to the inner castle.
 				NpcSay cs = new NpcSay(getObjectId(), 1, getNpcId(), 1000443); // The defenders of $s1 castle will be teleported to the inner castle.
 				cs.addStringParameter(getCastle().getName());
 				cs.addStringParameter(getCastle().getName());
 				int region = MapRegionManager.getInstance().getMapRegionLocId(getX(), getY());
 				int region = MapRegionManager.getInstance().getMapRegionLocId(getX(), getY());
-				Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-				//synchronized (L2World.getInstance().getAllPlayers())
-				{
-					for (L2PcInstance player : pls)
-					{
-						if (region == MapRegionManager.getInstance().getMapRegionLocId(player.getX(), player.getY()))
-							player.sendPacket(cs);
-					}
-				}
+				L2World.getInstance().forEachPlayer(new ForEachPlayerInRegionSendPacket(region, cs));
 				oustAllPlayers();
 				oustAllPlayers();
 				setTask(false);
 				setTask(false);
 			}
 			}
@@ -129,6 +122,26 @@ public final class L2CastleTeleporterInstance extends L2Npc
 		}
 		}
 	}
 	}
 	
 	
+	private final class ForEachPlayerInRegionSendPacket implements TObjectProcedure<L2PcInstance>
+	{
+		int _region;
+		NpcSay _cs;
+		
+		private ForEachPlayerInRegionSendPacket(int region, NpcSay cs)
+		{
+			_region = region;
+			_cs = cs;
+		}
+		
+		@Override
+		public final boolean execute(final L2PcInstance player)
+		{
+			if (_region == MapRegionManager.getInstance().getMapRegionLocId(player.getX(), player.getY()))
+				player.sendPacket(_cs);
+			return true;
+		}
+	}
+	
 	public boolean getTask()
 	public boolean getTask()
 	{
 	{
 		return _currentTask;
 		return _currentTask;

+ 24 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherNpcInstance.java

@@ -14,7 +14,8 @@
  */
  */
 package com.l2jserver.gameserver.model.actor.instance;
 package com.l2jserver.gameserver.model.actor.instance;
 
 
-import java.util.Collection;
+import gnu.trove.TObjectProcedure;
+
 import java.util.concurrent.Future;
 import java.util.concurrent.Future;
 
 
 import com.l2jserver.Config;
 import com.l2jserver.Config;
@@ -433,16 +434,29 @@ public class L2SepulcherNpcInstance extends L2Npc
 	{
 	{
 		if (msg == null || msg.isEmpty())
 		if (msg == null || msg.isEmpty())
 			return;// wrong usage
 			return;// wrong usage
-		Collection<L2PcInstance> knownPlayers = L2World.getInstance().getAllPlayers().values();
-		if (knownPlayers == null || knownPlayers.isEmpty())
-			return;
-		CreatureSay sm = new CreatureSay(0, Say2.SHOUT, this.getName(), msg);
-		for (L2PcInstance player : knownPlayers)
+		
+		L2World.getInstance().forEachPlayer(new SayInShout(this, new CreatureSay(0, Say2.SHOUT, this.getName(), msg)));
+	}
+	
+	private final class SayInShout implements TObjectProcedure<L2PcInstance>
+	{
+		L2SepulcherNpcInstance _npc;
+		CreatureSay _sm;
+		
+		private SayInShout(L2SepulcherNpcInstance npc, CreatureSay sm)
+		{
+			_npc = npc;
+			_sm = sm;
+		}
+		@Override
+		public final boolean execute(final L2PcInstance player)
 		{
 		{
-			if (player == null)
-				continue;
-			if (Util.checkIfInRange(15000, player, this, true))
-				player.sendPacket(sm);
+			if (player != null)
+			{
+				if (Util.checkIfInRange(15000, player, _npc, true))
+					player.sendPacket(_sm);
+			}
+			return true;
 		}
 		}
 	}
 	}
 	
 	

+ 17 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Fort.java

@@ -15,12 +15,12 @@
 package com.l2jserver.gameserver.model.entity;
 package com.l2jserver.gameserver.model.entity;
 
 
 import gnu.trove.TIntIntHashMap;
 import gnu.trove.TIntIntHashMap;
+import gnu.trove.TObjectProcedure;
 
 
 import java.sql.Connection;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSet;
 import java.util.Calendar;
 import java.util.Calendar;
-import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
@@ -965,11 +965,7 @@ public class Fort
 				sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CLAN_IS_VICTORIOUS_IN_THE_FORTRESS_BATTLE_OF_S2);
 				sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CLAN_IS_VICTORIOUS_IN_THE_FORTRESS_BATTLE_OF_S2);
 				sm.addString(clan.getName());
 				sm.addString(clan.getName());
 				sm.addFortId(getFortId());
 				sm.addFortId(getFortId());
-				Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-				for (L2PcInstance player : pls)
-				{
-					player.sendPacket(sm);
-				}
+				L2World.getInstance().forEachPlayer(new ForEachPlayerSendMessage(sm));
 				clan.broadcastToOnlineMembers(new PledgeShowInfoUpdate(clan));
 				clan.broadcastToOnlineMembers(new PledgeShowInfoUpdate(clan));
 				clan.broadcastToOnlineMembers(new PlaySound(1, "Siege_Victory", 0, 0, 0, 0, 0));
 				clan.broadcastToOnlineMembers(new PlaySound(1, "Siege_Victory", 0, 0, 0, 0, 0));
 				if (_FortUpdater[0] != null)
 				if (_FortUpdater[0] != null)
@@ -1480,4 +1476,19 @@ public class Fort
 				player.removeSkill(sk, false, true);
 				player.removeSkill(sk, false, true);
 		}
 		}
 	}
 	}
+	
+	private final class ForEachPlayerSendMessage implements TObjectProcedure<L2PcInstance>
+	{
+		SystemMessage _sm;
+		private ForEachPlayerSendMessage(SystemMessage sm)
+		{
+			_sm = sm;
+		}
+		@Override
+		public final boolean execute(final L2PcInstance character)
+		{
+			character.sendPacket(_sm);
+			return true;
+		}
+	}
 }
 }

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/L2Event.java

@@ -372,7 +372,7 @@ public class L2Event
 			_eventInfo = inbr.readLine();
 			_eventInfo = inbr.readLine();
 			
 			
 			List<L2PcInstance> temp = new FastList<L2PcInstance>();
 			List<L2PcInstance> temp = new FastList<L2PcInstance>();
-			for (L2PcInstance player : L2World.getInstance().getAllPlayers().values())
+			for (L2PcInstance player : L2World.getInstance().getAllPlayersArray())
 			{
 			{
 				if (!player.isOnline()) // Offline shops? 
 				if (!player.isOnline()) // Offline shops? 
 					continue;
 					continue;

+ 16 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java

@@ -14,7 +14,7 @@
  */
  */
 package com.l2jserver.gameserver.network.clientpackets;
 package com.l2jserver.gameserver.network.clientpackets;
 
 
-import java.util.Collection;
+import gnu.trove.TObjectProcedure;
 
 
 import com.l2jserver.Config;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
@@ -135,12 +135,22 @@ public final class RequestStartPledgeWar extends L2GameClientPacket
 		//        leader.sendPacket(new StartPledgeWar(_clan.getName(),player.getName()));
 		//        leader.sendPacket(new StartPledgeWar(_clan.getName(),player.getName()));
 		
 		
 		ClanTable.getInstance().storeclanswars(player.getClanId(), clan.getClanId());
 		ClanTable.getInstance().storeclanswars(player.getClanId(), clan.getClanId());
-		Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-		//synchronized (L2World.getInstance().getAllPlayers())
+		L2World.getInstance().forEachPlayer(new ForEachPlayerBroadcastUserInfo(clan));
+	}
+	
+	private final class ForEachPlayerBroadcastUserInfo implements TObjectProcedure<L2PcInstance>
+	{
+		L2Clan _cln;
+		private ForEachPlayerBroadcastUserInfo(L2Clan clan)
+		{
+			_cln = clan;
+		}
+		@Override
+		public final boolean execute(final L2PcInstance cha)
 		{
 		{
-			for (L2PcInstance cha : pls)
-				if (cha.getClan() == player.getClan() || cha.getClan() == clan)
-					cha.broadcastUserInfo();
+			if (cha.getClan() == player.getClan() || cha.getClan() == _cln)
+				cha.broadcastUserInfo();
+			return true;
 		}
 		}
 	}
 	}
 	
 	

+ 18 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java

@@ -14,7 +14,7 @@
  */
  */
 package com.l2jserver.gameserver.network.clientpackets;
 package com.l2jserver.gameserver.network.clientpackets;
 
 
-import java.util.Collection;
+import gnu.trove.TObjectProcedure;
 
 
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2Clan;
@@ -102,12 +102,24 @@ public final class RequestStopPledgeWar extends L2GameClientPacket
 		}
 		}
 		
 		
 		ClanTable.getInstance().deleteclanswars(playerClan.getClanId(), clan.getClanId());
 		ClanTable.getInstance().deleteclanswars(playerClan.getClanId(), clan.getClanId());
-		Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-		//synchronized (L2World.getInstance().getAllPlayers())
+		L2World.getInstance().forEachPlayer(new ForEachPlayerBroadcastUserInfo(clan, player));
+	}
+	
+	private final class ForEachPlayerBroadcastUserInfo implements TObjectProcedure<L2PcInstance>
+	{
+		L2PcInstance _player;
+		L2Clan _cln;
+		private ForEachPlayerBroadcastUserInfo(L2Clan clan, L2PcInstance player)
+		{
+			_cln = clan;
+			_player = player;
+		}
+		@Override
+		public final boolean execute(final L2PcInstance cha)
 		{
 		{
-			for (L2PcInstance cha : pls)
-				if (cha.getClan() == player.getClan() || cha.getClan() == clan)
-					cha.broadcastUserInfo();
+			if (cha.getClan() == _player.getClan() || cha.getClan() == _cln)
+				cha.broadcastUserInfo();
+			return true;
 		}
 		}
 	}
 	}
 	
 	

+ 38 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/util/Broadcast.java

@@ -24,6 +24,8 @@
  */
  */
 package com.l2jserver.gameserver.util;
 package com.l2jserver.gameserver.util;
 
 
+import gnu.trove.TObjectProcedure;
+
 import java.util.Collection;
 import java.util.Collection;
 import java.util.logging.Level;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.Logger;
@@ -218,13 +220,7 @@ public final class Broadcast
 		if (Config.DEBUG)
 		if (Config.DEBUG)
 			_log.fine("Players to notify: " + L2World.getInstance().getAllPlayersCount() + " (with packet " + mov.getType() + ")");
 			_log.fine("Players to notify: " + L2World.getInstance().getAllPlayersCount() + " (with packet " + mov.getType() + ")");
 		
 		
-		Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-		// synchronized (L2World.getInstance().getAllPlayers())
-		{
-			for (L2PcInstance onlinePlayer : pls)
-				if (onlinePlayer != null && onlinePlayer.isOnline())
-					onlinePlayer.sendPacket(mov);
-		}
+		L2World.getInstance().forEachPlayer(new ForEachPlayerBroadcast(mov));
 	}
 	}
 	
 	
 	public static void announceToOnlinePlayers(String text)
 	public static void announceToOnlinePlayers(String text)
@@ -235,14 +231,42 @@ public final class Broadcast
 	
 	
 	public static void toPlayersInInstance(L2GameServerPacket mov, int instanceId)
 	public static void toPlayersInInstance(L2GameServerPacket mov, int instanceId)
 	{
 	{
-		Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
-		//synchronized (character.getKnownList().getKnownPlayers())
+		L2World.getInstance().forEachPlayer(new ForEachPlayerInInstanceBroadcast(mov, instanceId));
+	}
+	
+	private static final class ForEachPlayerBroadcast implements TObjectProcedure<L2PcInstance>
+	{
+		L2GameServerPacket _packet;
+		private ForEachPlayerBroadcast(L2GameServerPacket packet)
 		{
 		{
-			for (L2PcInstance onlinePlayer : pls)
-			{
-				if (onlinePlayer != null && onlinePlayer.isOnline() && onlinePlayer.getInstanceId() == instanceId)
-					onlinePlayer.sendPacket(mov);
-			}
+			_packet = packet;
+		}
+		
+		@Override
+		public final boolean execute(final L2PcInstance onlinePlayer)
+		{
+			if (onlinePlayer != null && onlinePlayer.isOnline())
+				onlinePlayer.sendPacket(_packet);
+			return true;
+		}
+	}
+	
+	private static final class ForEachPlayerInInstanceBroadcast implements TObjectProcedure<L2PcInstance>
+	{
+		L2GameServerPacket _packet;
+		int _instanceId;
+		private ForEachPlayerInInstanceBroadcast(L2GameServerPacket packet, int instanceId)
+		{
+			_packet = packet;
+			_instanceId = instanceId;
+		}
+		
+		@Override
+		public final boolean execute(final L2PcInstance onlinePlayer)
+		{
+			if (onlinePlayer != null && onlinePlayer.isOnline() && onlinePlayer.getInstanceId() == _instanceId)
+				onlinePlayer.sendPacket(_packet);
+			return true;
 		}
 		}
 	}
 	}
 }
 }

+ 2 - 5
L2J_Server_BETA/java/com/l2jserver/status/GameStatusThread.java

@@ -34,7 +34,6 @@ import java.sql.SQLException;
 import java.text.DecimalFormat;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Calendar;
-import java.util.Collection;
 import java.util.Map;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.NoSuchElementException;
@@ -856,10 +855,9 @@ public class GameStatusThread extends Thread
 						// name;type;x;y;itemId:enchant:price...
 						// name;type;x;y;itemId:enchant:price...
 						if (type.equals("privatestore"))
 						if (type.equals("privatestore"))
 						{
 						{
-							Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
 							//synchronized (L2World.getInstance().getAllPlayers())
 							//synchronized (L2World.getInstance().getAllPlayers())
 							{
 							{
-								for (L2PcInstance player : pls)
+								for (L2PcInstance player : L2World.getInstance().getAllPlayersArray())
 								{
 								{
 									if (player.getPrivateStoreType() == 0)
 									if (player.getPrivateStoreType() == 0)
 										continue;
 										continue;
@@ -1087,10 +1085,9 @@ public class GameStatusThread extends Thread
 		int summonCount = 0;
 		int summonCount = 0;
 		int AICount = 0;
 		int AICount = 0;
 		
 		
-		Collection<L2Object> objs = L2World.getInstance().getAllVisibleObjects().values();
 		//synchronized (L2World.getInstance().getAllVisibleObjects())
 		//synchronized (L2World.getInstance().getAllVisibleObjects())
 		{
 		{
-			for (L2Object obj : objs)
+			for (L2Object obj : L2World.getInstance().getAllVisibleObjectsArray())
 			{
 			{
 				if (obj == null)
 				if (obj == null)
 					continue;
 					continue;