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.

190 lines
7.1 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.net.client.handlers;
import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DispatchManager;
import engine.mbEnums;
import engine.mbEnums.BuildingGroup;
import engine.net.Dispatch;
import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/*
* @Author:
* @Summary: Processes application protocol message which keeps
* client's tcp connection open.
*/
public class ClaimGuildTreeMsgHandler extends AbstractClientMsgHandler {
// Instance variables
private static final int RENAME_TREE = 2;
private static final int BIND_TREE = 3;
private static final int OPEN_CITY = 4;
private static final int CLOSE_CITY = 5;
private final ReentrantReadWriteLock claimLock = new ReentrantReadWriteLock();
public ClaimGuildTreeMsgHandler() {
super();
}
@Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
// Member variable declaration
this.claimLock.writeLock().lock();
try {
PlayerCharacter sourcePlayer;
Building building;
Blueprint blueprint;
Zone playerZone = null;
City playerCity = null;
ClaimGuildTreeMsg msg;
int targetUUID;
Dispatch dispatch;
msg = (ClaimGuildTreeMsg) baseMsg;
targetUUID = msg.getTargetID();
sourcePlayer = origin.getPlayerCharacter();
building = BuildingManager.getBuildingFromCache(targetUUID);
if (building != null)
playerZone = building.getParentZone();
if (playerZone != null)
playerCity = City.getCity(playerZone.playerCityUUID);
// Oops! *** Refactor: Log error
switch (msg.getMessageType()) {
case RENAME_TREE:
if ((sourcePlayer == null) ||
(building == null) || playerZone == null || playerCity == null)
return true;
// Early exit if object to be claimed is not errant
if (building.getOwnerUUID() == 0)
return true;
// Errant players cannot rename
if (sourcePlayer.getGuild().isEmptyGuild())
return true;
// Can't rename an object without a blueprint
if (building.getBlueprintUUID() == 0)
return true;
blueprint = building.getBlueprint();
//can only rename tree this way.
if (blueprint.getBuildingGroup() != BuildingGroup.TOL)
return true;
//dont rename if guild is null
if (building.getGuild().isEmptyGuild())
return true;
if (!BuildingManager.playerCanManage(sourcePlayer, building))
return true;
if (!playerCity.renameCity(msg.getTreeName())) {
ChatManager.chatSystemError(sourcePlayer, "Failed to rename city!");
return true;
}
GuildTreeStatusMsg gtsm = new GuildTreeStatusMsg(building, sourcePlayer);
gtsm.configure();
dispatch = Dispatch.borrow(sourcePlayer, gtsm);
DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
CityZoneMsg czm = new CityZoneMsg(2, playerZone.getLoc().x, playerZone.getLoc().y, playerZone.getLoc().z, playerCity.getCityName(), playerZone, mbEnums.CityBoundsType.ZONE.halfExtents, mbEnums.CityBoundsType.ZONE.halfExtents);
DispatchManager.dispatchMsgToAll(czm);
break;
case BIND_TREE:
Guild pcGuild = sourcePlayer.getGuild();
//test tree is valid for binding, same guild or same nation
if (!Guild.sameNation(pcGuild, building.getGuild())) {
return true;
}
if (building.getGuild().isEmptyGuild())
return true;
//get bind city
Zone zone = building.getParentZone();
if (zone == null) {
ErrorPopupMsg.sendErrorMsg(sourcePlayer, "A Serious error has occurred. Please post details for to ensure transaction integrity");
return true;
}
if (playerCity == null && building.getGuild() != null)
playerCity = building.getGuild().getOwnedCity();
if (playerCity == null)
return true;
sourcePlayer.setBindBuildingID(building.getObjectUUID());
dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
break;
case OPEN_CITY:
case CLOSE_CITY:
if ((sourcePlayer == null) ||
(building == null) || playerZone == null || playerCity == null)
return true;
if (!BuildingManager.playerCanManage(sourcePlayer, building))
return true;
boolean open = (msg.getMessageType() == OPEN_CITY);
if (!playerCity.openCity(open)) {
ErrorPopupMsg.sendErrorMsg(sourcePlayer, "A Serious error has occurred. Please post details for to ensure transaction integrity");
return true;
}
dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
break;
default:
break;
}
} catch (Exception e) {
Logger.error(e.getMessage());
} finally {
try {
this.claimLock.writeLock().unlock();
} catch (Exception e) {
Logger.info("failClaimsync");
}
}
return true;
}
}