|  |  | @ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.concurrent.ThreadLocalRandom; |  |  |  | import java.util.concurrent.ThreadLocalRandom; | 
			
		
	
		
		
			
				
					
					|  |  |  | import static engine.math.FastMath.sqr; |  |  |  | import static engine.math.FastMath.sqr; | 
			
		
	
		
		
			
				
					
					|  |  |  | public class MobileFSM { |  |  |  | public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public static int AI_POWER_CHANCE = 30; // set 1 -100 to determine mobs chance to cast a spell
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void AttackTarget(Mob mob, AbstractWorldObject target) { |  |  |  |     private static void AttackTarget(Mob mob, AbstractWorldObject target) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mob == null) |  |  |  |         if (mob == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
	
		
		
			
				
					|  |  | @ -170,7 +171,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         //make sure mob is out of combat stance
 |  |  |  |         //make sure mob is out of combat stance
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(mob.stopPatrolTime == 0) { |  |  |  |         if(mob.stopPatrolTime == 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             mob.stopPatrolTime = System.currentTimeMillis(); |  |  |  |             mob.stopPatrolTime = System.currentTimeMillis(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mob.isCombat() && mob.getCombatTarget() == null) { |  |  |  |         if (mob.isCombat() && mob.getCombatTarget() == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             mob.setCombat(false); |  |  |  |             mob.setCombat(false); | 
			
		
	
	
		
		
			
				
					|  |  | @ -188,7 +188,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mob.patrolPoints = barracks.patrolPoints; |  |  |  |                 mob.patrolPoints = barracks.patrolPoints; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } else{ |  |  |  |             } else{ | 
			
		
	
		
		
			
				
					
					|  |  |  |                 randomGuardPatrolPoint(mob); |  |  |  |                 randomGuardPatrolPoint(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mob.stopPatrolTime = System.currentTimeMillis() + (MBServerStatics.AI_PATROL_DIVISOR * 1000); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
	
		
		
			
				
					|  |  | @ -198,7 +197,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         mob.destination = mob.patrolPoints.get(mob.lastPatrolPointIndex); |  |  |  |         mob.destination = mob.patrolPoints.get(mob.lastPatrolPointIndex); | 
			
		
	
		
		
			
				
					
					|  |  |  |         mob.lastPatrolPointIndex += 1; |  |  |  |         mob.lastPatrolPointIndex += 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |         MovementUtilities.aiMove(mob, mob.destination, true); |  |  |  |         MovementUtilities.aiMove(mob, mob.destination, true); | 
			
		
	
		
		
			
				
					
					|  |  |  |         mob.stopPatrolTime = System.currentTimeMillis() + (MBServerStatics.AI_PATROL_DIVISOR * 1000); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()){ |  |  |  |         if(mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()){ | 
			
		
	
		
		
			
				
					
					|  |  |  |             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
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -214,6 +212,7 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         minion.getKey().updateLocation(); |  |  |  |                         minion.getKey().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.getKey(), formationPatrolPoint, true); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         MovementUtilities.moveToLocation(minion.getKey(),formationPatrolPoint,0); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
	
		
		
			
				
					|  |  | @ -224,7 +223,7 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         // mobile in the proper state to cast.
 |  |  |  |         // mobile in the proper state to cast.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mob == null) |  |  |  |         if (mob == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(ThreadLocalRandom.current().nextInt(100) > MBServerStatics.AI_POWER_CHANCE){ |  |  |  |         if(ThreadLocalRandom.current().nextInt(100) > AI_POWER_CHANCE){ | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mob.mobPowers.isEmpty()) |  |  |  |         if (mob.mobPowers.isEmpty()) | 
			
		
	
	
		
		
			
				
					|  |  | @ -421,6 +420,8 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (mob.getCombatTarget() == null) { |  |  |  |                 if (mob.getCombatTarget() == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if(!mob.isMoving()) { |  |  |  |                     if(!mob.isMoving()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         Patrol(mob); |  |  |  |                         Patrol(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     } else{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         mob.stopPatrolTime = System.currentTimeMillis(); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 }else { |  |  |  |                 }else { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     chaseTarget(mob); |  |  |  |                     chaseTarget(mob); | 
			
		
	
	
		
		
			
				
					|  |  | @ -579,9 +580,6 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static void DefaultLogic(Mob mob) { |  |  |  |     private static void DefaultLogic(Mob mob) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(mob.getObjectUUID() == 40548){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             int thing = 0; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //check for players that can be aggroed if mob is agressive and has no target
 |  |  |  |         //check for players that can be aggroed if mob is agressive and has no target
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mob.BehaviourType.isAgressive) { |  |  |  |         if (mob.BehaviourType.isAgressive) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob); |  |  |  |             AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob); | 
			
		
	
	
		
		
			
				
					|  |  | @ -604,6 +602,9 @@ public class MobileFSM { | 
			
		
	
		
		
			
				
					
					|  |  |  |         //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.isMoving() && mob.combatTarget != null) |  |  |  |         if (!mob.BehaviourType.isWimpy && !mob.isMoving() && mob.combatTarget != null) | 
			
		
	
		
		
			
				
					
					|  |  |  |             CheckForAttack(mob); |  |  |  |             CheckForAttack(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(mob.combatTarget != null){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             CheckForAttack(mob); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static void CheckForPlayerGuardAggro(Mob mob) { |  |  |  |     public static void CheckForPlayerGuardAggro(Mob mob) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         //looks for and sets mobs combatTarget
 |  |  |  |         //looks for and sets mobs combatTarget
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |