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.

154 lines
4.2 KiB

package engine.net.client.handlers;
import engine.Enum;
import engine.Enum.GameObjectType;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager;
import engine.gameManager.DbManager;
import engine.gameManager.SessionManager;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.objects.Building;
import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger;
import java.time.LocalDateTime;
import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup;
/*
*
* @Summary: Processes application protocol message where a
* client requests that a building be upgraded.
*/
public class UpgradeAssetMsgHandler extends AbstractClientMsgHandler {
// Constructor
public UpgradeAssetMsgHandler() {
super(UpgradeAssetMessage.class);
}
@Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
// Member variable declaration
UpgradeAssetMessage msg;
ManageCityAssetsMsg outMsg;
PlayerCharacter player;
int buildingUUID;
Building buildingToRank;
LocalDateTime dateToUpgrade;
int nextRank;
int rankCost;
Dispatch dispatch;
// Assign member variables
msg = (UpgradeAssetMessage) baseMsg;
// Grab pointer to the requesting player
player = SessionManager.getPlayerCharacter(origin);
// Grab pointer to the building from the cache
buildingUUID = msg.getBuildingUUID();
buildingToRank = (Building) DbManager.getObject(GameObjectType.Building, buildingUUID);
// Early exit if building not in cache.
if (buildingToRank == null) {
Logger.error("Attempt to upgrade null building by " + player.getName());
return true;
}
// Early exit for building that is already ranking
if (buildingToRank.isRanking()) {
Logger.error("Attempt to upgrade a building already ranking by " + player.getName());
return true;
}
// Calculate and set time/cost to upgrade
nextRank = (buildingToRank.getRank() + 1);
if (buildingToRank.getBlueprint() == null)
return true;
if (buildingToRank.getBlueprint().getMaxRank() < nextRank || nextRank == 8){
ErrorPopupMsg.sendErrorMsg(player, "Building is already at it's Max rank.");
return true;
}
rankCost = buildingToRank.getBlueprint().getRankCost(nextRank);
// SEND NOT ENOUGH GOLD ERROR
if (!buildingToRank.hasFunds(rankCost)){
ErrorPopupMsg.sendErrorPopup(player, 127); // Not enough gold in strongbox
return true;
}
if (rankCost > buildingToRank.getStrongboxValue()) {
sendErrorPopup(player, 127);
return true;
}
// Validation appears good. Let's now process the upgrade
try {
if (buildingToRank.getCity() != null){
buildingToRank.getCity().transactionLock.writeLock().lock();
try{
if (!buildingToRank.transferGold(-rankCost,false)) {
sendErrorPopup(player, 127);
return true;
}
}catch(Exception e){
Logger.error(e);
}finally{
buildingToRank.getCity().transactionLock.writeLock().unlock();
}
}else
if (!buildingToRank.transferGold(-rankCost,false)) {
sendErrorPopup(player, 127);
return true;
}
dateToUpgrade = LocalDateTime.now().plusHours(buildingToRank.getBlueprint().getRankTime(nextRank));
BuildingManager.setUpgradeDateTime(buildingToRank, dateToUpgrade, 0);
// Schedule upgrade job
BuildingManager.submitUpgradeJob(buildingToRank);
// Refresh the client's manage asset window
// *** Refactor : We have some of these unknowns
outMsg = new ManageCityAssetsMsg(player, buildingToRank);
// Action TYPE
outMsg.actionType = 3;
outMsg.setTargetType(buildingToRank.getObjectType().ordinal());
outMsg.setTargetID(buildingToRank.getObjectUUID());
outMsg.setTargetType3(buildingToRank.getObjectType().ordinal());
outMsg.setTargetID3(buildingToRank.getObjectUUID());
outMsg.setAssetName1(buildingToRank.getName());
outMsg.setUnknown54(1);
dispatch = Dispatch.borrow(player, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
} catch (Exception e) {
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
}
return true;
}
}