Browse Source

Extract siege limits validation method.

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

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

@ -308,8 +308,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { @@ -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 { @@ -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 { @@ -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<AbstractWorldObject> 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<AbstractWorldObject> 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;

Loading…
Cancel
Save