forked from MagicBane/Server
Minions now use copyonwrite collection. Slot agnostic.
This commit is contained in:
@@ -59,22 +59,25 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
for (Integer minionUUID : npc.minions) {
|
||||||
|
Mob mob = Mob.getMob(minionUUID);
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
|
||||||
if (mob.getParentZone() != null)
|
if (mob.getParentZone() != null)
|
||||||
mob.getParentZone().zoneMobSet.remove(mob);
|
mob.getParentZone().zoneMobSet.remove(mob);
|
||||||
}
|
}
|
||||||
|
|
||||||
DbManager.NPCQueries.DELETE_NPC(npc);
|
DbManager.NPCQueries.DELETE_NPC(npc);
|
||||||
DbManager.removeFromCache(GameObjectType.NPC,
|
DbManager.removeFromCache(GameObjectType.NPC,
|
||||||
npc.getObjectUUID());
|
npc.getObjectUUID());
|
||||||
WorldGrid.RemoveWorldObject(npc);
|
WorldGrid.RemoveWorldObject(npc);
|
||||||
} else if (mobA != null) {
|
} else if (mobA != null) {
|
||||||
for (Mob mob : mobA.getSiegeMinionMap().keySet()) {
|
for (Integer minionUUID : mobA.minions) {
|
||||||
|
Mob mob = Mob.getMob(minionUUID);
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
|
||||||
if (mob.getParentZone() != null)
|
if (mob.getParentZone() != null)
|
||||||
mob.getParentZone().zoneMobSet.remove(mob);
|
mob.getParentZone().zoneMobSet.remove(mob);
|
||||||
}
|
}
|
||||||
@@ -151,10 +154,11 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
for (Integer minionUUID : npc.minions) {
|
||||||
|
Mob mob = Mob.getMob(minionUUID);
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
|
||||||
if (mob.getParentZone() != null)
|
if (mob.getParentZone() != null)
|
||||||
mob.getParentZone().zoneMobSet.remove(mob);
|
mob.getParentZone().zoneMobSet.remove(mob);
|
||||||
}
|
}
|
||||||
@@ -163,10 +167,11 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
npc.getObjectUUID());
|
npc.getObjectUUID());
|
||||||
WorldGrid.RemoveWorldObject(npc);
|
WorldGrid.RemoveWorldObject(npc);
|
||||||
} else if (mobA != null) {
|
} else if (mobA != null) {
|
||||||
for (Mob mob : mobA.getSiegeMinionMap().keySet()) {
|
for (Integer minionUUID : mobA.minions) {
|
||||||
|
Mob mob = Mob.getMob(minionUUID);
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
|
||||||
if (mob.getParentZone() != null)
|
if (mob.getParentZone() != null)
|
||||||
mob.getParentZone().zoneMobSet.remove(mob);
|
mob.getParentZone().zoneMobSet.remove(mob);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,24 +154,29 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
mobA = (Mob) ac;
|
mobA = (Mob) ac;
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
for (Integer minionUUID : npc.minions) {
|
||||||
WorldGrid.removeObject(mob, pc);
|
Mob minionMob = Mob.getMob(minionUUID);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
WorldGrid.RemoveWorldObject(minionMob);
|
||||||
if (mob.getParentZone() != null)
|
WorldGrid.removeObject(minionMob, pc);
|
||||||
mob.getParentZone().zoneMobSet.remove(mob);
|
|
||||||
|
if (minionMob.getParentZone() != null)
|
||||||
|
minionMob.getParentZone().zoneMobSet.remove(minionMob);
|
||||||
}
|
}
|
||||||
|
|
||||||
DbManager.NPCQueries.DELETE_NPC(npc);
|
DbManager.NPCQueries.DELETE_NPC(npc);
|
||||||
DbManager.removeFromCache(npc);
|
DbManager.removeFromCache(npc);
|
||||||
WorldGrid.RemoveWorldObject(npc);
|
WorldGrid.RemoveWorldObject(npc);
|
||||||
WorldGrid.removeObject(npc, pc);
|
WorldGrid.removeObject(npc, pc);
|
||||||
} else if (mobA != null) {
|
} else if (mobA != null) {
|
||||||
for (Mob mob : mobA.getSiegeMinionMap().keySet()) {
|
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
for (Integer minionUUID : mobA.minions) {
|
||||||
WorldGrid.removeObject(mob, pc);
|
Mob minionMob = Mob.getMob(minionUUID);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
WorldGrid.RemoveWorldObject(minionMob);
|
||||||
if (mob.getParentZone() != null)
|
WorldGrid.removeObject(minionMob, pc);
|
||||||
mob.getParentZone().zoneMobSet.remove(mob);
|
|
||||||
|
if (minionMob.getParentZone() != null)
|
||||||
|
minionMob.getParentZone().zoneMobSet.remove(minionMob);
|
||||||
}
|
}
|
||||||
DbManager.MobQueries.DELETE_MOB(mobA);
|
DbManager.MobQueries.DELETE_MOB(mobA);
|
||||||
DbManager.removeFromCache(mobA);
|
DbManager.removeFromCache(mobA);
|
||||||
@@ -209,11 +214,13 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
if (npc.building != null)
|
if (npc.building != null)
|
||||||
npc.building.getHirelings().remove(npc);
|
npc.building.getHirelings().remove(npc);
|
||||||
|
|
||||||
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
for (Integer minionUUID : npc.minions) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
Mob minionMob = Mob.getMob(minionUUID);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.RemoveWorldObject(minionMob);
|
||||||
if (mob.getParentZone() != null)
|
WorldGrid.removeObject(minionMob, pc);
|
||||||
mob.getParentZone().zoneMobSet.remove(mob);
|
|
||||||
|
if (minionMob.getParentZone() != null)
|
||||||
|
minionMob.getParentZone().zoneMobSet.remove(minionMob);
|
||||||
}
|
}
|
||||||
|
|
||||||
DbManager.NPCQueries.DELETE_NPC(npc);
|
DbManager.NPCQueries.DELETE_NPC(npc);
|
||||||
|
|||||||
@@ -122,37 +122,39 @@ public enum NPCManager {
|
|||||||
|
|
||||||
public static void removeSiegeMinions(Mob mobile) {
|
public static void removeSiegeMinions(Mob mobile) {
|
||||||
|
|
||||||
for (Mob toRemove : mobile.siegeMinionMap.keySet()) {
|
for (Integer minionUUID : mobile.minions) {
|
||||||
|
|
||||||
|
Mob siegeMinion = Mob.getMob(minionUUID);
|
||||||
|
|
||||||
if (mobile.isMoving()) {
|
if (mobile.isMoving()) {
|
||||||
|
|
||||||
mobile.stopMovement(mobile.getLoc());
|
mobile.stopMovement(mobile.getLoc());
|
||||||
|
|
||||||
if (toRemove.parentZone != null)
|
if (siegeMinion.parentZone != null)
|
||||||
toRemove.parentZone.zoneMobSet.remove(toRemove);
|
siegeMinion.parentZone.zoneMobSet.remove(siegeMinion);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
toRemove.clearEffects();
|
siegeMinion.clearEffects();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e.getMessage());
|
Logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toRemove.parentZone != null)
|
if (siegeMinion.parentZone != null)
|
||||||
toRemove.parentZone.zoneMobSet.remove(toRemove);
|
siegeMinion.parentZone.zoneMobSet.remove(siegeMinion);
|
||||||
|
|
||||||
WorldGrid.RemoveWorldObject(toRemove);
|
WorldGrid.RemoveWorldObject(siegeMinion);
|
||||||
WorldGrid.removeObject(toRemove);
|
WorldGrid.removeObject(siegeMinion);
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(siegeMinion);
|
||||||
|
|
||||||
|
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
PlayerCharacter petOwner = (PlayerCharacter) siegeMinion.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
|
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
|
||||||
toRemove.guardCaptain = null;
|
siegeMinion.guardCaptain = null;
|
||||||
|
|
||||||
PetMsg petMsg = new PetMsg(5, null);
|
PetMsg petMsg = new PetMsg(5, null);
|
||||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
||||||
@@ -263,7 +265,7 @@ public enum NPCManager {
|
|||||||
|
|
||||||
if (abstractCharacter.getObjectType().equals(Enum.GameObjectType.Mob) && ((Mob) abstractCharacter).behaviourType.equals(Enum.MobBehaviourType.SiegeEngine)) {
|
if (abstractCharacter.getObjectType().equals(Enum.GameObjectType.Mob) && ((Mob) abstractCharacter).behaviourType.equals(Enum.MobBehaviourType.SiegeEngine)) {
|
||||||
Mob siegeMobile = (Mob) abstractCharacter;
|
Mob siegeMobile = (Mob) abstractCharacter;
|
||||||
buildingSlot = siegeMobile.guardCaptain.siegeMinionMap.size() + 2;
|
buildingSlot = siegeMobile.guardCaptain.minions.size() + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buildingSlot == -1)
|
if (buildingSlot == -1)
|
||||||
|
|||||||
@@ -288,18 +288,22 @@ public class MobAI {
|
|||||||
MovementUtilities.aiMove(mob, mob.destination, true);
|
MovementUtilities.aiMove(mob, mob.destination, true);
|
||||||
|
|
||||||
if (mob.agentType.equals(Enum.AIAgentType.GUARDCAPTAIN))
|
if (mob.agentType.equals(Enum.AIAgentType.GUARDCAPTAIN))
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet())
|
for (Integer minionUUUD : mob.minions) {
|
||||||
|
|
||||||
|
Mob minion = Mob.getMob(minionUUUD);
|
||||||
|
|
||||||
//make sure mob is out of combat stance
|
//make sure mob is out of combat stance
|
||||||
|
|
||||||
if (minion.getKey().despawned == false) {
|
if (minion.despawned == false) {
|
||||||
if (MovementUtilities.canMove(minion.getKey())) {
|
if (MovementUtilities.canMove(minion)) {
|
||||||
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
Vector3f minionOffset = Formation.getOffset(2, mob.minions.indexOf(minionUUUD) + 3);
|
||||||
minion.getKey().updateLocation();
|
minion.updateLocation();
|
||||||
Vector3fImmutable formationPatrolPoint = new Vector3fImmutable(mob.destination.x + minionOffset.x, mob.destination.y, mob.destination.z + minionOffset.z);
|
Vector3fImmutable formationPatrolPoint = new Vector3fImmutable(mob.destination.x + minionOffset.x, mob.destination.y, mob.destination.z + minionOffset.z);
|
||||||
MovementUtilities.aiMove(minion.getKey(), formationPatrolPoint, true);
|
MovementUtilities.aiMove(minion, formationPatrolPoint, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
@@ -987,9 +991,11 @@ public class MobAI {
|
|||||||
|
|
||||||
//guard captain pulls his minions home with him
|
//guard captain pulls his minions home with him
|
||||||
|
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
|
for (Integer minionUUID : mob.minions) {
|
||||||
PowersManager.useMobPower(minion.getKey(), minion.getKey(), recall, 40);
|
Mob minion = Mob.getMob(minionUUID);
|
||||||
minion.getKey().setCombatTarget(null);
|
|
||||||
|
PowersManager.useMobPower(minion, minion, recall, 40);
|
||||||
|
minion.setCombatTarget(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1381,16 +1387,18 @@ public class MobAI {
|
|||||||
MovementUtilities.aiMove(mob, mob.destination, true);
|
MovementUtilities.aiMove(mob, mob.destination, true);
|
||||||
|
|
||||||
if (mob.agentType.equals(Enum.AIAgentType.GUARDCAPTAIN)) {
|
if (mob.agentType.equals(Enum.AIAgentType.GUARDCAPTAIN)) {
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
|
for (Integer minionUUID : mob.minions) {
|
||||||
|
|
||||||
|
Mob minion = Mob.getMob(minionUUID);
|
||||||
|
|
||||||
//make sure mob is out of combat stance
|
//make sure mob is out of combat stance
|
||||||
|
|
||||||
if (minion.getKey().despawned == false) {
|
if (minion.despawned == false) {
|
||||||
if (MovementUtilities.canMove(minion.getKey())) {
|
if (MovementUtilities.canMove(minion)) {
|
||||||
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
Vector3f minionOffset = Formation.getOffset(2, mob.minions.indexOf(minionUUID) + 3);
|
||||||
minion.getKey().updateLocation();
|
minion.updateLocation();
|
||||||
Vector3fImmutable formationPatrolPoint = new Vector3fImmutable(mob.destination.x + minionOffset.x, mob.destination.y, mob.destination.z + minionOffset.z);
|
Vector3fImmutable formationPatrolPoint = new Vector3fImmutable(mob.destination.x + minionOffset.x, mob.destination.y, mob.destination.z + minionOffset.z);
|
||||||
MovementUtilities.aiMove(minion.getKey(), formationPatrolPoint, true);
|
MovementUtilities.aiMove(minion, formationPatrolPoint, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,10 +58,10 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
||||||
|
|
||||||
if (!npc.siegeMinionMap.containsKey(toRemove))
|
if (!npc.minions.contains(toRemove.getObjectUUID()))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
npc.siegeMinionMap.remove(toRemove);
|
npc.minions.remove(toRemove.getObjectUUID());
|
||||||
|
|
||||||
WorldGrid.RemoveWorldObject(toRemove);
|
WorldGrid.RemoveWorldObject(toRemove);
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (npc.getContractID() == 842)
|
if (npc.getContractID() == 842)
|
||||||
maxSlots = 1;
|
maxSlots = 1;
|
||||||
|
|
||||||
if (npc.siegeMinionMap.size() == maxSlots)
|
if (npc.minions.size() == maxSlots)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
int mobBase;
|
int mobBase;
|
||||||
@@ -179,13 +179,13 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
||||||
|
|
||||||
if (!npc.getSiegeMinionMap().containsKey(toRemove))
|
if (!npc.minions.contains(toRemove.getObjectUUID()))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!DbManager.MobQueries.REMOVE_FROM_GUARDS(npc.getObjectUUID(), toRemove.firstName))
|
if (!DbManager.MobQueries.REMOVE_FROM_GUARDS(npc.getObjectUUID(), toRemove.firstName))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
npc.getSiegeMinionMap().remove(toRemove);
|
npc.minions.remove(toRemove.getObjectUUID());
|
||||||
|
|
||||||
WorldGrid.RemoveWorldObject(toRemove);
|
WorldGrid.RemoveWorldObject(toRemove);
|
||||||
|
|
||||||
@@ -258,7 +258,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (npc.getSiegeMinionMap().size() == maxSlots)
|
if (npc.minions.size() == maxSlots)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
int mobBase = npc.getMobBaseID();
|
int mobBase = npc.getMobBaseID();
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import org.pmw.tinylog.Logger;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -343,14 +342,17 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
writer.putInt(0); //runemaster list
|
writer.putInt(0); //runemaster list
|
||||||
|
|
||||||
//artillery captain list
|
//artillery captain list
|
||||||
ConcurrentHashMap<Mob, Integer> siegeMinions = npc.siegeMinionMap;
|
|
||||||
writer.putInt(1 + siegeMinions.size());
|
writer.putInt(1 + npc.minions.size());
|
||||||
serializeBulwarkList(writer, 1); //Trebuchet
|
serializeBulwarkList(writer, 1); //Trebuchet
|
||||||
//serializeBulwarkList(writer, 2); //Ballista
|
//serializeBulwarkList(writer, 2); //Ballista
|
||||||
|
|
||||||
if (siegeMinions != null && siegeMinions.size() > 0)
|
if (npc.minions != null && npc.minions.size() > 0)
|
||||||
|
|
||||||
|
for (Integer minionUUID : npc.minions) {
|
||||||
|
|
||||||
|
Mob mob = Mob.getMob(minionUUID);
|
||||||
|
|
||||||
for (Mob mob : siegeMinions.keySet()) {
|
|
||||||
this.unknown83 = mob.getObjectUUID();
|
this.unknown83 = mob.getObjectUUID();
|
||||||
writer.putInt(2);
|
writer.putInt(2);
|
||||||
writer.putInt(mob.getObjectType().ordinal());
|
writer.putInt(mob.getObjectType().ordinal());
|
||||||
@@ -666,14 +668,15 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
writer.putInt(0); //runemaster list
|
writer.putInt(0); //runemaster list
|
||||||
|
|
||||||
//artillery captain list
|
//artillery captain list
|
||||||
ConcurrentHashMap<Mob, Integer> siegeMinions = mobA.getSiegeMinionMap();
|
|
||||||
|
|
||||||
writer.putInt(siegeMinions.size() + 1);
|
writer.putInt(mobA.minions.size() + 1);
|
||||||
|
|
||||||
serializeGuardList(writer, mobA.getContract().getContractID(), mobA); //Guard
|
serializeGuardList(writer, mobA.getContract().getContractID(), mobA); //Guard
|
||||||
|
|
||||||
if (siegeMinions != null && siegeMinions.size() > 0)
|
if (mobA.minions != null && mobA.minions.size() > 0)
|
||||||
|
|
||||||
for (Mob mob : siegeMinions.keySet()) {
|
for (Integer minionUUID : mobA.minions) {
|
||||||
|
Mob mob = Mob.getMob(minionUUID);
|
||||||
this.unknown83 = mob.getObjectUUID();
|
this.unknown83 = mob.getObjectUUID();
|
||||||
writer.putInt(2);
|
writer.putInt(2);
|
||||||
writer.putInt(mob.getObjectType().ordinal());
|
writer.putInt(mob.getObjectType().ordinal());
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import java.sql.SQLException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
@@ -121,8 +122,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
private byte aoecntr = 0;
|
private byte aoecntr = 0;
|
||||||
|
|
||||||
public int hidden = 0; // current rank of hide/sneak/invis
|
public int hidden = 0; // current rank of hide/sneak/invis
|
||||||
|
public CopyOnWriteArrayList<Integer> minions = new CopyOnWriteArrayList();
|
||||||
public final ConcurrentHashMap<Mob, Integer> siegeMinionMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
|
||||||
|
|
||||||
public AbstractCharacter() {
|
public AbstractCharacter() {
|
||||||
super();
|
super();
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import engine.net.Dispatch;
|
|||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.msg.PetMsg;
|
import engine.net.client.msg.PetMsg;
|
||||||
import engine.net.client.msg.PlaceAssetMsg;
|
import engine.net.client.msg.PlaceAssetMsg;
|
||||||
import engine.powers.RuneSkillAdjustEntry;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -489,8 +488,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
minionMobile.setLoc(minionMobile.bindLoc);
|
minionMobile.setLoc(minionMobile.bindLoc);
|
||||||
minionMobile.despawn();
|
minionMobile.despawn();
|
||||||
|
|
||||||
int slot = guardCaptain.siegeMinionMap.size() + 1;
|
guardCaptain.minions.add(minionMobile.getObjectUUID());
|
||||||
guardCaptain.siegeMinionMap.put(minionMobile, slot);
|
|
||||||
|
|
||||||
return minionMobile;
|
return minionMobile;
|
||||||
}
|
}
|
||||||
@@ -520,8 +518,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
siegeMinion.setLoc(siegeMinion.bindLoc);
|
siegeMinion.setLoc(siegeMinion.bindLoc);
|
||||||
siegeMinion.despawn();
|
siegeMinion.despawn();
|
||||||
|
|
||||||
int slot = artyCaptain.siegeMinionMap.size() + 1;
|
artyCaptain.minions.add(siegeMinion.getObjectUUID());
|
||||||
artyCaptain.siegeMinionMap.put(siegeMinion, slot);
|
|
||||||
|
|
||||||
return siegeMinion;
|
return siegeMinion;
|
||||||
}
|
}
|
||||||
@@ -1783,10 +1780,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
this.weaponPower = weaponPower;
|
this.weaponPower = weaponPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConcurrentHashMap<Mob, Integer> getSiegeMinionMap() {
|
|
||||||
return siegeMinionMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DateTime getUpgradeDateTime() {
|
public DateTime getUpgradeDateTime() {
|
||||||
|
|
||||||
lock.readLock().lock();
|
lock.readLock().lock();
|
||||||
|
|||||||
@@ -640,28 +640,31 @@ public class NPC extends AbstractCharacter {
|
|||||||
|
|
||||||
public void removeMinions() {
|
public void removeMinions() {
|
||||||
|
|
||||||
for (Mob toRemove : this.siegeMinionMap.keySet()) {
|
|
||||||
|
for (Integer minionUUID : this.minions) {
|
||||||
|
|
||||||
|
Mob minionMob = Mob.getMob(minionUUID);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
toRemove.clearEffects();
|
minionMob.clearEffects();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e.getMessage());
|
Logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toRemove.getParentZone() != null)
|
if (minionMob.getParentZone() != null)
|
||||||
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
minionMob.getParentZone().zoneMobSet.remove(minionMob);
|
||||||
|
|
||||||
WorldGrid.RemoveWorldObject(toRemove);
|
WorldGrid.RemoveWorldObject(minionMob);
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(minionMob);
|
||||||
|
|
||||||
|
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
PlayerCharacter petOwner = (PlayerCharacter) minionMob.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
|
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
|
||||||
toRemove.guardCaptain = null;
|
minionMob.guardCaptain = null;
|
||||||
|
|
||||||
PetMsg petMsg = new PetMsg(5, null);
|
PetMsg petMsg = new PetMsg(5, null);
|
||||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
||||||
@@ -669,6 +672,7 @@ public class NPC extends AbstractCharacter {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user