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.

94 lines
2.4 KiB

package engine.net.client.handlers;
import engine.Enum;
import engine.Enum.BuildingGroup;
import engine.InterestManagement.WorldGrid;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.DestroyBuildingMsg;
import engine.net.client.msg.ErrorPopupMsg;
import engine.objects.*;
/*
* @Author:
* @Summary: Processes application protocol message where the
* client is requesting a building be destroyed.
*/
public class DestroyBuildingHandler extends AbstractClientMsgHandler {
public DestroyBuildingHandler() {
super(DestroyBuildingMsg.class);
}
@Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
PlayerCharacter pc = origin.getPlayerCharacter();
DestroyBuildingMsg msg;
msg = (DestroyBuildingMsg) baseMsg;
int buildingUUID = msg.getUUID();
Building building = BuildingManager.getBuildingFromCache(buildingUUID);
;
if (pc == null || building == null)
return true;
Blueprint blueprint;
blueprint = building.getBlueprint();
City city = building.getCity();
// Can't destroy buildings without a blueprint.
if (blueprint == null)
return true;
// Cannot destroy Oblivion database derived buildings.
if (building.getProtectionState() == Enum.ProtectionState.NPC) {
return true;
}
if (!BuildingManager.PlayerCanControlNotOwner(building, pc))
return true;
Bane bane = city.getBane();
if(bane.getSiegePhase() == Enum.SiegePhase.WAR && bane != null) {
ErrorPopupMsg.sendErrorPopup(pc, 171);
return true;
}
// Can't destroy a tree of life
if (blueprint.getBuildingGroup() == BuildingGroup.TOL)
return true;
// Can't destroy a shrine
if (blueprint.getBuildingGroup() == BuildingGroup.SHRINE)
return true;
if (blueprint.getBuildingGroup() == BuildingGroup.MINE)
return true;
if (blueprint.getBuildingGroup() == BuildingGroup.RUNEGATE)
return true;
//stop if active siege
// Turn off spire if destoying
if (blueprint.getBuildingGroup() == BuildingGroup.SPIRE)
building.disableSpire(true);
if (blueprint.getBuildingGroup() == BuildingGroup.WAREHOUSE) {
if (city != null)
city.setWarehouseBuildingID(0);
}
building.setRank(-1);
WorldGrid.RemoveWorldObject(building);
WorldGrid.removeObject(building);
building.getParentZone().zoneBuildingSet.remove(building);
return true;
}
}