|  |  | @ -96,7 +96,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.callsForHelp) |  |  |  |             if (mob.behaviourType.callsForHelp) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 MobCallForHelp(mob); |  |  |  |                 MobCallForHelp(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (!MovementUtilities.inRangeDropAggro(mob, target)) { |  |  |  |             if (!MovementUtilities.inRangeDropAggro(mob, target)) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -165,7 +165,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (playercity != null) |  |  |  |             if (playercity != null) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 for (Mob guard : playercity.getParent().zoneMobSet) |  |  |  |                 for (Mob guard : playercity.getParent().zoneMobSet) | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) |  |  |  |                     if (guard.behaviourType != null && guard.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                         if (guard.getCombatTarget() == null && !guard.getGuild().equals(mob.getGuild())) |  |  |  |                         if (guard.getCombatTarget() == null && !guard.getGuild().equals(mob.getGuild())) | 
			
		
	
		
		
			
				
					
					|  |  |  |                             guard.setCombatTarget(mob); |  |  |  |                             guard.setCombatTarget(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -260,7 +260,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //guard captains inherit barracks patrol points dynamically
 |  |  |  |             //guard captains inherit barracks patrol points dynamically
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) { |  |  |  |             if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 Building barracks = mob.building; |  |  |  |                 Building barracks = mob.building; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -280,7 +280,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             MovementUtilities.aiMove(mob, mob.destination, true); |  |  |  |             MovementUtilities.aiMove(mob, mob.destination, true); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) |  |  |  |             if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) |  |  |  |                 for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                     //make sure mob is out of combat stance
 |  |  |  |                     //make sure mob is out of combat stance
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -312,8 +312,8 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 int contractID; |  |  |  |                 int contractID; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(mob.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion)) |  |  |  |                 if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     contractID = mob.npcOwner.contract.getContractID(); |  |  |  |                     contractID = mob.guardCaptain.contract.getContractID(); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 else |  |  |  |                 else | 
			
		
	
		
		
			
				
					
					|  |  |  |                     contractID = mob.contract.getContractID(); |  |  |  |                     contractID = mob.contract.getContractID(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -350,7 +350,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             ArrayList<Integer> purgeTokens; |  |  |  |             ArrayList<Integer> purgeTokens; | 
			
		
	
		
		
			
				
					
					|  |  |  |             AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget(); |  |  |  |             AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.callsForHelp) |  |  |  |             if (mob.behaviourType.callsForHelp) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 MobCallForHelp(mob); |  |  |  |                 MobCallForHelp(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             // Generate a list of tokens from the mob powers for this mobile.
 |  |  |  |             // Generate a list of tokens from the mob powers for this mobile.
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -433,7 +433,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             ArrayList<Integer> purgeTokens; |  |  |  |             ArrayList<Integer> purgeTokens; | 
			
		
	
		
		
			
				
					
					|  |  |  |             AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget(); |  |  |  |             AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.callsForHelp) |  |  |  |             if (mob.behaviourType.callsForHelp) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 MobCallForHelp(mob); |  |  |  |                 MobCallForHelp(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             // Generate a list of tokens from the mob powers for this mobile.
 |  |  |  |             // Generate a list of tokens from the mob powers for this mobile.
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -564,7 +564,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             Zone mobCamp = mob.getParentZone(); |  |  |  |             Zone mobCamp = mob.getParentZone(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             for (Mob helper : mobCamp.zoneMobSet) { |  |  |  |             for (Mob helper : mobCamp.zoneMobSet) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (helper.BehaviourType.respondsToCallForHelp && helper.BehaviourType.BehaviourHelperType.equals(mob.BehaviourType)) { |  |  |  |                 if (helper.behaviourType.respondsToCallForHelp && helper.behaviourType.BehaviourHelperType.equals(mob.behaviourType)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     helper.setCombatTarget(mob.getCombatTarget()); |  |  |  |                     helper.setCombatTarget(mob.getCombatTarget()); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     callGotResponse = true; |  |  |  |                     callGotResponse = true; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
	
		
		
			
				
					|  |  | @ -608,8 +608,8 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.despawned && mob.isPlayerGuard) { |  |  |  |             if (mob.despawned && mob.isPlayerGuard) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) { |  |  |  |                 if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     if (mob.npcOwner.isAlive() == false || ((Mob) mob.npcOwner).despawned == true) { |  |  |  |                     if (mob.guardCaptain.isAlive() == false || ((Mob) mob.guardCaptain).despawned == true) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         //minions don't respawn while guard captain is dead
 |  |  |  |                         //minions don't respawn while guard captain is dead
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -625,7 +625,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 //check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
 |  |  |  |                 //check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) |  |  |  |                 if (mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     CheckToSendMobHome(mob); |  |  |  |                     CheckToSendMobHome(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
	
		
		
			
				
					|  |  | @ -646,7 +646,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) |  |  |  |             if (mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 CheckToSendMobHome(mob); |  |  |  |                 CheckToSendMobHome(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.getCombatTarget() != null) { |  |  |  |             if (mob.getCombatTarget() != null) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -673,7 +673,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             switch (mob.BehaviourType) { |  |  |  |             switch (mob.behaviourType) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 case GuardCaptain: |  |  |  |                 case GuardCaptain: | 
			
		
	
		
		
			
				
					
					|  |  |  |                     GuardCaptainLogic(mob); |  |  |  |                     GuardCaptainLogic(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     break; |  |  |  |                     break; | 
			
		
	
	
		
		
			
				
					|  |  | @ -684,6 +684,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     GuardWallArcherLogic(mob); |  |  |  |                     GuardWallArcherLogic(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     break; |  |  |  |                     break; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 case Pet1: |  |  |  |                 case Pet1: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 case SiegeEngine: | 
			
		
	
		
		
			
				
					
					|  |  |  |                     PetLogic(mob); |  |  |  |                     PetLogic(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     break; |  |  |  |                     break; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 case HamletGuard: |  |  |  |                 case HamletGuard: | 
			
		
	
	
		
		
			
				
					|  |  | @ -707,7 +708,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (!aiAgent.isAlive()) |  |  |  |             if (!aiAgent.isAlive()) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             ConcurrentHashMap<Integer, Boolean> loadedPlayers = aiAgent.playerAgroMap; |  |  |  |             ConcurrentHashMap<Integer, Float> loadedPlayers = aiAgent.playerAgroMap; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             for (Entry playerEntry : loadedPlayers.entrySet()) { |  |  |  |             for (Entry playerEntry : loadedPlayers.entrySet()) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -782,33 +783,39 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             mob.updateLocation(); |  |  |  |             mob.updateLocation(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             switch (mob.BehaviourType) { |  |  |  |             switch (mob.behaviourType) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 case Pet1: |  |  |  |                 case Pet1: | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (mob.getOwner() == null) |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     if ((PlayerCharacter) mob.guardCaptain == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |                         return; |  |  |  |                         return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (!mob.playerAgroMap.containsKey(mob.getOwner().getObjectUUID())) { |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     if (!mob.playerAgroMap.containsKey(((PlayerCharacter) mob.guardCaptain).getObjectUUID())) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         //mob no longer has its owner loaded, translocate pet to owner
 |  |  |  |                         //mob no longer has its owner loaded, translocate pet to owner
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         MovementManager.translocate(mob, mob.getOwner().getLoc(), null); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         MovementManager.translocate(mob, ((PlayerCharacter) mob.guardCaptain).getLoc(), null); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         return; |  |  |  |                         return; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (mob.getCombatTarget() == null) { |  |  |  |                     if (mob.getCombatTarget() == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         //move back to owner
 |  |  |  |                         //move back to owner
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if (CombatUtilities.inRange2D(mob, mob.getOwner(), 6)) |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         if (CombatUtilities.inRange2D(mob, (PlayerCharacter) mob.guardCaptain, 6)) | 
			
		
	
		
		
			
				
					
					|  |  |  |                             return; |  |  |  |                             return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         mob.destination = mob.getOwner().getLoc(); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         mob.destination = ((PlayerCharacter) mob.guardCaptain).getLoc(); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         MovementUtilities.moveToLocation(mob, mob.destination, 5); |  |  |  |                         MovementUtilities.moveToLocation(mob, mob.destination, 5); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } else |  |  |  |                     } else | 
			
		
	
		
		
			
				
					
					|  |  |  |                         chaseTarget(mob); |  |  |  |                         chaseTarget(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     break; |  |  |  |                     break; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 case GuardMinion: |  |  |  |                 case GuardMinion: | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (!mob.npcOwner.isAlive() || ((Mob) mob.npcOwner).despawned) |  |  |  |                     if (!mob.guardCaptain.isAlive() || ((Mob) mob.guardCaptain).despawned) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                         randomGuardPatrolPoint(mob); |  |  |  |                         randomGuardPatrolPoint(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     else { |  |  |  |                     else { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if (mob.getCombatTarget() != null) { |  |  |  |                         if (mob.getCombatTarget() != null) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -893,7 +900,8 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.getCombatTarget() == null) |  |  |  |             if (mob.getCombatTarget() == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false && mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) { |  |  |  |             if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false && | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mob.setCombatTarget(null); |  |  |  |                 mob.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
	
		
		
			
				
					|  |  | @ -909,10 +917,10 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void CheckToSendMobHome(Mob mob) { |  |  |  |     private static void CheckToSendMobHome(Mob mob) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |         try { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.isAgressive) { |  |  |  |             if (mob.behaviourType.isAgressive) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.isPlayerGuard()) { |  |  |  |                 if (mob.isPlayerGuard()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) |  |  |  |                     if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                         CheckForPlayerGuardAggro(mob); |  |  |  |                         CheckForPlayerGuardAggro(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } else { |  |  |  |                 } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     CheckForAggro(mob); |  |  |  |                     CheckForAggro(mob); | 
			
		
	
	
		
		
			
				
					|  |  | @ -932,7 +940,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     PowersManager.useMobPower(mob, mob, recall, 40); |  |  |  |                     PowersManager.useMobPower(mob, mob, recall, 40); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     mob.setCombatTarget(null); |  |  |  |                     mob.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal() && mob.isAlive()) { |  |  |  |                     if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain) && mob.isAlive()) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         //guard captain pulls his minions home with him
 |  |  |  |                         //guard captain pulls his minions home with him
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -948,8 +956,8 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 PowersManager.useMobPower(mob, mob, recall, 40); |  |  |  |                 PowersManager.useMobPower(mob, mob, recall, 40); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mob.setCombatTarget(null); |  |  |  |                 mob.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 for (Entry playerEntry : mob.playerAgroMap.entrySet()) |  |  |  |                 for (Integer playerEntry : mob.playerAgroMap.keySet()) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     PlayerCharacter.getFromCache((int) playerEntry.getKey()).setHateValue(0); |  |  |  |                     mob.playerAgroMap.put(playerEntry,0f); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } catch (Exception e) { |  |  |  |         } catch (Exception e) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage()); |  |  |  |             Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage()); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1013,7 +1021,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if ((aggroMob.agentType.equals(Enum.AIAgentType.GUARD))) |  |  |  |                 if ((aggroMob.agentType.equals(Enum.AIAgentType.GUARD))) | 
			
		
	
		
		
			
				
					
					|  |  |  |                     continue; |  |  |  |                     continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(aggroMob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)) |  |  |  |                 if (aggroMob.behaviourType.equals(Enum.MobBehaviourType.Pet1)) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     continue; |  |  |  |                     continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.getLoc().distanceSquared2D(aggroMob.getLoc()) > sqr(50)) |  |  |  |                 if (mob.getLoc().distanceSquared2D(aggroMob.getLoc()) > sqr(50)) | 
			
		
	
	
		
		
			
				
					|  |  | @ -1054,7 +1062,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static void GuardMinionLogic(Mob mob) { |  |  |  |     public static void GuardMinionLogic(Mob mob) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |         try { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (!mob.npcOwner.isAlive()) { |  |  |  |             if (!mob.guardCaptain.isAlive()) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.getCombatTarget() == null) { |  |  |  |                 if (mob.getCombatTarget() == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     CheckForPlayerGuardAggro(mob); |  |  |  |                     CheckForPlayerGuardAggro(mob); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1073,10 +1081,9 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |             }else { |  |  |  |             }else { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.npcOwner.getCombatTarget() != null) |  |  |  |                 if (mob.guardCaptain.getCombatTarget() != null) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     mob.setCombatTarget(mob.npcOwner.getCombatTarget()); |  |  |  |                     mob.setCombatTarget(mob.guardCaptain.getCombatTarget()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 else |  |  |  |                 else if (mob.getCombatTarget() != null) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     if (mob.getCombatTarget() != null) |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     mob.setCombatTarget(null); |  |  |  |                     mob.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             CheckMobMovement(mob); |  |  |  |             CheckMobMovement(mob); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1102,11 +1109,12 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |         try { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.getOwner() == null && mob.isNecroPet() == false && mob.isSiege() == false) |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if (mob.guardCaptain == null && mob.isNecroPet() == false && mob.isSiege() == false) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (ZoneManager.getSeaFloor().zoneMobSet.contains(mob)) |  |  |  |                 if (ZoneManager.getSeaFloor().zoneMobSet.contains(mob)) | 
			
		
	
		
		
			
				
					
					|  |  |  |                     mob.killCharacter("no owner"); |  |  |  |                     mob.killCharacter("no owner"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (MovementUtilities.canMove(mob) && mob.BehaviourType.canRoam) |  |  |  |             if (MovementUtilities.canMove(mob) && mob.behaviourType.canRoam) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 CheckMobMovement(mob); |  |  |  |                 CheckMobMovement(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             CheckForAttack(mob); |  |  |  |             CheckForAttack(mob); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1156,7 +1164,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false) |  |  |  |             if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mob.setCombatTarget(null); |  |  |  |                 mob.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.isAgressive) { |  |  |  |             if (mob.behaviourType.isAgressive) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob); |  |  |  |                 AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1164,7 +1172,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     mob.setCombatTarget(newTarget); |  |  |  |                     mob.setCombatTarget(newTarget); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 else { |  |  |  |                 else { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if (mob.getCombatTarget() == null) { |  |  |  |                     if (mob.getCombatTarget() == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard) |  |  |  |                         if (mob.behaviourType == Enum.MobBehaviourType.HamletGuard) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                             SafeGuardAggro(mob);  //safehold guard
 |  |  |  |                             SafeGuardAggro(mob);  //safehold guard
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         else |  |  |  |                         else | 
			
		
	
		
		
			
				
					
					|  |  |  |                             CheckForAggro(mob);   //normal aggro
 |  |  |  |                             CheckForAggro(mob);   //normal aggro
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1174,12 +1182,12 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //check if mob can move for patrol or moving to target
 |  |  |  |             //check if mob can move for patrol or moving to target
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.canRoam) |  |  |  |             if (mob.behaviourType.canRoam) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 CheckMobMovement(mob); |  |  |  |                 CheckMobMovement(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //check if mob can attack if it isn't wimpy
 |  |  |  |             //check if mob can attack if it isn't wimpy
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (!mob.BehaviourType.isWimpy && mob.getCombatTarget() != null) |  |  |  |             if (!mob.behaviourType.isWimpy && mob.getCombatTarget() != null) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 CheckForAttack(mob); |  |  |  |                 CheckForAttack(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         } catch (Exception e) { |  |  |  |         } catch (Exception e) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1196,7 +1204,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (!mob.isAlive()) |  |  |  |             if (!mob.isAlive()) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             ConcurrentHashMap<Integer, Boolean> loadedPlayers = mob.playerAgroMap; |  |  |  |             ConcurrentHashMap<Integer, Float> loadedPlayers = mob.playerAgroMap; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             for (Entry playerEntry : loadedPlayers.entrySet()) { |  |  |  |             for (Entry playerEntry : loadedPlayers.entrySet()) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1244,8 +1252,8 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.getGuild().getNation().equals(target.getGuild().getNation())) |  |  |  |             if (mob.getGuild().getNation().equals(target.getGuild().getNation())) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return false; |  |  |  |                 return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) { |  |  |  |             if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 if (((Mob) mob.npcOwner).building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) { |  |  |  |                 if (((Mob) mob.guardCaptain).building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     return true; |  |  |  |                     return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |             } else if (mob.building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) { |  |  |  |             } else if (mob.building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1329,7 +1337,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             MovementUtilities.aiMove(mob, mob.destination, true); |  |  |  |             MovementUtilities.aiMove(mob, mob.destination, true); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) { |  |  |  |             if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) { |  |  |  |                 for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                     //make sure mob is out of combat stance
 |  |  |  |                     //make sure mob is out of combat stance
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1356,7 +1364,7 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |             float CurrentHateValue = 0; |  |  |  |             float CurrentHateValue = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) |  |  |  |             if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 CurrentHateValue = ((PlayerCharacter) mob.getCombatTarget()).getHateValue(); |  |  |  |                 CurrentHateValue = mob.playerAgroMap.get(mob.combatTarget.getObjectUUID()).floatValue(); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             AbstractWorldObject mostHatedTarget = null; |  |  |  |             AbstractWorldObject mostHatedTarget = null; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1367,8 +1375,8 @@ public class MobAI { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (potentialTarget.equals(mob.getCombatTarget())) |  |  |  |                 if (potentialTarget.equals(mob.getCombatTarget())) | 
			
		
	
		
		
			
				
					
					|  |  |  |                     continue; |  |  |  |                     continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (potentialTarget != null && potentialTarget.getHateValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) { |  |  |  |                 if (potentialTarget != null && mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     CurrentHateValue = potentialTarget.getHateValue(); |  |  |  |                     CurrentHateValue = mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue(); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     mostHatedTarget = potentialTarget; |  |  |  |                     mostHatedTarget = potentialTarget; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |