From d8dad9f08769c3bc2bf85b277905845399d8ef91 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Sat, 14 Jan 2023 15:07:35 -0500 Subject: [PATCH] Extract siege limits validation method. --- .../client/handlers/PlaceAssetMsgHandler.java | 127 +++++++++--------- 1 file changed, 66 insertions(+), 61 deletions(-) diff --git a/src/engine/net/client/handlers/PlaceAssetMsgHandler.java b/src/engine/net/client/handlers/PlaceAssetMsgHandler.java index f983bfeb..02334ea6 100644 --- a/src/engine/net/client/handlers/PlaceAssetMsgHandler.java +++ b/src/engine/net/client/handlers/PlaceAssetMsgHandler.java @@ -308,8 +308,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { Building siegeBuilding; PlacementInfo buildingList; City serverCity; - int numAttackerBuildings = 0; - int numDefenderBuildings = 0; // Retrieve the building details we're placing @@ -359,8 +357,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { serverCity = player.getGuild().getOwnedCity(); } - - if ((serverCity != null) && (serverCity.getBane() != null)) { @@ -377,95 +373,104 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { } // cant place siege equipment off city zone. - - + // Create the siege Building siegeBuilding = createStructure(player, msg.getFirstPlacementInfo(), serverZone); - if (serverCity == null) - return true; + // Oops something went really wrong if (siegeBuilding == null) return false; - - if (serverCity.getBane() == null) + // 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 (validateSiegeLimits(player, origin, serverCity.getBane()) == false) return true; + + // passes validation: can assign auto-protection to war asset - // If there is an bane placed, we protect 2x the stone rank's worth of attacker assets + if (serverCity.getBane() != null) + if (serverCity.isLocationOnCityGrid(siegeBuilding.getBounds())) + if (player.getGuild().equals(serverCity.getBane().getOwner().getGuild())) + return true; - // and 1x the tree rank's worth of assets automatically + siegeBuilding.setProtectionState(ProtectionState.PROTECTED); + + // No bane placed. We're done! + + return true; + } - HashSet awoList = WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING); + private boolean validateSiegeLimits(PlayerCharacter playerCharacter, ClientConnection origin, Bane bane) { - for (AbstractWorldObject awo : awoList) { - Building building = (Building)awo; + City serverCity = bane.getCity(); + HashSet awoList; + + int maxAttackerAssets = serverCity.getBane().getStone().getRank() * 2; + int maxDefenderAssets = serverCity.getRank(); + int numDefenderBuildings = 0; + int numAttackerBuildings = 0; + + // Count bow for attackers and defenders - if (building.getBlueprint() != null) - if (!building.getBlueprint().isSiegeEquip()) - continue; + awoList = WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING); - if (!building.getLoc().isInsideCircle(serverCity.getLoc(), Enum.CityBoundsType.SIEGE.extents)) - continue; + for (AbstractWorldObject awo : awoList) { + Building building = (Building) awo; - if (building.getGuild() == null) + if (building.getBlueprint() != null) + if (!building.getBlueprint().isSiegeEquip()) continue; - if (building.getGuild().isErrant()) - continue; + if (!building.getLoc().isInsideCircle(serverCity.getLoc(), Enum.CityBoundsType.SIEGE.extents)) + continue; - if (!building.getGuild().equals(serverCity.getGuild()) && !building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) - continue; + if (building.getGuild() == null) + continue; - // Only count auto protected buildings - if (building.getProtectionState() != ProtectionState.PROTECTED) - continue; + if (building.getGuild().isErrant()) + continue; - if (building.getGuild().equals(serverCity.getGuild())) - numDefenderBuildings++; - else if (building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) - numAttackerBuildings++; + if (!building.getGuild().equals(serverCity.getGuild()) && !building.getGuild().equals(serverCity.getBane().getOwner().getGuild())) + continue; - // Validate bane limits on siege assets + // Only count auto protected buildings + if (building.getProtectionState() != ProtectionState.PROTECTED) + continue; - int maxAttackerAssets = serverCity.getBane().getStone().getRank() * 2; - int maxDefenderAssets = serverCity.getRank(); + if (building.getGuild().equals(serverCity.getGuild())) + 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 - if(numDefenderBuildings >= maxDefenderAssets){ - PlaceAssetMsg.sendPlaceAssetError(origin,62, ""); - return true; + if (numDefenderBuildings >= maxDefenderAssets) { + PlaceAssetMsg.sendPlaceAssetError(origin, 62, ""); + return false; } } - else if(player.getGuild().equals(serverCity.getBane().getStone().getGuild())){ + + if (playerCharacter.getGuild().equals(serverCity.getBane().getStone().getGuild())) { //attacker attempting to place asset - if(numAttackerBuildings >= maxAttackerAssets){ - PlaceAssetMsg.sendPlaceAssetError(origin,61, ""); - return true; + if (numAttackerBuildings >= maxAttackerAssets) { + PlaceAssetMsg.sendPlaceAssetError(origin, 61, ""); + 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! - - - return true; + // Passed validation + + return true; } - + + private boolean placeTreeOfLife(PlayerCharacter playerCharacter, ClientConnection origin, PlaceAssetMsg msg) { Realm serverRealm;