|
|
@ -308,8 +308,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { |
|
|
|
Building siegeBuilding; |
|
|
|
Building siegeBuilding; |
|
|
|
PlacementInfo buildingList; |
|
|
|
PlacementInfo buildingList; |
|
|
|
City serverCity; |
|
|
|
City serverCity; |
|
|
|
int numAttackerBuildings = 0; |
|
|
|
|
|
|
|
int numDefenderBuildings = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Retrieve the building details we're placing
|
|
|
|
// Retrieve the building details we're placing
|
|
|
|
|
|
|
|
|
|
|
@ -359,8 +357,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { |
|
|
|
serverCity = player.getGuild().getOwnedCity(); |
|
|
|
serverCity = player.getGuild().getOwnedCity(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((serverCity != null) && |
|
|
|
if ((serverCity != null) && |
|
|
|
(serverCity.getBane() != null)) { |
|
|
|
(serverCity.getBane() != null)) { |
|
|
|
|
|
|
|
|
|
|
@ -378,94 +374,103 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { |
|
|
|
|
|
|
|
|
|
|
|
// cant place siege equipment off city zone.
|
|
|
|
// cant place siege equipment off city zone.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 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; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If there is a bane placed, we limit placement to 2x the stone rank's worth of attacker assets
|
|
|
|
|
|
|
|
// and 1x the tree rank for defenders
|
|
|
|
|
|
|
|
|
|
|
|
if (serverCity.getBane() == null) |
|
|
|
if (validateSiegeLimits(player, origin, serverCity.getBane()) == false) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
// If there is an bane placed, we protect 2x the stone rank's worth of attacker assets
|
|
|
|
// passes validation: can assign auto-protection to war asset
|
|
|
|
|
|
|
|
|
|
|
|
// and 1x the tree rank's worth of assets automatically
|
|
|
|
if (serverCity.getBane() != null) |
|
|
|
|
|
|
|
if (serverCity.isLocationOnCityGrid(siegeBuilding.getBounds())) |
|
|
|
|
|
|
|
if (player.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING); |
|
|
|
siegeBuilding.setProtectionState(ProtectionState.PROTECTED); |
|
|
|
|
|
|
|
|
|
|
|
for (AbstractWorldObject awo : awoList) { |
|
|
|
// No bane placed. We're done!
|
|
|
|
Building building = (Building)awo; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (building.getBlueprint() != null) |
|
|
|
return true; |
|
|
|
if (!building.getBlueprint().isSiegeEquip()) |
|
|
|
} |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!building.getLoc().isInsideCircle(serverCity.getLoc(), Enum.CityBoundsType.SIEGE.extents)) |
|
|
|
private boolean validateSiegeLimits(PlayerCharacter playerCharacter, ClientConnection origin, Bane bane) { |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (building.getGuild() == null) |
|
|
|
City serverCity = bane.getCity(); |
|
|
|
continue; |
|
|
|
HashSet<AbstractWorldObject> awoList; |
|
|
|
|
|
|
|
|
|
|
|
if (building.getGuild().isErrant()) |
|
|
|
int maxAttackerAssets = serverCity.getBane().getStone().getRank() * 2; |
|
|
|
continue; |
|
|
|
int maxDefenderAssets = serverCity.getRank(); |
|
|
|
|
|
|
|
int numDefenderBuildings = 0; |
|
|
|
|
|
|
|
int numAttackerBuildings = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!building.getGuild().equals(serverCity.getGuild()) && !building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |
|
|
|
// Count bow for attackers and defenders
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
awoList = WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (AbstractWorldObject awo : awoList) { |
|
|
|
|
|
|
|
Building building = (Building) awo; |
|
|
|
|
|
|
|
|
|
|
|
// Only count auto protected buildings
|
|
|
|
if (building.getBlueprint() != null) |
|
|
|
if (building.getProtectionState() != ProtectionState.PROTECTED) |
|
|
|
if (!building.getBlueprint().isSiegeEquip()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
if (building.getGuild().equals(serverCity.getGuild())) |
|
|
|
if (!building.getLoc().isInsideCircle(serverCity.getLoc(), Enum.CityBoundsType.SIEGE.extents)) |
|
|
|
numDefenderBuildings++; |
|
|
|
continue; |
|
|
|
else if (building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |
|
|
|
|
|
|
|
numAttackerBuildings++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Validate bane limits on siege assets
|
|
|
|
if (building.getGuild() == null) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (building.getGuild().isErrant()) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!building.getGuild().equals(serverCity.getGuild()) && !building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Only count auto protected buildings
|
|
|
|
|
|
|
|
if (building.getProtectionState() != ProtectionState.PROTECTED) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
int maxAttackerAssets = serverCity.getBane().getStone().getRank() * 2; |
|
|
|
if (building.getGuild().equals(serverCity.getGuild())) |
|
|
|
int maxDefenderAssets = serverCity.getRank(); |
|
|
|
numDefenderBuildings++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |
|
|
|
|
|
|
|
numAttackerBuildings++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Validate bane limits on siege assets
|
|
|
|
|
|
|
|
|
|
|
|
if(player.getGuild().equals(serverCity.getGuild())){ |
|
|
|
if (playerCharacter.getGuild().equals(serverCity.getGuild())) { |
|
|
|
//defender attempting to place asset
|
|
|
|
//defender attempting to place asset
|
|
|
|
if(numDefenderBuildings >= maxDefenderAssets){ |
|
|
|
if (numDefenderBuildings >= maxDefenderAssets) { |
|
|
|
PlaceAssetMsg.sendPlaceAssetError(origin,62, ""); |
|
|
|
PlaceAssetMsg.sendPlaceAssetError(origin, 62, ""); |
|
|
|
return true; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else if(player.getGuild().equals(serverCity.getBane().getStone().getGuild())){ |
|
|
|
|
|
|
|
|
|
|
|
if (playerCharacter.getGuild().equals(serverCity.getBane().getStone().getGuild())) { |
|
|
|
//attacker attempting to place asset
|
|
|
|
//attacker attempting to place asset
|
|
|
|
if(numAttackerBuildings >= maxAttackerAssets){ |
|
|
|
if (numAttackerBuildings >= maxAttackerAssets) { |
|
|
|
PlaceAssetMsg.sendPlaceAssetError(origin,61, ""); |
|
|
|
PlaceAssetMsg.sendPlaceAssetError(origin, 61, ""); |
|
|
|
return true; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else{ |
|
|
|
|
|
|
|
//third party attempting to place asset, early exit
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// passes validation: can assign auto-protection to war asset
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (serverCity.getBane() != null) |
|
|
|
|
|
|
|
if (serverCity.isLocationOnCityGrid(siegeBuilding.getBounds())) |
|
|
|
|
|
|
|
if (player.getGuild().equals(serverCity.getBane().getOwner().getGuild())) |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
siegeBuilding.setProtectionState(ProtectionState.PROTECTED); |
|
|
|
|
|
|
|
// No bane placed. We're done!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// Passed validation
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
|