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.

139 lines
5.1 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.net.client.handlers;
import engine.Enum;
import engine.Enum.BuildingGroup;
import engine.db.archive.CityRecord;
import engine.db.archive.DataWarehouse;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ClaimAssetMsg;
import engine.net.client.msg.ClientNetMsg;
import engine.objects.Blueprint;
import engine.objects.Building;
import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import static engine.math.FastMath.sqr;
/*
* @Author:
* @Summary: Processes application protocol message which keeps
* client's tcp connection open.
*/
public class ClaimAssetMsgHandler extends AbstractClientMsgHandler {
// Instance variables
private final ReentrantReadWriteLock claimLock = new ReentrantReadWriteLock();
public ClaimAssetMsgHandler() {
super(ClaimAssetMsg.class);
}
@Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
// Member variable declaration
this.claimLock.writeLock().lock();
try{
PlayerCharacter sourcePlayer;
Building targetBuilding;
Blueprint blueprint;
ClaimAssetMsg msg;
int targetUUID;
msg = (ClaimAssetMsg) baseMsg;
targetUUID = msg.getUUID();
sourcePlayer = origin.getPlayerCharacter();
targetBuilding = BuildingManager.getBuildingFromCache(targetUUID);
// Oops! *** Refactor: Log error
if ((sourcePlayer == null) ||
(targetBuilding == null))
return true;
// Player must be reasonably close to building in order to claim
if (sourcePlayer.getLoc().distanceSquared2D(targetBuilding.getLoc()) > sqr(100))
return true;
// Early exit if object to be claimed is not errant
if (targetBuilding.getOwnerUUID() != 0)
return true;
// Early exit if UUID < the last database derived building UUID.
if (targetBuilding.getProtectionState() == Enum.ProtectionState.NPC) {
return true;
}
// Early exit if claiming player does not
// have a guild.
// Errant players cannot claim
if (sourcePlayer.getGuild().isEmptyGuild())
return true;
// Can't claim an object without a blueprint
if (targetBuilding.getBlueprintUUID() == 0)
return true;
blueprint = targetBuilding.getBlueprint();
//cant claim mine this way.
if (blueprint.getBuildingGroup() == BuildingGroup.MINE)
return true;
// Players cannot claim shrines
if ((targetBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE))
return true;
// Can't claim a tree if your guild already owns one
// *** Refactor : Send error to player here
if ((sourcePlayer.getGuild().isNation()) &&
(blueprint.getBuildingGroup() == BuildingGroup.TOL))
return true;
// Process the transfer of the building(s)
if (blueprint.getBuildingGroup() == BuildingGroup.TOL) {
targetBuilding.getCity().claim(sourcePlayer);
// Push transfer of city to data warehouse
CityRecord cityRecord = CityRecord.borrow(targetBuilding.getCity(), Enum.RecordEventType.TRANSFER);
DataWarehouse.pushToWarehouse(cityRecord);
} else
targetBuilding.claim(sourcePlayer);
} catch(Exception e){
Logger.error("ClaimAssetMsgHandler", e.getMessage());
}finally{
this.claimLock.writeLock().unlock();
}
return true;
}
}