Browse Source

Extract siege limits validation method.

master
MagicBot 2 years ago
parent
commit
d8dad9f087
  1. 119
      src/engine/net/client/handlers/PlaceAssetMsgHandler.java

119
src/engine/net/client/handlers/PlaceAssetMsgHandler.java

@ -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;

Loading…
Cancel
Save