Browse Source

Extract siege limits validation method.

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

73
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,26 +374,48 @@ 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 (validateSiegeLimits(player, origin, serverCity.getBane()) == false)
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!
if (serverCity.getBane() == null)
return true; return true;
}
private boolean validateSiegeLimits(PlayerCharacter playerCharacter, ClientConnection origin, Bane bane) {
// If there is an bane placed, we protect 2x the stone rank's worth of attacker assets City serverCity = bane.getCity();
HashSet<AbstractWorldObject> awoList;
// and 1x the tree rank's worth of assets automatically int maxAttackerAssets = serverCity.getBane().getStone().getRank() * 2;
int maxDefenderAssets = serverCity.getRank();
int numDefenderBuildings = 0;
int numAttackerBuildings = 0;
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING); // Count bow for attackers and defenders
awoList = WorldGrid.getObjectsInRangePartial(serverCity, 1000, MBServerStatics.MASK_BUILDING);
for (AbstractWorldObject awo : awoList) { for (AbstractWorldObject awo : awoList) {
Building building = (Building) awo; Building building = (Building) awo;
@ -424,48 +442,35 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
if (building.getGuild().equals(serverCity.getGuild())) if (building.getGuild().equals(serverCity.getGuild()))
numDefenderBuildings++; numDefenderBuildings++;
else if (building.getGuild().equals(serverCity.getBane().getOwner().getGuild()))
if (building.getGuild().equals(serverCity.getBane().getOwner().getGuild()))
numAttackerBuildings++; numAttackerBuildings++;
// Validate bane limits on siege assets // Validate bane limits on siege assets
int maxAttackerAssets = serverCity.getBane().getStone().getRank() * 2; if (playerCharacter.getGuild().equals(serverCity.getGuild())) {
int maxDefenderAssets = serverCity.getRank();
if(player.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 }
// Passed validation
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; 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