|
|
|
package engine.net.client.handlers;
|
|
|
|
|
|
|
|
import engine.Enum;
|
|
|
|
import engine.Enum.DispatchChannel;
|
|
|
|
import engine.Enum.GameObjectType;
|
|
|
|
import engine.exception.MsgSendException;
|
|
|
|
import engine.gameManager.BuildingManager;
|
|
|
|
import engine.gameManager.SessionManager;
|
|
|
|
import engine.gameManager.ZoneManager;
|
|
|
|
import engine.math.Bounds;
|
|
|
|
import engine.net.Dispatch;
|
|
|
|
import engine.net.DispatchMessage;
|
|
|
|
import engine.net.client.ClientConnection;
|
|
|
|
import engine.net.client.msg.ClientNetMsg;
|
|
|
|
import engine.net.client.msg.ErrorPopupMsg;
|
|
|
|
import engine.net.client.msg.ManageCityAssetsMsg;
|
|
|
|
import engine.net.client.msg.PlaceAssetMsg;
|
|
|
|
import engine.objects.*;
|
|
|
|
import org.joda.time.DateTime;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @Author:
|
|
|
|
* @Summary: Processes application protocol message which opens
|
|
|
|
* and processes the various building asset management windows.
|
|
|
|
*/
|
|
|
|
public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|
|
|
|
|
|
|
public ManageCityAssetMsgHandler() {
|
|
|
|
super(ManageCityAssetsMsg.class);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean playerCanManageNotFriends(PlayerCharacter player, Building building) {
|
|
|
|
|
|
|
|
//Player Can only Control Building if player is in Same Guild as Building and is higher rank than IC.
|
|
|
|
|
|
|
|
if (player == null)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (building.getRank() == -1)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (BuildingManager.IsOwner(building, player))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false && GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
//Somehow guild leader check fails above? lets check if Player is true Guild GL.
|
|
|
|
if (building.getGuild() != null && building.getGuild().isGuildLeader(player.getObjectUUID()))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return Guild.sameGuild(building.getGuild(), player.getGuild());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
|
|
|
|
|
|
|
|
ManageCityAssetsMsg msg;
|
|
|
|
PlayerCharacter player;
|
|
|
|
ManageCityAssetsMsg outMsg;
|
|
|
|
Building building;
|
|
|
|
|
|
|
|
msg = (ManageCityAssetsMsg) baseMsg;
|
|
|
|
|
|
|
|
player = SessionManager.getPlayerCharacter(origin);
|
|
|
|
|
|
|
|
if (player == null)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
building = BuildingManager.getBuildingFromCache(msg.getTargetID());
|
|
|
|
|
|
|
|
if (building == null) {
|
|
|
|
if (msg.actionType == 14) {
|
|
|
|
|
|
|
|
Zone zone = ZoneManager.findSmallestZone(player.getLoc());
|
|
|
|
|
|
|
|
if (!zone.isPlayerCity) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
City city = City.GetCityFromCache(zone.playerCityID);
|
|
|
|
|
|
|
|
if (city == null) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!city.getGuild().equals(player.getGuild())) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "You are not in the correct guild to command this city.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!GuildStatusController.isInnerCouncil(player.getGuildStatus()) && !GuildStatusController.isGuildLeader(player.getGuildStatus())) {
|
|
|
|
ErrorPopupMsg.sendErrorMsg(player, "You must be an Inner Council or Guild leader to access city commands.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
|
|
|
mca.actionType = 15;
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, mca);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
outMsg = new ManageCityAssetsMsg(player, building);
|
|
|
|
|
|
|
|
if (player.isSafeMode()) {
|
|
|
|
outMsg.actionType = 4;
|
|
|
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
|
|
|
outMsg.setTargetID(building.getObjectUUID());
|
|
|
|
outMsg.setAssetName(building.getName());
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msg.actionType == 2 || msg.actionType == 22) {
|
|
|
|
|
|
|
|
if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() == engine.Enum.BuildingGroup.BANESTONE) {
|
|
|
|
|
|
|
|
outMsg.actionType = 18;
|
|
|
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
|
|
|
outMsg.setTargetID(building.getObjectUUID());
|
|
|
|
|
|
|
|
} else if (BuildingManager.playerCanManage(player, building)) { //TODO allow Friends list.
|
|
|
|
configWindowState(player, building, outMsg);
|
|
|
|
outMsg.actionType = 3;
|
|
|
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
|
|
|
outMsg.setTargetID(building.getObjectUUID());
|
|
|
|
outMsg.setTargetType3(building.getObjectType().ordinal());
|
|
|
|
outMsg.setTargetID3(building.getObjectUUID());
|
|
|
|
outMsg.setUnknown54(1);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if (building.getBlueprintUUID() != 0)
|
|
|
|
switch (building.getBlueprint().getBuildingGroup()) {
|
|
|
|
case SHRINE:
|
|
|
|
if (building.getRank() == -1) {
|
|
|
|
if (!Bounds.collide(player.getLoc(), building)) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 64);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
Shrine shrine = Shrine.shrinesByBuildingUUID.get(building.getObjectUUID());
|
|
|
|
|
|
|
|
if (shrine == null)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if (shrine.getFavors() == 0) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 166); // There is no more favor in this shrine to loot
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
BuildingManager.lootBuilding(player, building);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case WAREHOUSE:
|
|
|
|
//TODO check
|
|
|
|
if (building.getRank() == -1) {
|
|
|
|
if (!Bounds.collide(player.getLoc(), building)) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 64);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
Warehouse warehouse = Warehouse.warehouseByBuildingUUID.get(building.getObjectUUID());
|
|
|
|
|
|
|
|
if (warehouse == null)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if (warehouse.isEmpty()) {
|
|
|
|
ErrorPopupMsg.sendErrorPopup(player, 167); // no more resources.
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
BuildingManager.lootBuilding(player, building);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (building.getRank() == -1)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
AbstractCharacter owner = building.getOwner();
|
|
|
|
|
|
|
|
//no owner, send building info
|
|
|
|
if (owner == null) {
|
|
|
|
msg.actionType = 4;
|
|
|
|
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, msg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
outMsg.actionType = 4;
|
|
|
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
|
|
|
outMsg.setTargetID(building.getObjectUUID());
|
|
|
|
outMsg.setAssetName(building.getName());
|
|
|
|
|
|
|
|
}
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msg.actionType == 13) {
|
|
|
|
outMsg.actionType = 13;
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//Rename Building.
|
|
|
|
|
|
|
|
if (msg.actionType == 5) {
|
|
|
|
|
|
|
|
//TODO we need to check names before allowing
|
|
|
|
building.setName(msg.getAssetName());
|
|
|
|
configWindowState(player, building, outMsg);
|
|
|
|
|
|
|
|
outMsg.actionType = 3;
|
|
|
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
|
|
|
outMsg.setTargetID(building.getObjectUUID());
|
|
|
|
outMsg.setTargetType3(GameObjectType.Building.ordinal());
|
|
|
|
outMsg.setTargetID3(building.getObjectUUID());
|
|
|
|
outMsg.setAssetName1(building.getName());
|
|
|
|
outMsg.setUnknown54(1);
|
|
|
|
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
//TOL, update city name also
|
|
|
|
//TODO update city and zone in database
|
|
|
|
//TODO update city map data in game server
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msg.actionType == 14) {
|
|
|
|
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
|
|
|
mca.actionType = 15;
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, mca);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msg.actionType == 20) {
|
|
|
|
|
|
|
|
Zone baneZone = building.getParentZone();
|
|
|
|
|
|
|
|
if (baneZone == null)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
City banedCity = City.getCity(baneZone.playerCityID);
|
|
|
|
|
|
|
|
if (banedCity == null)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
Bane bane = banedCity.getBane();
|
|
|
|
|
|
|
|
if (bane == null || bane.getLiveDate() != null || player.getGuild() != banedCity.getGuild() || GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
int baneHour = msg.getBaneHour();
|
|
|
|
|
|
|
|
if (baneHour < 16 || baneHour > 24) {
|
|
|
|
PlaceAssetMsg.sendPlaceAssetError(origin, 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
DateTime baneLive = new DateTime(bane.getPlacementDate());
|
|
|
|
baneLive = baneHour == 24 ? baneLive.plusDays(3) : baneLive.plusDays(2);
|
|
|
|
baneLive = baneHour == 24 ? baneLive.hourOfDay().setCopy(0) : baneLive.hourOfDay().setCopy(baneHour);
|
|
|
|
baneLive = baneLive.minuteOfHour().setCopy(0);
|
|
|
|
baneLive = baneLive.secondOfMinute().setCopy(1);
|
|
|
|
bane.setLiveDate(baneLive);
|
|
|
|
outMsg.actionType = 18;
|
|
|
|
|
|
|
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void configWindowState(PlayerCharacter player, Building building, ManageCityAssetsMsg manageCityAssetsMsg) {
|
|
|
|
|
|
|
|
// Tests to turn on upgrade button if a building is not
|
|
|
|
// at it's maximum allowed rank or currently ranking
|
|
|
|
|
|
|
|
|
|
|
|
// Owner is obviously allowed to upgrade his own buildings
|
|
|
|
|
|
|
|
if (building.getOwner().equals(player)) {
|
|
|
|
|
|
|
|
// Players cannot destroy or transfer a TOL.
|
|
|
|
|
|
|
|
if (building.getBlueprint() == null) {
|
|
|
|
manageCityAssetsMsg.buttonDestroy = 0;
|
|
|
|
manageCityAssetsMsg.buttonTransfer = 0;
|
|
|
|
manageCityAssetsMsg.buttonAbandon = 0;
|
|
|
|
manageCityAssetsMsg.buttonUpgrade = 0;
|
|
|
|
} else if (building.getBlueprint().getBuildingGroup() == Enum.BuildingGroup.TOL) {
|
|
|
|
manageCityAssetsMsg.buttonDestroy = 0;
|
|
|
|
manageCityAssetsMsg.buttonTransfer = 0;
|
|
|
|
manageCityAssetsMsg.buttonAbandon = 1;
|
|
|
|
manageCityAssetsMsg.buttonUpgrade = 1;
|
|
|
|
} else if (building.getBlueprint().getBuildingGroup() == Enum.BuildingGroup.MINE) {
|
|
|
|
manageCityAssetsMsg.buttonDestroy = 0;
|
|
|
|
manageCityAssetsMsg.buttonTransfer = 0;
|
|
|
|
manageCityAssetsMsg.buttonAbandon = 0;
|
|
|
|
manageCityAssetsMsg.buttonUpgrade = 0; // Cannot upgrade a mine
|
|
|
|
} else {
|
|
|
|
manageCityAssetsMsg.buttonDestroy = 1;
|
|
|
|
manageCityAssetsMsg.buttonTransfer = 1;
|
|
|
|
manageCityAssetsMsg.buttonAbandon = 1;
|
|
|
|
manageCityAssetsMsg.buttonUpgrade = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Inner Council of the same guild can also upgrade
|
|
|
|
|
|
|
|
if ((player.getGuild().equals(building.getGuild())) &&
|
|
|
|
GuildStatusController.isInnerCouncil(player.getGuildStatus()))
|
|
|
|
manageCityAssetsMsg.buttonUpgrade = 1;
|
|
|
|
|
|
|
|
// Disable upgrade button if at max rank.
|
|
|
|
|
|
|
|
if (building.getBlueprint() == null)
|
|
|
|
manageCityAssetsMsg.buttonUpgrade = 0;
|
|
|
|
else if (building.getRank() >= building.getBlueprint().getMaxRank())
|
|
|
|
manageCityAssetsMsg.buttonUpgrade = 0;
|
|
|
|
;
|
|
|
|
|
|
|
|
// If a building is not protected we can exit here
|
|
|
|
|
|
|
|
if (building.assetIsProtected() == false)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Protection is displayed as "UNDER SIEGE" if
|
|
|
|
// an active bane is invalidating the protection
|
|
|
|
// contracts of the city.
|
|
|
|
|
|
|
|
if ((building.getCity() != null) &&
|
|
|
|
(building.getCity().protectionEnforced == false)) {
|
|
|
|
manageCityAssetsMsg.labelProtected = 0;
|
|
|
|
manageCityAssetsMsg.labelSiege = 1;
|
|
|
|
manageCityAssetsMsg.labelCeaseFire = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Building is currently protected by a TOL
|
|
|
|
|
|
|
|
manageCityAssetsMsg.labelProtected = 1;
|
|
|
|
}
|
|
|
|
}
|