|  |  | @ -23,9 +23,9 @@ import engine.objects.*; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.server.MBServerStatics; |  |  |  | import engine.server.MBServerStatics; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.joda.time.DateTime; |  |  |  | import org.joda.time.DateTime; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.pmw.tinylog.Logger; |  |  |  | import org.pmw.tinylog.Logger; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.time.LocalDateTime; |  |  |  | import java.time.LocalDateTime; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.ArrayList; |  |  |  | import java.util.ArrayList; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import java.util.HashMap; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.HashSet; |  |  |  | import java.util.HashSet; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.concurrent.locks.ReentrantReadWriteLock; |  |  |  | import java.util.concurrent.locks.ReentrantReadWriteLock; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -122,7 +122,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Let's now attempt to place the building
 |  |  |  | 		// Let's now attempt to place the building
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		buildingCreated = false; |  |  |  | 		buildingCreated = false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Many buildings have particular validation and
 |  |  |  | 		// Many buildings have particular validation and
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -202,7 +201,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		playerCharacter.setLastContract(msg.getContractID()); |  |  |  | 		playerCharacter.setLastContract(msg.getContractID()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Remove the appropiate deed.
 |  |  |  | 		// Remove the appropriate deed.
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		if (buildingCreated == true) |  |  |  | 		if (buildingCreated == true) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (contract != null) { |  |  |  | 			if (contract != null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				playerCharacter.getCharItemManager().delete(contract); |  |  |  | 				playerCharacter.getCharItemManager().delete(contract); | 
			
		
	
	
		
		
			
				
					|  |  | @ -277,8 +276,9 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Early exit if something went horribly wrong
 |  |  |  | 		// Early exit if something went horribly wrong
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (cityObject == null) |  |  |  | 		if (cityObject == null){ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 52, ""); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return false;} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Method checks validation conditions arising when placing
 |  |  |  | 		// Method checks validation conditions arising when placing
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// buildings.  Player must be on a city grid, must be
 |  |  |  | 		// buildings.  Player must be on a city grid, must be
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -308,8 +308,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Building siegeBuilding; |  |  |  | 		Building siegeBuilding; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		PlacementInfo buildingList; |  |  |  | 		PlacementInfo buildingList; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		City serverCity; |  |  |  | 		City serverCity; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		int numAttackerBuildings = 0; |  |  |  | 		Bane bane; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		int numDefenderBuildings = 0; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Retrieve the building details we're placing
 |  |  |  | 		// Retrieve the building details we're placing
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -327,76 +326,97 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Checks validation conditions arising when placing
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// generic structures.
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (validateBuildingPlacement(serverZone, msg, origin, player, buildingList) == false) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// If there is a bane placed, only the attackers and defenders can
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// place siege assets
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		serverCity = ZoneManager.getCityAtLocation(buildingList.getLoc()); |  |  |  | 		serverCity = ZoneManager.getCityAtLocation(buildingList.getLoc()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		//no city found
 |  |  |  | 		// No valid player city found
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		//check if attacker city.
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverCity == null){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Bane bane = Bane.getBaneByAttackerGuild(player.getGuild()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			City attackerCity = null; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (bane != null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				attackerCity = bane.getCity(); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (attackerCity != null) |  |  |  | 		if (serverCity == null || serverCity.getParent().isPlayerCity() == false) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				if (buildingList.getLoc().isInsideCircle(attackerCity.getLoc(), Enum.CityBoundsType.SIEGE.extents)) |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 52, ""); // Cannot place outisde a guild zone
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					serverCity = attackerCity; |  |  |  | 			return false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		//no city found for attacker city,
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		//check if defender city
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverCity == null){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (player.getGuild().getOwnedCity() != null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if (buildingList.getLoc().isInsideCircle(player.getGuild().getOwnedCity().getLoc(), Enum.CityBoundsType.SIEGE.extents)) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					serverCity = player.getGuild().getOwnedCity(); |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		// No bane no bow
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		bane = serverCity.getBane(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ((serverCity != null) && |  |  |  | 		if (bane == null) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				(serverCity.getBane() != null)) { |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 66, ""); // There is no bane circle to support this building of war
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Set the server zone to the city zone in order to account for being inside
 |  |  |  | 		// Set the server zone to the city zone in order to account for being inside
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// the siege bounds buffer area
 |  |  |  | 		// the siege bounds buffer area
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		serverZone = serverCity.getParent(); |  |  |  | 		serverZone = serverCity.getParent(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		// Must belong to either attacker or defenders.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ((player.getGuild().equals(serverCity.getBane().getOwner().getGuild()) == false) |  |  |  | 		if ((player.getGuild().equals(serverCity.getBane().getOwner().getGuild()) == false) | 
			
		
	
		
		
			
				
					
					|  |  |  | 					&& (player.getGuild().equals(serverCity.getGuild()) == false)) { |  |  |  | 					&& (player.getGuild().equals(serverCity.getGuild()) == false)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 54, ""); // Must belong to attacker or defender
 |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 54, ""); // Must belong to attacker or defender
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		// Player must be  GL or IC of the bane guild to place bow.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if(GuildStatusController.isGuildLeader(player.getGuildStatus()) == false | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				&& GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 10, player.getName());  // You must be a guild leader to place this asset
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		//cannot place on grid until bane is live
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if(bane.getSiegePhase() != SiegePhase.WAR && | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				serverCity.isLocationOnCityGrid(buildingList.getLoc()) == true) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 53, player.getName()); // Buildings of war cannot be placed around a city grid unless there is an active bane
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// cant place siege equipment off city zone.
 |  |  |  | 		// If there is a bane placed, we limit bow placement to 2x the stone rank's worth of attacker assets
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		// and 1x the tree rank for defenders
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if (validateSiegeLimits(player, origin, serverCity.getBane()) == false) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		// Collision check (Removes rubble side effect)
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if (placementCollisionCheck(serverZone, origin, buildingList)){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 3, ""); // Conflict between proposed assets
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Create the siege Building
 |  |  |  | 		// Create the siege Building
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		siegeBuilding = createStructure(player, msg.getFirstPlacementInfo(), serverZone); |  |  |  | 		siegeBuilding = createStructure(player, msg.getFirstPlacementInfo(), serverZone); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverCity == null) |  |  |  | 		 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			return true; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		// Oops something went really wrong
 |  |  |  | 		// Oops something went really wrong
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (siegeBuilding == null) |  |  |  | 		if (siegeBuilding == null) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		 |  |  |  | 		 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		// passes validation: can assign auto-protection to war asset
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		siegeBuilding.setProtectionState(ProtectionState.PROTECTED); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		 |  |  |  | 		 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverCity.getBane() == null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return true; |  |  |  | 		return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	private  boolean validateSiegeLimits(PlayerCharacter playerCharacter, ClientConnection origin, Bane bane) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		City serverCity = bane.getCity(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		HashSet<AbstractWorldObject> awoList; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		HashSet<AbstractWorldObject> attackerBuildings = new HashSet<>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		HashSet<AbstractWorldObject> defenderBuildings = new HashSet<>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		int maxAttackerAssets = serverCity.getBane().getStone().getRank() * 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		int maxDefenderAssets = serverCity.getRank(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		 |  |  |  | 		 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// If there is an bane placed, we protect 2x the stone rank's worth of attacker assets
 |  |  |  | 		// Count bow for attackers and defenders
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		// and 1x the tree rank's worth of assets automatically
 |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING); |  |  |  | 		awoList =  WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		for (AbstractWorldObject awo : awoList) { |  |  |  | 		for (AbstractWorldObject awo : awoList) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Building building = (Building) awo; |  |  |  | 			Building building = (Building) awo; | 
			
		
	
	
		
		
			
				
					|  |  | @ -417,56 +437,49 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (!building.getGuild().equals(serverCity.getGuild()) && !building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |  |  |  | 			if (!building.getGuild().equals(serverCity.getGuild()) && !building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) | 
			
		
	
		
		
			
				
					
					|  |  |  | 				continue; |  |  |  | 				continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			// Only count auto protected buildings
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (building.getProtectionState() != ProtectionState.PROTECTED) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				continue; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (building.getGuild().equals(serverCity.getGuild())) |  |  |  | 			if (building.getGuild().equals(serverCity.getGuild())) | 
			
		
	
		
		
			
				
					
					|  |  |  | 				numDefenderBuildings++; |  |  |  | 				defenderBuildings.add(building); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			else |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			if (building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |  |  |  | 			if (building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) | 
			
		
	
		
		
			
				
					
					|  |  |  | 				numAttackerBuildings++; |  |  |  | 				attackerBuildings.add(building); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			// Validate bane limits on siege assets
 |  |  |  | 			// Validate bane limits on siege assets
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverCity.getBane() != null) |  |  |  | 			if (playerCharacter.getGuild().equals(serverCity.getGuild())) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			if ((player.getGuild().equals(serverCity.getBane().getOwner().getGuild())) && |  |  |  | 				//defender attempting to place asset
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					(numAttackerBuildings >= serverCity.getBane().getStone().getRank() * 2)) { |  |  |  | 				if (defenderBuildings.size() >= maxDefenderAssets) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				return true; |  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 62, ""); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverCity.getBane() != null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ((player.getGuild().equals(serverCity.getGuild())) && |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				(numDefenderBuildings >= serverCity.getTOL().getRank())) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return true; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 			 |  |  |  | 			 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// passes validation: can assign auto-protection to war asset
 |  |  |  | 			if (playerCharacter.getGuild().equals(serverCity.getBane().getStone().getGuild())) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 				//attacker attempting to place asset
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverCity.getBane() != null) |  |  |  | 				if (attackerBuildings.size() >= maxAttackerAssets) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			if (serverCity.isLocationOnCityGrid(siegeBuilding.getBounds())) |  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 61, ""); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				if (player.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |  |  |  | 					return false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					return true; |  |  |  | 				} | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		siegeBuilding.setProtectionState(ProtectionState.PROTECTED); |  |  |  | 		// Passed validation
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		// No bane placed.  We're done!
 |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		 |  |  |  | 		 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return  true; |  |  |  | 		return  true; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 |  |  |  | 	 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	private boolean placeTreeOfLife(PlayerCharacter playerCharacter, ClientConnection origin, PlaceAssetMsg msg) { |  |  |  | 	private boolean placeTreeOfLife(PlayerCharacter playerCharacter, ClientConnection origin, PlaceAssetMsg msg) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Realm serverRealm; |  |  |  | 		Realm serverRealm; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Zone serverZone; |  |  |  | 		Zone serverZone; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		ArrayList<AbstractGameObject> cityObjects; // MySql result set
 |  |  |  | 		ArrayList<AbstractGameObject> cityObjects; // MySql result set
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		HashMap<GameObjectType, AbstractGameObject> cityObjectMap = new HashMap<>(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		PlacementInfo treeInfo; |  |  |  | 		PlacementInfo treeInfo; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Building treeObject = null; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		City cityObject = null; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Zone cityZone = null; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		Guild playerNation; |  |  |  | 		Guild playerNation; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		PlacementInfo treePlacement = msg.getFirstPlacementInfo(); |  |  |  | 		PlacementInfo treePlacement = msg.getFirstPlacementInfo(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		Building treeObject; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		City cityObject; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		Zone zoneObject; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Setup working variables we'll need
 |  |  |  | 		// Setup working variables we'll need
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -512,59 +525,49 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Assign our worker variables after figuring out what
 |  |  |  | 		// Assign our worker variables after figuring out what
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// is what in the result set.
 |  |  |  | 		// is what in the result set.
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		for (AbstractGameObject gameObject : cityObjects) { |  |  |  | 		for (AbstractGameObject gameObject : cityObjects) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			cityObjectMap.put(gameObject.getObjectType(), gameObject); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			switch (gameObject.getObjectType()) { |  |  |  | 		treeObject = (Building) cityObjectMap.get(GameObjectType.Building); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				case Building: |  |  |  | 		treeObject.runAfterLoad();; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					treeObject = (Building) gameObject; |  |  |  | 		cityObject = (City) cityObjectMap.get(GameObjectType.City); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					treeObject.runAfterLoad(); |  |  |  | 		zoneObject = (Zone) cityObjectMap.get(GameObjectType.Zone); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					break; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				case City: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					cityObject = (City) gameObject; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					break; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				case Zone: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					cityZone = (Zone) gameObject; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					break; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				default: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					// log some error here? *** Refactor
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		//?? your not allowed to plant a tree if ur not an errant guild.
 |  |  |  | 		// not allowed to plant a tree if ur not an errant guild.
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		// Desub from any previous nation.
 |  |  |  | 		// Desub from any previous nation.
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// This should be done automatically in a method inside Guild *** Refactor
 |  |  |  | 		// This should be done automatically in a method inside Guild *** Refactor
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Player is now a Soverign guild, configure them as such.
 |  |  |  | 		// Player is now a Sovereign guild, configure them as such.
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		playerCharacter.getGuild().setNation(playerCharacter.getGuild()); |  |  |  | 		playerCharacter.getGuild().setNation(playerCharacter.getGuild()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		playerNation = playerCharacter.getGuild(); |  |  |  | 		playerNation = playerCharacter.getGuild(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		playerNation.setGuildState(GuildState.Sovereign); |  |  |  | 		playerNation.setGuildState(GuildState.Sovereign); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Link the zone with the city and then add
 |  |  |  | 		// Link the zone with the city and then add
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// to the appropritae hash tables and cache
 |  |  |  | 		// to the appropriate hash tables and cache
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		cityZone.setPlayerCity(true); |  |  |  | 		zoneObject.setPlayerCity(true); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (cityZone.getParent() != null) |  |  |  | 		if (zoneObject.getParent() != null) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			cityZone.getParent().addNode(cityZone); //add as child to parent
 |  |  |  | 			zoneObject.getParent().addNode(zoneObject); //add as child to parent
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		ZoneManager.addZone(cityZone.getObjectUUID(), cityZone); |  |  |  | 		ZoneManager.addZone(zoneObject.getObjectUUID(), zoneObject); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		ZoneManager.addPlayerCityZone(cityZone); |  |  |  | 		ZoneManager.addPlayerCityZone(zoneObject); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		serverZone.addNode(cityZone); |  |  |  | 		serverZone.addNode(zoneObject); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		cityZone.generateWorldAltitude(); |  |  |  | 		zoneObject.generateWorldAltitude(); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		cityObject.setParent(cityZone); |  |  |  | 		cityObject.setParent(zoneObject); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		cityObject.setObjectTypeMask(MBServerStatics.MASK_CITY); // *** Refactor : should have it already
 |  |  |  | 		cityObject.setObjectTypeMask(MBServerStatics.MASK_CITY); // *** Refactor : should have it already
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		//Link the tree of life with the new zone
 |  |  |  | 		//Link the tree of life with the new zone
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		treeObject.setObjectTypeMask(MBServerStatics.MASK_BUILDING); |  |  |  | 		treeObject.setObjectTypeMask(MBServerStatics.MASK_BUILDING); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		treeObject.setParentZone(cityZone); |  |  |  | 		treeObject.setParentZone(zoneObject); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		MaintenanceManager.setMaintDateTime(treeObject, LocalDateTime.now().plusDays(7)); |  |  |  | 		MaintenanceManager.setMaintDateTime(treeObject, LocalDateTime.now().plusDays(7)); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Update guild binds and tags
 |  |  |  | 		// Update guild binds and tags
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		//load the new city on the clients
 |  |  |  | 		//load the new city on the clients
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		CityZoneMsg czm = new CityZoneMsg(1, treeObject.getLoc().x, treeObject.getLoc().y, treeObject.getLoc().z, cityObject.getCityName(), cityZone, Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents); |  |  |  | 		CityZoneMsg czm = new CityZoneMsg(1, treeObject.getLoc().x, treeObject.getLoc().y, treeObject.getLoc().z, cityObject.getCityName(), zoneObject, Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		DispatchMessage.dispatchMsgToAll(czm); |  |  |  | 		DispatchMessage.dispatchMsgToAll(czm); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		GuildManager.updateAllGuildBinds(playerNation, cityObject); |  |  |  | 		GuildManager.updateAllGuildBinds(playerNation, cityObject); | 
			
		
	
	
		
		
			
				
					|  |  | @ -687,7 +690,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		cityObject = City.getCity(serverZone.getPlayerCityUUID()); |  |  |  | 		cityObject = City.getCity(serverZone.getPlayerCityUUID()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Cannot place shrine in abanadoned city.  Shrines must be owned
 |  |  |  | 		// Cannot place shrine in abandoned city.  Shrines must be owned
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		// by the tol owner not the person placing them.
 |  |  |  | 		// by the tol owner not the person placing them.
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (cityObject.getTOL().getOwnerUUID() == 0) { |  |  |  | 		if (cityObject.getTOL().getOwnerUUID() == 0) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -756,7 +759,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		cityObject = City.getCity(serverZone.getPlayerCityUUID()); |  |  |  | 		cityObject = City.getCity(serverZone.getPlayerCityUUID()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Cannot place barracks in abanadoned city.
 |  |  |  | 		// Cannot place barracks in abandoned city.
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (cityObject.getTOL().getOwnerUUID() == 0) { |  |  |  | 		if (cityObject.getTOL().getOwnerUUID() == 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 42, "");  //Tree cannot support anymore shrines
 |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 42, "");  //Tree cannot support anymore shrines
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1025,11 +1028,11 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		blueprint = Blueprint.getBlueprint(buildingInfo.getBlueprintUUID()); |  |  |  | 		blueprint = Blueprint.getBlueprint(buildingInfo.getBlueprintUUID()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (blueprint == null) { |  |  |  | 		if (blueprint == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Logger.error("CreateStucture: DB returned null blueprint."); |  |  |  | 			Logger.error("CreateStructure: DB returned null blueprint."); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			return null; |  |  |  | 			return null; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// All seige buildings build in 15 minutes
 |  |  |  | 		// All siege buildings build in 15 minutes
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		if ((blueprint.getBuildingGroup().equals(BuildingGroup.SIEGETENT)) |  |  |  | 		if ((blueprint.getBuildingGroup().equals(BuildingGroup.SIEGETENT)) | 
			
		
	
		
		
			
				
					
					|  |  |  | 				|| (blueprint.getBuildingGroup().equals(BuildingGroup.BULWARK))) |  |  |  | 				|| (blueprint.getBuildingGroup().equals(BuildingGroup.BULWARK))) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			completionDate = DateTime.now().plusMinutes(15); |  |  |  | 			completionDate = DateTime.now().plusMinutes(15); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1050,7 +1053,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Make sure we have a valid mesh
 |  |  |  | 		// Make sure we have a valid mesh
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (newMesh == null) { |  |  |  | 		if (newMesh == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Logger.error("CreateStucture: DB returned null object."); |  |  |  | 			Logger.error("CreateStructure: DB returned null object."); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			return null; |  |  |  | 			return null; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1168,7 +1171,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Make sure we have a valid mesh
 |  |  |  | 		// Make sure we have a valid mesh
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (newMesh == null) { |  |  |  | 		if (newMesh == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Logger.error("CreateStucture: DB returned null object."); |  |  |  | 			Logger.error("CreateStructure: DB returned null object."); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1237,85 +1240,23 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		RealmType currentRealm; |  |  |  | 		RealmType currentRealm; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if(Blueprint.getBlueprint(placementInfo.getBlueprintUUID()).isSiegeEquip() == false) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (serverZone.isPlayerCity() == false) { |  |  |  | 			if (serverZone.isPlayerCity() == false) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 52, player.getName()); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 				return false; |  |  |  | 				return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 			City city = ZoneManager.getCityAtLocation(placementInfo.getLoc()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (player.getGuild().equals(city.getGuild()) == false) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (city.isLocationOnCityGrid(placementInfo.getLoc()) == false) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		else |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			City city = ZoneManager.getCityAtLocation(placementInfo.getLoc()); |  |  |  | 			City city = ZoneManager.getCityAtLocation(placementInfo.getLoc()); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if(city == null) |  |  |  | 			if (player.getGuild().equals(city.getGuild()) == false) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 40, player.getName()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			Bane bane = city.getBane(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			//check if player is owner/IC of tree or bane
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (player.getGuild().equals(city.getGuild()) == true) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				//is from owners guild
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if(GuildStatusController.isGuildLeader(player.getGuildStatus()) == false && GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			else |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				//is not from owners guild
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if(bane == null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					//bane was null
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if(city == null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					//city was null
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				//check if player is from siege guild
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if(player.getGuild().equals(bane.getOwner().getGuild()) == false) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 				return false; |  |  |  | 				return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 				//check if player is GL or IC of the bane guild
 |  |  |  | 			if (city.isLocationOnCityGrid(placementInfo.getLoc()) == false) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				if(GuildStatusController.isGuildLeader(player.getGuildStatus()) == false && GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false) |  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 41, player.getName()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 				return false; |  |  |  | 				return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 				//cannot place on grid until bane is live
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if(bane.getSiegePhase() != SiegePhase.WAR && city.isLocationOnCityGrid(placementInfo.getLoc()) == true) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if(city.isLocationWithinSiegeBounds(placementInfo.getLoc()) == false && city.isLocationOnCityZone(placementInfo.getLoc()) == false) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 					return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Retrieve the building details we're placing
 |  |  |  | 		// Retrieve the building details we're placing
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverZone.isNPCCity() == true) { |  |  |  | 		if (serverZone.isNPCCity() == true) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1369,6 +1310,15 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if (placementCollisionCheck(serverZone, origin, placementInfo)){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 3, ""); // Conflict between proposed assets
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	private static boolean placementCollisionCheck(Zone serverZone, ClientConnection origin, PlacementInfo placementInfo) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Overlap check
 |  |  |  | 		// Overlap check
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		for (Building building : serverZone.zoneBuildingSet) { |  |  |  | 		for (Building building : serverZone.zoneBuildingSet) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1396,16 +1346,15 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 3, "");  // Conflict between proposed assets
 |  |  |  | 				PlaceAssetMsg.sendPlaceAssetError(origin, 3, "");  // Conflict between proposed assets
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 				return false; |  |  |  | 				return true; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 		return false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return true; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	private static boolean validateCityBuildingPlacement(Zone serverZone, PlaceAssetMsg msg, ClientConnection origin, PlayerCharacter player, PlacementInfo buildingInfo) { |  |  |  | 	private static boolean validateCityBuildingPlacement(Zone serverZone, PlaceAssetMsg msg, ClientConnection origin, PlayerCharacter player, PlacementInfo buildingInfo) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Peform shared common validation first
 |  |  |  | 		// Perform shared common validation first
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (validateBuildingPlacement(serverZone, msg, origin, player, buildingInfo) == false) |  |  |  | 		if (validateBuildingPlacement(serverZone, msg, origin, player, buildingInfo) == false) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
	
		
		
			
				
					|  |  | @ -1413,7 +1362,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Must be a player city
 |  |  |  | 		// Must be a player city
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (serverZone.isPlayerCity() == false) { |  |  |  | 		if (serverZone.isPlayerCity() == false) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 41, player.getName()); // Cannot place outisde a guild zone
 |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 41, player.getName()); // Cannot place outside a guild zone
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1429,7 +1378,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// City assets must be placed on the city grid
 |  |  |  | 		// City assets must be placed on the city grid
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (!city.isLocationOnCityGrid(buildingInfo.getLoc())) { |  |  |  | 		if (!city.isLocationOnCityGrid(buildingInfo.getLoc())) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 1, "Assset must be placed on a City Grid"); |  |  |  | 			PlaceAssetMsg.sendPlaceAssetError(origin, 52, ""); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |