Public Repository for the Magicbane Shadowbane Emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
6.5 KiB

package engine.net.client.handlers;
import engine.Enum;
import engine.Enum.BuildingGroup;
import engine.Enum.GuildState;
import engine.exception.MsgSendException;
import engine.gameManager.*;
import engine.net.client.ClientConnection;
import engine.net.client.msg.AbandonAssetMsg;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg;
import engine.objects.*;
import org.pmw.tinylog.Logger;
/*
* @Author:
* @Summary: Processes application protocol message which processes
* client requests to abandon a building.
*/
public class AbandonAssetMsgHandler extends AbstractClientMsgHandler {
// Instance variables
public AbandonAssetMsgHandler() {
super(AbandonAssetMsg.class);
}
@Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
// Member variable declaration
PlayerCharacter player;
Building building;
AbandonAssetMsg msg;
// Member variable assignment
msg = (AbandonAssetMsg) baseMsg;
player = origin.getPlayerCharacter();
building = BuildingManager.getBuildingFromCache(msg.getUUID());
// Oops! *** Refactor: Log error
if ((player == null) || (building == null))
return true;
// Early exit if object is not owned by the player
if (building.getOwnerUUID() != player.getObjectUUID())
return true;
// Cannot abandon a building without a blueprint.
// Players do not own rocks or shrubbery.
if (building.getBlueprintUUID() == 0)
return true;
// Players cannot abandon shrines
if ((building.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE)) {
ErrorPopupMsg.sendErrorMsg(player, "Cannot for to abandon shrine!");
return true;
}
if ((building.getBlueprint().getBuildingGroup() == BuildingGroup.MINE)) {
ErrorPopupMsg.sendErrorMsg(player, "Cannot abandon mine!");
return true;
}
if (Blueprint.isMeshWallPiece(building.getBlueprintUUID())) {
ErrorPopupMsg.sendErrorMsg(player, "Cannot for to abandon fortress asset!");
return true;
}
if ((building.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK)) {
ErrorPopupMsg.sendErrorMsg(player, "Cannot for to abandon fortress asset!");
return true;
}
if ((building.getBlueprint().getBuildingGroup() == BuildingGroup.BULWARK)) {
ErrorPopupMsg.sendErrorMsg(player, "Cannot for to abandon siege asset!");
return true;
}
if ((building.getBlueprint().getBuildingGroup() == BuildingGroup.SIEGETENT)) {
ErrorPopupMsg.sendErrorMsg(player, "Cannot for to abandon siege asset!");
return true;
}
if ((building.getBlueprint().getBuildingGroup() == BuildingGroup.BANESTONE)) {
ErrorPopupMsg.sendErrorMsg(player, "Cannot for to abandon banestone!");
return true;
}
// Trees require special handling beyond an individual building
if ((building.getBlueprint().getBuildingGroup() == BuildingGroup.TOL))
{
// CHECK IF GUILD HAS A BANE DROPPED
City city = ZoneManager.getCityAtLocation(building.getLoc());
if(city.getGuild().getSubGuildList().isEmpty() == false)
{
//nations cant abandon their tree
ErrorPopupMsg.sendErrorMsg(player, "Nations Cannot Abandon Their Capital!");
return true;
}
if(Bane.getBaneByAttackerGuild(city.getGuild()) != null)
{
ErrorPopupMsg.sendErrorMsg(player, "You Cannot Abandon Your Tree With An Active Siege!");
return true;
}
AbandonAllCityObjects(player, building);
}
else
AbandonSingleAsset(player, building);
return true;
}
private static void AbandonSingleAsset(PlayerCharacter sourcePlayer,
Building targetBuilding) {
// Transfer the building asset ownership and refresh all clients
DbManager.BuildingQueries.CLEAR_FRIENDS_LIST(targetBuilding.getObjectUUID());
targetBuilding.getFriends().clear();
// Clear protection status but only if a seige building
if (targetBuilding.getBlueprint().getBuildingGroup().equals(BuildingGroup.BULWARK) ||
targetBuilding.getBlueprint().getBuildingGroup().equals(BuildingGroup.SIEGETENT))
targetBuilding.setProtectionState(Enum.ProtectionState.NONE);
DbManager.BuildingQueries.CLEAR_CONDEMNED_LIST(targetBuilding.getObjectUUID());
targetBuilding.getCondemned().clear();
targetBuilding.setOwner(null);
targetBuilding.refreshGuild();
}
private void AbandonAllCityObjects(PlayerCharacter sourcePlayer,
Building targetBuilding) {
Guild sourceGuild;
Zone cityZone;
sourceGuild = sourcePlayer.getGuild();
if (sourceGuild == null)
return;
if (sourceGuild.getSubGuildList().size() > 0) {
ChatManager.chatCityError(sourcePlayer, "You Cannot abandon a nation city.");
return;
}
cityZone = ZoneManager.findSmallestZone(targetBuilding.getLoc());
// Can't abandon a tree not within a player city zone
if (cityZone.isPlayerCity() == false)
return;
if (targetBuilding.getCity() == null)
return;
if (targetBuilding.getCity().getBane() != null){
ErrorPopupMsg.sendErrorMsg(sourcePlayer, "Can't abandon Tree while a bane exists.");
return;
}
if (targetBuilding.getCity().hasBeenTransfered == true) {
ChatManager.chatCityError(sourcePlayer, "City can only be abandoned once per rebooting.");
return;
}
// Guild no longer owns his tree.
if (!DbManager.GuildQueries.SET_GUILD_OWNED_CITY(sourceGuild.getObjectUUID(), 0)) {
Logger.error("Failed to update Owned City to Database");
return;
}
sourceGuild.setCityUUID(0);
sourceGuild.setGuildState(GuildState.Errant);
sourceGuild.setNation(null);
// Transfer the city assets
TransferCityAssets(sourcePlayer, targetBuilding);
GuildManager.updateAllGuildTags(sourceGuild);
GuildManager.updateAllGuildBinds(sourceGuild, null);
}
private void TransferCityAssets(PlayerCharacter sourcePlayer,
Building cityTOL) {
Zone cityZone;
// Build list of buildings within this parent zone
cityZone = ZoneManager.findSmallestZone(cityTOL.getLoc());
for (Building cityBuilding : cityZone.zoneBuildingSet) {
Blueprint cityBlueprint;
cityBlueprint = cityBuilding.getBlueprint();
// Buildings without blueprints cannot be abandoned
if (cityBlueprint == null)
continue;
// Transfer ownership of valid city assets
if ((cityBlueprint.getBuildingGroup() == BuildingGroup.TOL)
|| (cityBlueprint.getBuildingGroup() == BuildingGroup.SPIRE)
|| (cityBlueprint.getBuildingGroup() == BuildingGroup.BARRACK)
|| (cityBlueprint.isWallPiece())
|| (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE))
AbandonSingleAsset(sourcePlayer, cityBuilding);
}
}
}