|  |  | @ -39,6 +39,7 @@ import java.sql.SQLException; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.time.LocalDateTime; |  |  |  | import java.time.LocalDateTime; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.time.ZoneId; |  |  |  | import java.time.ZoneId; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.ArrayList; |  |  |  | import java.util.ArrayList; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import java.util.HashMap; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.HashSet; |  |  |  | import java.util.HashSet; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.Iterator; |  |  |  | import java.util.Iterator; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.concurrent.ConcurrentHashMap; |  |  |  | import java.util.concurrent.ConcurrentHashMap; | 
			
		
	
	
		
		
			
				
					|  |  | @ -88,6 +89,8 @@ public class City extends AbstractWorldObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |     private boolean reverseKOS = false; |  |  |  |     private boolean reverseKOS = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |     private String hash; |  |  |  |     private String hash; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public HashMap<Integer, Long> baneAttendees; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     /** |  |  |  |     /** | 
			
		
	
		
		
			
				
					
					|  |  |  |      * ResultSet Constructor |  |  |  |      * ResultSet Constructor | 
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |      */ | 
			
		
	
	
		
		
			
				
					|  |  | @ -1017,7 +1020,15 @@ public class City extends AbstractWorldObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |             currentMemory.add(player.getObjectUUID()); |  |  |  |             currentMemory.add(player.getObjectUUID()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             // Player is already in our memory
 |  |  |  |             // Player is already in our memory
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |             if(this.getBane() != null){ | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 //handle zerg mechanics here
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 if(this.getBane().getSiegePhase().equals(SiegePhase.WAR)){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     //bane is live, start tallying players
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     if(!this.baneAttendees.containsKey(player.getObjectUUID())){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         this.baneAttendees.put(player.getObjectUUID(),System.currentTimeMillis()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (_playerMemory.contains(player.getObjectUUID())) |  |  |  |             if (_playerMemory.contains(player.getObjectUUID())) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 continue; |  |  |  |                 continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1047,11 +1058,25 @@ public class City extends AbstractWorldObject { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private void onExitBane(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         ArrayList<Integer> toRemove = new ArrayList<>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         for(int uuid : this.baneAttendees.keySet()){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if(!_playerMemory.contains(uuid)){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 if(System.currentTimeMillis() - this.baneAttendees.get(uuid) > 180000){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     toRemove.add(uuid); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         for(Integer uuid : toRemove){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             this.baneAttendees.remove(uuid); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private void onExit(HashSet<Integer> currentMemory) { |  |  |  |     private void onExit(HashSet<Integer> currentMemory) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         PlayerCharacter player; |  |  |  |         PlayerCharacter player; | 
			
		
	
		
		
			
				
					
					|  |  |  |         int playerUUID = 0; |  |  |  |         int playerUUID = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |         HashSet<Integer> toRemove = new HashSet<>(); |  |  |  |         HashSet<Integer> toRemoveStandard = new HashSet<>(); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         Iterator<Integer> iter = _playerMemory.iterator(); |  |  |  |         Iterator<Integer> iter = _playerMemory.iterator(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         while (iter.hasNext()) { |  |  |  |         while (iter.hasNext()) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1073,21 +1098,28 @@ public class City extends AbstractWorldObject { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.removeAllCityEffects(player, false); |  |  |  |             this.removeAllCityEffects(player, false); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             player.ZergMultiplier = 1.0f; | 
			
		
	
		
		
			
				
					
					|  |  |  |             // We will remove this player after iteration is complete
 |  |  |  |             // We will remove this player after iteration is complete
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             // so store it in a temporary collection
 |  |  |  |             // so store it in a temporary collection
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             toRemove.add(playerUUID); |  |  |  |             toRemoveStandard.add(playerUUID); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             // ***For debugging
 |  |  |  |             // ***For debugging
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             // Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
 |  |  |  |             // Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // Remove players from city memory
 |  |  |  |         // Remove players from city memory
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         _playerMemory.removeAll(toRemove); |  |  |  |         _playerMemory.removeAll(toRemoveStandard); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         for (Integer removalUUID : toRemove) { |  |  |  |         for (Integer removalUUID : toRemoveStandard) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             if (this.cityOutlaws.contains(removalUUID)) |  |  |  |             if (this.cityOutlaws.contains(removalUUID)) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 this.cityOutlaws.remove(removalUUID); |  |  |  |                 this.cityOutlaws.remove(removalUUID); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(this.getBane() != null){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             //handle zerg mechanics here
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if(this.getBane().getSiegePhase().equals(SiegePhase.WAR)){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 this.onExitBane(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public int getWarehouseBuildingID() { |  |  |  |     public int getWarehouseBuildingID() { | 
			
		
	
	
		
		
			
				
					|  |  | 
 |