|  |  |  | @ -22,6 +22,7 @@ import engine.server.MBServerStatics;@@ -22,6 +22,7 @@ import engine.server.MBServerStatics; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.ArrayList; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.HashMap; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.HashSet; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.Map; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.Map.Entry; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.concurrent.ConcurrentHashMap; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.concurrent.ThreadLocalRandom; | 
			
		
	
	
		
			
				
					|  |  |  | @ -533,6 +534,11 @@ public class MobileFSM {@@ -533,6 +534,11 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |         if (mob == null) { | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         if(mob.BehaviourType.ordinal() == MobBehaviourType.GuardCaptain.ordinal()){ | 
			
		
	
		
			
				
					|  |  |  |  |             //this is a player slotted guard captain
 | 
			
		
	
		
			
				
					|  |  |  |  |             GuardCaptainLogic(mob); | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         if (mob.isPet() == false && mob.isSummonedPet() == false && mob.isNecroPet() == false) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (mob.isAlive() == false) { | 
			
		
	
		
			
				
					|  |  |  |  |                 //no need to continue if mob is dead, check for respawn and move on
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -768,4 +774,79 @@ public class MobileFSM {@@ -768,4 +774,79 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |             mob.setCombatTarget(aggroMob); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     public static void GuardCaptainLogic(Mob mob){ | 
			
		
	
		
			
				
					|  |  |  |  |         if (mob.playerAgroMap.isEmpty()) { | 
			
		
	
		
			
				
					|  |  |  |  |             //no players loaded, no need to proceed
 | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         if (mob.isAlive() == false) { | 
			
		
	
		
			
				
					|  |  |  |  |             //no need to continue if mob is dead, check for respawn and move on
 | 
			
		
	
		
			
				
					|  |  |  |  |             CheckForRespawn(mob); | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         CheckToSendMobHome(mob); | 
			
		
	
		
			
				
					|  |  |  |  |         CheckForPlayerGuardAggro(mob); | 
			
		
	
		
			
				
					|  |  |  |  |         CheckMobMovement(mob); | 
			
		
	
		
			
				
					|  |  |  |  |         CheckForAttack(mob); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     public static void CheckForPlayerGuardAggro(Mob mob) { | 
			
		
	
		
			
				
					|  |  |  |  |         //looks for and sets mobs combatTarget
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!mob.isAlive()) { | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         ConcurrentHashMap<Integer, Boolean> loadedPlayers = mob.playerAgroMap; | 
			
		
	
		
			
				
					|  |  |  |  |         for (Entry playerEntry : loadedPlayers.entrySet()) { | 
			
		
	
		
			
				
					|  |  |  |  |             int playerID = (int) playerEntry.getKey(); | 
			
		
	
		
			
				
					|  |  |  |  |             PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerID); | 
			
		
	
		
			
				
					|  |  |  |  |             //Player is null, let's remove them from the list.
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (loadedPlayer == null) { | 
			
		
	
		
			
				
					|  |  |  |  |                 loadedPlayers.remove(playerID); | 
			
		
	
		
			
				
					|  |  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             //Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (!loadedPlayer.isAlive()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 loadedPlayers.remove(playerID); | 
			
		
	
		
			
				
					|  |  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             //Can't see target, skip aggro.
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (!mob.canSee(loadedPlayer)) { | 
			
		
	
		
			
				
					|  |  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             // No aggro for this player
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (GuardCanAggro(mob,loadedPlayer) == false) | 
			
		
	
		
			
				
					|  |  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |  |             if (MovementUtilities.inRangeToAggro(mob, loadedPlayer)) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mob.setAggroTargetID(playerID); | 
			
		
	
		
			
				
					|  |  |  |  |                 mob.setCombatTarget(loadedPlayer); | 
			
		
	
		
			
				
					|  |  |  |  |                 return; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     private static Boolean GuardCanAggro(Mob mob, PlayerCharacter target){ | 
			
		
	
		
			
				
					|  |  |  |  |         //first check condemn list for aggro allowed
 | 
			
		
	
		
			
				
					|  |  |  |  |         if(ZoneManager.getCityAtLocation(mob.building.getLoc()).getTOL().enforceKOS) { | 
			
		
	
		
			
				
					|  |  |  |  |             for (Entry<Integer, Condemned> entry : ZoneManager.getCityAtLocation(mob.building.getLoc()).getTOL().getCondemned().entrySet()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (entry.getValue().getPlayerUID() == target.getObjectUUID() && entry.getValue().isActive()) { | 
			
		
	
		
			
				
					|  |  |  |  |                     //target is listed individually
 | 
			
		
	
		
			
				
					|  |  |  |  |                     return true; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 if(Guild.getGuild(entry.getValue().getGuildUID()) == target.getGuild()){ | 
			
		
	
		
			
				
					|  |  |  |  |                     //target's guild is listed
 | 
			
		
	
		
			
				
					|  |  |  |  |                     return true; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 if(Guild.getGuild(entry.getValue().getGuildUID()) == target.getGuild().getNation()){ | 
			
		
	
		
			
				
					|  |  |  |  |                     //target's nation is listed
 | 
			
		
	
		
			
				
					|  |  |  |  |                     return true; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         //next check not in same nation or allied guild/nation
 | 
			
		
	
		
			
				
					|  |  |  |  |         if(!mob.building.getGuild().getNation().equals(target.getGuild().getNation())) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (!mob.building.getGuild().getAllyList().contains(target.getGuild()) || !mob.building.getGuild().getAllyList().contains(target.getGuild().getNation())) { | 
			
		
	
		
			
				
					|  |  |  |  |                 return true; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         return false; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } |