Files
Server/src/engine/net/client/handlers/ActivateNPCMsgHandler.java
T

137 lines
4.3 KiB
Java
Raw Normal View History

2022-04-30 09:41:17 -04:00
package engine.net.client.handlers;
import engine.Enum;
import engine.Enum.ItemType;
import engine.exception.MsgSendException;
import engine.gameManager.*;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ActivateNPCMessage;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ManageCityAssetsMsg;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
/*
* @Author:
* @Summary: Processes application protocol message which keeps
* client's tcp connection open.
*/
public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
2023-07-15 09:23:48 -04:00
public ActivateNPCMsgHandler() {
super(ActivateNPCMessage.class);
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
@Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
ActivateNPCMessage msg;
PlayerCharacter player;
Building building;
Contract contract;
CharacterItemManager itemMan;
Zone zone;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
msg = (ActivateNPCMessage) baseMsg;
player = SessionManager.getPlayerCharacter(origin);
building = BuildingManager.getBuildingFromCache(msg.buildingUUID());
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (player == null || building == null)
return false;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
ArrayList<Item> ItemLists = new ArrayList<>();
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
// Filter hirelings by slot type
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
for (Item hirelings : player.getInventory()) {
if (hirelings.getItemBase().getType().equals(ItemType.CONTRACT)) {
2023-05-02 15:09:09 -04:00
2023-07-15 09:23:48 -04:00
contract = DbManager.ContractQueries.GET_CONTRACT(hirelings.getItemBase().getUUID());
2023-05-02 15:09:09 -04:00
2023-07-15 09:23:48 -04:00
if (contract == null)
continue;
2023-05-02 15:09:09 -04:00
2023-07-15 09:23:48 -04:00
if (contract.canSlotinBuilding(building))
ItemLists.add(hirelings);
}
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (msg.getUnknown01() == 1) {
//Request npc list to slot
ActivateNPCMessage anm = new ActivateNPCMessage();
anm.setSize(ItemLists.size());
anm.setItemList(ItemLists);
Dispatch dispatch = Dispatch.borrow(player, anm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (msg.getUnknown01() == 0) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
//Slot npc
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (building.getBlueprintUUID() == 0) {
ChatManager.chatSystemError(player, "Unable to load Blueprint for Building Mesh " + building.getMeshUUID());
return false;
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
return false;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Item contractItem = Item.getFromCache(msg.getContractItem());
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (contractItem == null)
return false;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (!player.getCharItemManager().doesCharOwnThisItem(contractItem.getObjectUUID())) {
Logger.error(player.getName() + "has attempted to place Hireling : " + contractItem.getName() + "without a valid contract!");
return false;
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
itemMan = player.getCharItemManager();
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
zone = ZoneManager.findSmallestZone(building.getLoc());
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (zone == null)
return false;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
contract = DbManager.ContractQueries.GET_CONTRACT(contractItem.getItemBase().getUUID());
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (contract == null)
return false;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
// Check if contract can be slotted in this building
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (contract.canSlotinBuilding(building) == false)
return false;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (!BuildingManager.addHireling(building, player, zone, contract, contractItem))
return false;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
itemMan.delete(contractItem);
itemMan.updateInventory();
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
ManageCityAssetsMsg mca1 = new ManageCityAssetsMsg(player, building);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
mca1.actionType = 3;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
mca1.setTargetType(building.getObjectType().ordinal());
mca1.setTargetID(building.getObjectUUID());
mca1.setTargetType3(building.getObjectType().ordinal());
mca1.setTargetID3(building.getObjectUUID());
mca1.setAssetName1(building.getName());
mca1.setUnknown54(1);
Dispatch dispatch = Dispatch.borrow(player, mca1);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
return true;
}
2022-04-30 09:41:17 -04:00
}