Files
BattleBane/src/engine/net/client/handlers/MinionTrainingMsgHandler.java
T

302 lines
11 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.DispatchChannel;
import engine.InterestManagement.WorldGrid;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager;
import engine.gameManager.DbManager;
import engine.gameManager.NPCManager;
import engine.gameManager.SessionManager;
2022-04-30 09:41:17 -04:00
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.objects.*;
import org.pmw.tinylog.Logger;
/*
* @Author:
* @Summary: Processes application protocol message which
* processes training of minions in guard barracks
*/
public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
2023-07-15 09:23:48 -04:00
public MinionTrainingMsgHandler() {
super(MinionTrainingMessage.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
MinionTrainingMessage minionMsg = (MinionTrainingMessage) baseMsg;
2022-04-30 09:41:17 -04:00
2023-09-01 14:33:33 -04:00
PlayerCharacter playerCharacter = SessionManager.getPlayerCharacter(origin);
2022-04-30 09:41:17 -04:00
2023-09-01 14:33:33 -04:00
if (playerCharacter == null)
2023-07-15 09:23:48 -04:00
return true;
2023-09-01 14:33:33 -04:00
2023-07-15 09:23:48 -04:00
if (minionMsg.getNpcType() == Enum.GameObjectType.NPC.ordinal()) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
NPC npc = NPC.getFromCache(minionMsg.getNpcID());
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (npc == null)
return true;
2022-04-30 09:41:17 -04:00
2023-09-01 14:33:33 -04:00
Building building = BuildingManager.getBuildingFromCache(minionMsg.getBuildingID());
2022-04-30 09:41:17 -04:00
2023-09-01 14:33:33 -04:00
if (building == null)
2023-07-15 09:23:48 -04:00
return true;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
//clear minion
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (npc.minionLock.writeLock().tryLock()) {
2023-09-01 14:33:33 -04:00
2023-07-15 09:23:48 -04:00
try {
if (minionMsg.getType() == 2) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
2022-04-30 09:41:17 -04:00
if (!npc.minions.contains(toRemove.getObjectUUID()))
2023-07-15 09:23:48 -04:00
return true;
2022-04-30 09:41:17 -04:00
2023-09-04 15:09:51 -04:00
npc.minions.remove(Integer.valueOf(toRemove.getObjectUUID()));
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
WorldGrid.RemoveWorldObject(toRemove);
if (toRemove.getParentZone() != null)
toRemove.getParentZone().zoneMobSet.remove(toRemove);
DbManager.removeFromCache(toRemove);
2023-08-27 21:04:34 -05:00
2024-03-24 09:42:27 -04:00
if (toRemove.guardCaptain.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
2023-08-27 21:04:34 -05:00
if (petOwner != null) {
petOwner.setPet(null);
2023-07-15 09:23:48 -04:00
toRemove.guardCaptain = null;
PetMsg petMsg = new PetMsg(5, null);
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
}
2023-07-15 09:23:48 -04:00
}
2023-09-01 14:33:33 -04:00
ManageCityAssetsMsg mca1 = new ManageCityAssetsMsg(playerCharacter, building);
2023-07-15 09:23:48 -04:00
mca1.actionType = 3;
2023-09-01 14:33:33 -04:00
mca1.setTargetType(building.getObjectType().ordinal());
mca1.setTargetID(building.getObjectUUID());
2023-07-15 09:23:48 -04:00
mca1.setTargetType3(npc.getObjectType().ordinal());
mca1.setTargetID3(npc.getObjectUUID());
2023-09-01 14:33:33 -04:00
mca1.setAssetName1(building.getName());
2023-07-15 09:23:48 -04:00
mca1.setUnknown54(1);
2023-09-01 14:33:33 -04:00
Dispatch dispatch = Dispatch.borrow(playerCharacter, mca1);
2023-07-15 09:23:48 -04:00
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
ManageNPCMsg mnm = new ManageNPCMsg(npc);
2023-09-01 14:33:33 -04:00
dispatch = Dispatch.borrow(playerCharacter, mnm);
2023-07-15 09:23:48 -04:00
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
//Add Minion
} else {
Zone zone = npc.getParentZone();
if (zone == null)
return true;
int maxSlots = 3;
if (npc.getContractID() == 842)
maxSlots = 1;
if (npc.minions.size() == maxSlots)
2023-07-15 09:23:48 -04:00
return true;
int mobBase;
switch (minionMsg.getMinion()) {
case 9:
mobBase = 13171;
break;
case 2:
mobBase = 13758;
break;
case 3:
mobBase = 13757;
break;
case 4:
mobBase = 2111;
break;
case 5:
mobBase = 12402;
break;
case 6:
mobBase = 2113;
break;
default:
mobBase = minionMsg.getMinion();
}
if (mobBase == 0)
return true;
2023-08-26 12:03:33 -04:00
Mob siegeMob = Mob.createSiegeMinion(npc, mobBase);
2023-07-15 09:23:48 -04:00
2023-08-18 10:43:59 -04:00
if (siegeMob == null)
2023-07-15 09:23:48 -04:00
return true;
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
ManageNPCMsg mnm = new ManageNPCMsg(npc);
mnm.setMessageType(1);
2023-09-01 14:33:33 -04:00
Dispatch dispatch = Dispatch.borrow(playerCharacter, mnm);
2023-07-15 09:23:48 -04:00
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
} finally {
npc.minionLock.writeLock().unlock();
}
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
} else if (minionMsg.getNpcType() == Enum.GameObjectType.Mob.ordinal()) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Mob npc = Mob.getFromCache(minionMsg.getNpcID());
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (npc == null)
return true;
2022-04-30 09:41:17 -04:00
2023-08-18 11:33:27 -04:00
Building building = BuildingManager.getBuildingFromCache(minionMsg.getBuildingID());
2022-04-30 09:41:17 -04:00
2023-08-18 11:33:27 -04:00
if (building == null)
2023-07-15 09:23:48 -04:00
return true;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
//clear minion
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (npc.minionLock.writeLock().tryLock()) {
try {
if (minionMsg.getType() == 2) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
2023-08-18 11:33:27 -04:00
if (!npc.minions.contains(toRemove.getObjectUUID()))
2023-07-15 09:23:48 -04:00
return true;
2022-04-30 09:41:17 -04:00
2023-09-09 08:04:56 -04:00
if (!DbManager.MobQueries.REMOVE_GUARD_MINION(npc.getObjectUUID(), toRemove.firstName))
2023-07-15 09:23:48 -04:00
return true;
2022-04-30 09:41:17 -04:00
2023-09-04 15:09:51 -04:00
npc.minions.remove(Integer.valueOf(toRemove.getObjectUUID()));
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
WorldGrid.RemoveWorldObject(toRemove);
if (toRemove.getParentZone() != null)
toRemove.getParentZone().zoneMobSet.remove(toRemove);
DbManager.removeFromCache(toRemove);
2023-08-27 21:04:34 -05:00
2023-09-01 14:33:33 -04:00
if (toRemove.agentType.equals(Enum.AIAgentType.SIEGEENGINE)) {
PlayerCharacter trebOwner = (PlayerCharacter) toRemove.guardCaptain;
if (trebOwner != null) {
trebOwner.setPet(null);
toRemove.guardCaptain = null;
PetMsg petMsg = new PetMsg(5, null);
Dispatch dispatch = Dispatch.borrow(trebOwner, petMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
}
}
ManageCityAssetsMsg mca1 = new ManageCityAssetsMsg(playerCharacter, building);
2023-07-15 09:23:48 -04:00
mca1.actionType = 3;
2023-08-18 11:33:27 -04:00
mca1.setTargetType(building.getObjectType().ordinal());
mca1.setTargetID(building.getObjectUUID());
2023-07-15 09:23:48 -04:00
mca1.setTargetType3(npc.getObjectType().ordinal());
mca1.setTargetID3(npc.getObjectUUID());
2023-08-18 11:33:27 -04:00
mca1.setAssetName1(building.getName());
2023-07-15 09:23:48 -04:00
mca1.setUnknown54(1);
2023-09-01 14:33:33 -04:00
Dispatch dispatch = Dispatch.borrow(playerCharacter, mca1);
2023-07-15 09:23:48 -04:00
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
ManageNPCMsg mnm = new ManageNPCMsg(npc);
2023-09-01 14:33:33 -04:00
dispatch = Dispatch.borrow(playerCharacter, mnm);
2023-07-15 09:23:48 -04:00
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
//Add Minion
} else {
Zone zone = npc.getParentZone();
if (zone == null)
return true;
int maxSlots = 5;
if (npc.getContract().getContractID() == 842)//artillery captain
maxSlots = 1;
if (npc.getContract().getContractID() == 910)//guard dogs
maxSlots = 0;
switch (npc.getRank()) {
case 1:
case 2:
maxSlots = 1;
break;
case 3:
maxSlots = 2;
break;
case 4:
case 5:
maxSlots = 3;
break;
case 6:
maxSlots = 4;
break;
case 7:
maxSlots = 5;
break;
}
if (npc.minions.size() == maxSlots)
2023-07-15 09:23:48 -04:00
return true;
int mobBase = npc.getMobBaseID();
if (mobBase == 0)
return true;
String pirateName = NPCManager.getPirateName(mobBase);
2023-08-25 14:33:43 -04:00
Mob toCreate = Mob.createGuardMinion(npc, npc.getLevel(), pirateName);
2023-07-15 09:23:48 -04:00
if (toCreate == null)
return true;
2023-09-09 08:04:56 -04:00
if (!DbManager.MobQueries.ADD_GUARD_MINION(npc.getObjectUUID(), pirateName))
2023-08-25 14:33:43 -04:00
return true;
2023-07-15 09:23:48 -04:00
if (toCreate != null) {
toCreate.setDeathTime(System.currentTimeMillis());
toCreate.parentZone.zoneMobSet.add(toCreate);
}
}
ManageNPCMsg mnm = new ManageNPCMsg(npc);
mnm.setMessageType(1);
2023-09-01 14:33:33 -04:00
Dispatch dispatch = Dispatch.borrow(playerCharacter, mnm);
2023-07-15 09:23:48 -04:00
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
} catch (Exception e) {
Logger.error(e);
} finally {
npc.minionLock.writeLock().unlock();
}
}
}
return true;
}
2022-04-30 09:41:17 -04:00
}