|  |  | @ -63,7 +63,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |             case Idle: |  |  |  |             case Idle: | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.isAlive()) |  |  |  |                 if (mob.isAlive()) | 
			
		
	
		
		
			
				
					
					|  |  |  |                     mob.updateLocation(); |  |  |  |                     mob.updateLocation(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.isPlayerGuard()) { |  |  |  |                 if (mob.isPlayerGuard()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     guardAwake(mob); |  |  |  |                     guardAwake(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     break; |  |  |  |                     break; | 
			
		
	
	
		
		
			
				
					|  |  | @ -167,9 +166,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         return false; |  |  |  |         return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static Mob getMobile(int mobileID) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return Mob.getFromCache(mobileID); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void idle(Mob mob) { |  |  |  |     private static void idle(Mob mob) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mob.getLoc().distanceSquared2D(mob.getBindLoc()) > sqr(2000)) { |  |  |  |         if (mob.getLoc().distanceSquared2D(mob.getBindLoc()) > sqr(2000)) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1070,31 +1066,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         HashMap<Integer, Integer> staticPowers = aiAgent.getMobBase().getStaticPowers(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (staticPowers != null && !staticPowers.isEmpty()) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             int chance = ThreadLocalRandom.current().nextInt(100); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (chance <= MBServerStatics.AI_POWER_DIVISOR) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 ArrayList<Integer> powerList = new ArrayList<>(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 for (Integer key : staticPowers.keySet()) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                     powerList.add(key); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 int randomPower = ThreadLocalRandom.current().nextInt(powerList.size()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 int powerToken = powerList.get(randomPower); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 PowersBase pb = PowersManager.getPowerByToken(powerToken); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (pb != null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                     PowersManager.useMobPower(aiAgent, aggroTarget, pb, staticPowers.get(powerToken)); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!MovementUtilities.inRangeOfBindLocation(aiAgent)) { |  |  |  |         if (!MovementUtilities.inRangeOfBindLocation(aiAgent)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             aiAgent.setCombatTarget(null); |  |  |  |             aiAgent.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  |             aiAgent.setAggroTargetID(0); |  |  |  |             aiAgent.setAggroTargetID(0); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1213,14 +1184,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         aiAgent.setState(STATE.Awake); |  |  |  |         aiAgent.setState(STATE.Awake); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static void goHome(Mob aiAgent, boolean walk) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (aiAgent.getState() != STATE.Dead) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             aiAgent.setWalkingHome(walk); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             aiAgent.setAggroTargetID(0); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             aiAgent.setState(STATE.Home); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void dead(Mob aiAgent) { |  |  |  |     private static void dead(Mob aiAgent) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         //Despawn Timer with Loot currently in inventory.
 |  |  |  |         //Despawn Timer with Loot currently in inventory.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (aiAgent.getCharItemManager().getInventoryCount() > 0) { |  |  |  |         if (aiAgent.getCharItemManager().getInventoryCount() > 0) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1633,21 +1596,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         aiAgent.setCombatTarget(null); |  |  |  |         aiAgent.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  |         aiAgent.setState(STATE.Awake); |  |  |  |         aiAgent.setState(STATE.Awake); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void guardRespawn(Mob aiAgent) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!aiAgent.canRespawn()) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (aiAgent.isPlayerGuard() && aiAgent.getNpcOwner() != null && !aiAgent.getNpcOwner().isAlive()) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         long spawnTime = aiAgent.getSpawnTime(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (System.currentTimeMillis() > aiAgent.getDeathTime() + spawnTime) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             aiAgent.respawn(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             aiAgent.setState(STATE.Idle); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void respawn(Mob aiAgent) { |  |  |  |     private static void respawn(Mob aiAgent) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!aiAgent.canRespawn()) |  |  |  |         if (!aiAgent.canRespawn()) | 
			
		
	
	
		
		
			
				
					|  |  | @ -1682,13 +1630,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         MovementUtilities.moveToLocation(aiAgent, aiAgent.getCombatTarget().getLoc(), aiAgent.getRange()); |  |  |  |         MovementUtilities.moveToLocation(aiAgent, aiAgent.getCombatTarget().getLoc(), aiAgent.getRange()); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void moveToWorldObjectRegion(Mob mob, AbstractWorldObject regionObject) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (regionObject.getRegion() == null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         MovementManager.translocate(mob, regionObject.getLoc(), null); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static boolean canCast(Mob mob) { |  |  |  |     public static boolean canCast(Mob mob) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(mob == null){ |  |  |  |         if(mob == null){ | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |             return false; | 
			
		
	
	
		
		
			
				
					|  |  | 
 |