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

135 lines
4.2 KiB
Java
Raw Normal View History

2022-04-30 09:41:17 -04:00
package engine.net.client.handlers;
import engine.gameManager.*;
import engine.mbEnums;
import engine.mbEnums.ItemType;
2022-04-30 09:41:17 -04:00
import engine.net.Dispatch;
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() {
2024-05-12 11:55:12 -04:00
super();
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
@Override
2024-05-12 13:42:11 -04:00
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
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()) {
2024-03-10 13:34:24 -04:00
if (hirelings.template.item_type.equals(ItemType.EMPLOYMENTCONTRACT)) {
2023-05-02 15:09:09 -04:00
2024-03-15 10:35:41 -04:00
contract = DbManager.ContractQueries.GET_CONTRACT(hirelings.templateID);
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);
DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
2023-07-15 09:23:48 -04:00
}
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
2024-03-18 10:01:29 -04:00
if (!player.charItemManager.doesCharOwnThisItem(contractItem.getObjectUUID())) {
2023-07-15 09:23:48 -04:00
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
2024-03-18 10:01:29 -04:00
itemMan = player.charItemManager;
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
2024-03-15 13:06:21 -04:00
contract = DbManager.ContractQueries.GET_CONTRACT(contractItem.templateID);
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);
DispatchManager.dispatchMsgDispatch(dispatch, mbEnums.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
}