|  |  |  | @ -451,21 +451,6 @@ public class MobileFSM {@@ -451,21 +451,6 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     private static void respawn(Mob aiAgent) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!aiAgent.canRespawn()) | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         long spawnTime = aiAgent.getSpawnTime(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (aiAgent.isPlayerGuard() && aiAgent.npcOwner != null && !aiAgent.npcOwner.isAlive()) | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (System.currentTimeMillis() > aiAgent.deathTime + spawnTime) { | 
			
		
	
		
			
				
					|  |  |  |  |             aiAgent.respawn(); | 
			
		
	
		
			
				
					|  |  |  |  |             aiAgent.setCombatTarget(null); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     public static boolean canCast(Mob mob) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // Performs validation to determine if a
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -578,6 +563,8 @@ public class MobileFSM {@@ -578,6 +563,8 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |         if (mob == null) { | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         //add default behaviour type
 | 
			
		
	
		
			
				
					|  |  |  |  |             mob.BehaviourType = MobBehaviourType.Aggro; | 
			
		
	
		
			
				
					|  |  |  |  |         if (mob.isAlive() == false) { | 
			
		
	
		
			
				
					|  |  |  |  |             //no need to continue if mob is dead, check for respawn and move on
 | 
			
		
	
		
			
				
					|  |  |  |  |             CheckForRespawn(mob); | 
			
		
	
	
		
			
				
					|  |  |  | @ -599,7 +586,7 @@ public class MobileFSM {@@ -599,7 +586,7 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |             CheckMobMovement(mob); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         //check if mob can attack if it isn't wimpy
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!mob.BehaviourType.isWimpy && !mob.isMoving()) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!mob.BehaviourType.isWimpy && !mob.isMoving() && mob.combatTarget != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             CheckForAttack(mob); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  |  | @ -631,11 +618,13 @@ public class MobileFSM {@@ -631,11 +618,13 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |  |             if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) { | 
			
		
	
		
			
				
					|  |  |  |  |                 aiAgent.setAggroTargetID(playerID); | 
			
		
	
		
			
				
					|  |  |  |  |                 aiAgent.setCombatTarget(loadedPlayer); | 
			
		
	
		
			
				
					|  |  |  |  |                 return; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     private static void CheckMobMovement(Mob mob) { | 
			
		
	
		
			
				
					|  |  |  |  |         mob.updateLocation(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (mob.getCombatTarget() == null) { | 
			
		
	
		
			
				
					|  |  |  |  |             //patrol
 | 
			
		
	
		
			
				
					|  |  |  |  |             int patrolRandom = ThreadLocalRandom.current().nextInt(1000); | 
			
		
	
	
		
			
				
					|  |  |  | @ -654,19 +643,18 @@ public class MobileFSM {@@ -654,19 +643,18 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |                         patrolRadius = 60; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     MovementUtilities.aiMove(mob, Vector3fImmutable.getRandomPointInCircle(mob.getBindLoc(), patrolRadius), true); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         }else { | 
			
		
	
		
			
				
					|  |  |  |  |             //chase target
 | 
			
		
	
		
			
				
					|  |  |  |  |             mob.updateMovementState(); | 
			
		
	
		
			
				
					|  |  |  |  |             if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mob.getRange()) == false) { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mob.getRange() > 15) { | 
			
		
	
		
			
				
					|  |  |  |  |                     mob.destination = mob.getCombatTarget().getLoc(); | 
			
		
	
		
			
				
					|  |  |  |  |                     MovementUtilities.moveToLocation(mob, mob.destination, 0); | 
			
		
	
		
			
				
					|  |  |  |  |                 } else { | 
			
		
	
		
			
				
					|  |  |  |  |                     //chase target
 | 
			
		
	
		
			
				
					|  |  |  |  |                     mob.updateMovementState(); | 
			
		
	
		
			
				
					|  |  |  |  |                     mob.updateLocation(); | 
			
		
	
		
			
				
					|  |  |  |  |                     if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mob.getRange()) == false) { | 
			
		
	
		
			
				
					|  |  |  |  |                         if (mob.getRange() > 15) { | 
			
		
	
		
			
				
					|  |  |  |  |                             mob.destination = mob.getCombatTarget().getLoc(); | 
			
		
	
		
			
				
					|  |  |  |  |                             MovementUtilities.moveToLocation(mob, mob.destination, 0); | 
			
		
	
		
			
				
					|  |  |  |  |                         } else { | 
			
		
	
		
			
				
					|  |  |  |  |                             mob.destination = MovementUtilities.GetDestinationToCharacter(mob, (AbstractCharacter) mob.getCombatTarget()); | 
			
		
	
		
			
				
					|  |  |  |  |                             MovementUtilities.moveToLocation(mob, mob.destination, mob.getRange()); | 
			
		
	
		
			
				
					|  |  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                     mob.destination = MovementUtilities.GetDestinationToCharacter(mob, (AbstractCharacter) mob.getCombatTarget()); | 
			
		
	
		
			
				
					|  |  |  |  |                     MovementUtilities.moveToLocation(mob, mob.destination, mob.getRange()); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  |  | @ -761,4 +749,19 @@ public class MobileFSM {@@ -761,4 +749,19 @@ public class MobileFSM { | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     private static void respawn(Mob aiAgent) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!aiAgent.canRespawn()) | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         long spawnTime = aiAgent.getSpawnTime(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (aiAgent.isPlayerGuard() && aiAgent.npcOwner != null && !aiAgent.npcOwner.isAlive()) | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (System.currentTimeMillis() > aiAgent.deathTime + spawnTime) { | 
			
		
	
		
			
				
					|  |  |  |  |             aiAgent.respawn(); | 
			
		
	
		
			
				
					|  |  |  |  |             aiAgent.setCombatTarget(null); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } |