|
|
|
package engine.net.client.handlers;
|
|
|
|
|
|
|
|
import engine.exception.MsgSendException;
|
|
|
|
import engine.gameManager.BuildingManager;
|
|
|
|
import engine.gameManager.SessionManager;
|
|
|
|
import engine.gameManager.ZoneManager;
|
|
|
|
import engine.mbEnums;
|
|
|
|
import engine.mbEnums.BuildingGroup;
|
|
|
|
import engine.net.Dispatch;
|
|
|
|
import engine.net.DispatchMessage;
|
|
|
|
import engine.net.client.ClientConnection;
|
|
|
|
import engine.net.client.msg.ClientNetMsg;
|
|
|
|
import engine.net.client.msg.RepairBuildingMsg;
|
|
|
|
import engine.net.client.msg.UpdateObjectMsg;
|
|
|
|
import engine.objects.*;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @Author:
|
|
|
|
* @Summary: Processes application protocol message which handles
|
|
|
|
* protecting and unprotecting city assets
|
|
|
|
*/
|
|
|
|
public class RepairBuildingMsgHandler extends AbstractClientMsgHandler {
|
|
|
|
|
|
|
|
public RepairBuildingMsgHandler() {
|
|
|
|
super(RepairBuildingMsg.class);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void RepairBuilding(Building targetBuilding, ClientConnection origin, RepairBuildingMsg msg) {
|
|
|
|
|
|
|
|
// Member variable declaration
|
|
|
|
|
|
|
|
Zone serverZone;
|
|
|
|
Dispatch dispatch;
|
|
|
|
|
|
|
|
// Member variable assignment
|
|
|
|
|
|
|
|
if (targetBuilding == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!targetBuilding.hasFunds(BuildingManager.GetRepairCost(targetBuilding)))
|
|
|
|
return;
|
|
|
|
|
|
|
|
PlayerCharacter pc = origin.getPlayerCharacter();
|
|
|
|
|
|
|
|
serverZone = ZoneManager.findSmallestZone(pc.getLoc());
|
|
|
|
|
|
|
|
if (serverZone.playerCityUUID == 0 && targetBuilding.getBlueprint() != null && targetBuilding.getBlueprint().getBuildingGroup() != BuildingGroup.MINE)
|
|
|
|
return;
|
|
|
|
|
|
|
|
City city = City.GetCityFromCache(serverZone.playerCityUUID);
|
|
|
|
|
|
|
|
if (city != null)
|
|
|
|
if (city.getBane() != null && city.protectionEnforced == false)
|
|
|
|
return;
|
|
|
|
|
|
|
|
//cannot repair mines during 24/7 activity.
|
|
|
|
|
|
|
|
if (targetBuilding.getBlueprint() != null && targetBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.MINE && Mine.getMineFromTower(targetBuilding.getObjectUUID()).isActive == true)
|
|
|
|
return;
|
|
|
|
|
|
|
|
int maxHP = (int) targetBuilding.getMaxHitPoints();
|
|
|
|
int repairCost = BuildingManager.GetRepairCost(targetBuilding);
|
|
|
|
int missingHealth = (int) BuildingManager.GetMissingHealth(targetBuilding);
|
|
|
|
|
|
|
|
if (!targetBuilding.transferGold(-repairCost, false))
|
|
|
|
return;
|
|
|
|
|
|
|
|
targetBuilding.modifyHealth(BuildingManager.GetMissingHealth(targetBuilding), null);
|
|
|
|
|
|
|
|
UpdateObjectMsg uom = new UpdateObjectMsg(targetBuilding, 3);
|
|
|
|
|
|
|
|
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), uom);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
|
|
|
|
|
|
|
|
|
|
|
|
RepairBuildingMsg rbm = new RepairBuildingMsg(targetBuilding.getObjectUUID(), maxHP, missingHealth, repairCost, targetBuilding.getStrongboxValue());
|
|
|
|
|
|
|
|
|
|
|
|
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), rbm);
|
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
|
|
|
|
|
|
|
|
// Member variable declaration
|
|
|
|
|
|
|
|
PlayerCharacter player;
|
|
|
|
Building targetBuilding;
|
|
|
|
RepairBuildingMsg msg;
|
|
|
|
|
|
|
|
// Member variable assignment
|
|
|
|
|
|
|
|
msg = (RepairBuildingMsg) baseMsg;
|
|
|
|
player = SessionManager.getPlayerCharacter(origin);
|
|
|
|
|
|
|
|
if (player == null)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
switch (msg.getType()) {
|
|
|
|
case 0:
|
|
|
|
targetBuilding = BuildingManager.getBuildingFromCache(msg.getBuildingID());
|
|
|
|
RepairBuilding(targetBuilding, origin, msg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|