@ -56,7 +56,7 @@ public class MobileFSM {
@@ -56,7 +56,7 @@ public class MobileFSM {
SpellAggroGrouperWimpy ( Spell , true , false , true , false , false ) ,
//Independent Types
SimpleStandingGuard ( null , false , false , false , false , false ) ,
Pet1 ( null , false , false , fals e, false , false ) ,
Pet1 ( null , false , false , tru e, false , false ) ,
Simple ( null , false , false , true , false , false ) ,
Helpee ( null , false , true , true , false , true ) ,
HelpeeWimpy ( null , true , false , true , false , false ) ,
@ -566,7 +566,11 @@ public class MobileFSM {
@@ -566,7 +566,11 @@ public class MobileFSM {
}
}
public static void run ( Mob mob ) {
if ( mob = = null | | mob . BehaviourType = = MobBehaviourType . None ) {
if ( mob = = null ) {
return ;
}
if ( mob . isPet ( ) = = false & & mob . isSummonedPet ( ) = = false & & mob . isNecroPet ( ) = = false ) {
if ( mob . BehaviourType ! = null & & mob . BehaviourType = = MobBehaviourType . None ) {
return ;
}
if ( mob . isAlive ( ) = = false ) {
@ -593,7 +597,12 @@ public class MobileFSM {
@@ -593,7 +597,12 @@ public class MobileFSM {
if ( ! mob . BehaviourType . isWimpy & & ! mob . isMoving ( ) & & mob . combatTarget ! = null ) {
CheckForAttack ( mob ) ;
}
} else {
CheckMobMovement ( mob ) ;
CheckForAttack ( mob ) ;
}
}
private static void CheckForAggro ( Mob aiAgent ) {
//looks for and sets mobs combatTarget
if ( ! aiAgent . isAlive ( ) ) {
@ -629,6 +638,7 @@ public class MobileFSM {
@@ -629,6 +638,7 @@ public class MobileFSM {
}
private static void CheckMobMovement ( Mob mob ) {
mob . updateLocation ( ) ;
if ( mob . isPet ( ) = = false & & mob . isSummonedPet ( ) = = false & & mob . isNecroPet ( ) = = false ) {
if ( mob . getCombatTarget ( ) = = null ) {
//patrol
int patrolRandom = ThreadLocalRandom . current ( ) . nextInt ( 1000 ) ;
@ -649,7 +659,7 @@ public class MobileFSM {
@@ -649,7 +659,7 @@ public class MobileFSM {
MovementUtilities . aiMove ( mob , Vector3fImmutable . getRandomPointInCircle ( mob . getBindLoc ( ) , patrolRadius ) , true ) ;
}
}
} else {
} else {
//chase target
mob . updateMovementState ( ) ;
if ( CombatUtilities . inRange2D ( mob , mob . getCombatTarget ( ) , mob . getRange ( ) ) = = false ) {
@ -662,6 +672,28 @@ public class MobileFSM {
@@ -662,6 +672,28 @@ public class MobileFSM {
}
}
}
} else {
//pet logic
if ( mob . getCombatTarget ( ) = = null | | mob . combatTarget . isAlive ( ) = = false ) {
//move back to owner
if ( CombatUtilities . inRange2D ( mob , mob . getOwner ( ) , 5 ) = = false ) {
mob . destination = mob . getOwner ( ) . getLoc ( ) ;
MovementUtilities . moveToLocation ( mob , mob . destination , 5 ) ;
}
} 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 {
mob . destination = MovementUtilities . GetDestinationToCharacter ( mob , ( AbstractCharacter ) mob . getCombatTarget ( ) ) ;
MovementUtilities . moveToLocation ( mob , mob . destination , mob . getRange ( ) ) ;
}
}
}
}
}
private static void CheckForRespawn ( Mob aiAgent ) {
//handles checking for respawn of dead mobs even when no players have mob loaded