@ -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,34 +566,43 @@ public class MobileFSM {
@@ -566,34 +566,43 @@ public class MobileFSM {
}
}
public static void run ( Mob mob ) {
if ( mob = = null | | mob . BehaviourType = = MobBehaviourType . None ) {
if ( mob = = null ) {
return ;
}
if ( mob . isAlive ( ) = = false ) {
//no need to continue if mob is dead, check for respawn and move on
CheckForRespawn ( mob ) ;
return ;
}
//check to see if mob has wandered too far from his bind loc
CheckToSendMobHome ( mob ) ;
//check to see if players have mob loaded
if ( mob . playerAgroMap . isEmpty ( ) ) {
//no players loaded, no need to proceed
return ;
}
//check for players that can be aggroed if mob is agressive and has no target
if ( mob . BehaviourType . isAgressive & & mob . getCombatTarget ( ) = = null ) {
CheckForAggro ( mob ) ;
}
//check if mob can move for patrol or moving to target
if ( mob . BehaviourType . canRoam ) {
if ( mob . isPet ( ) = = false & & mob . isSummonedPet ( ) = = false & & mob . isNecroPet ( ) = = false ) {
if ( mob . BehaviourType ! = null & & mob . BehaviourType = = MobBehaviourType . None ) {
return ;
}
if ( mob . isAlive ( ) = = false ) {
//no need to continue if mob is dead, check for respawn and move on
CheckForRespawn ( mob ) ;
return ;
}
//check to see if mob has wandered too far from his bind loc
CheckToSendMobHome ( mob ) ;
//check to see if players have mob loaded
if ( mob . playerAgroMap . isEmpty ( ) ) {
//no players loaded, no need to proceed
return ;
}
//check for players that can be aggroed if mob is agressive and has no target
if ( mob . BehaviourType . isAgressive & & mob . getCombatTarget ( ) = = null ) {
CheckForAggro ( mob ) ;
}
//check if mob can move for patrol or moving to target
if ( mob . BehaviourType . canRoam ) {
CheckMobMovement ( mob ) ;
}
//check if mob can attack if it isn't wimpy
if ( ! mob . BehaviourType . isWimpy & & ! mob . isMoving ( ) & & mob . combatTarget ! = null ) {
CheckForAttack ( mob ) ;
}
} else {
CheckMobMovement ( mob ) ;
}
//check if mob can attack if it isn't wimpy
if ( ! mob . BehaviourType . isWimpy & & ! mob . isMoving ( ) & & mob . combatTarget ! = null ) {
CheckForAttack ( mob ) ;
}
}
private static void CheckForAggro ( Mob aiAgent ) {
//looks for and sets mobs combatTarget
if ( ! aiAgent . isAlive ( ) ) {
@ -629,36 +638,59 @@ public class MobileFSM {
@@ -629,36 +638,59 @@ public class MobileFSM {
}
private static void CheckMobMovement ( Mob mob ) {
mob . updateLocation ( ) ;
if ( mob . getCombatTarget ( ) = = null ) {
//patrol
int patrolRandom = ThreadLocalRandom . current ( ) . nextInt ( 1000 ) ;
if ( patrolRandom < = MBServerStatics . AI_PATROL_DIVISOR ) {
if ( MovementUtilities . canMove ( mob ) & & ! mob . isMoving ( ) ) {
if ( mob . isPlayerGuard ( ) ) {
guardPatrol ( mob ) ;
return ;
if ( mob . isPet ( ) = = false & & mob . isSummonedPet ( ) = = false & & mob . isNecroPet ( ) = = false ) {
if ( mob . getCombatTarget ( ) = = null ) {
//patrol
int patrolRandom = ThreadLocalRandom . current ( ) . nextInt ( 1000 ) ;
if ( patrolRandom < = MBServerStatics . AI_PATROL_DIVISOR ) {
if ( MovementUtilities . canMove ( mob ) & & ! mob . isMoving ( ) ) {
if ( mob . isPlayerGuard ( ) ) {
guardPatrol ( mob ) ;
return ;
}
float patrolRadius = mob . getSpawnRadius ( ) ;
if ( patrolRadius > 256 )
patrolRadius = 256 ;
if ( patrolRadius < 60 )
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 {
mob . destination = MovementUtilities . GetDestinationToCharacter ( mob , ( AbstractCharacter ) mob . getCombatTarget ( ) ) ;
MovementUtilities . moveToLocation ( mob , mob . destination , mob . getRange ( ) ) ;
}
float patrolRadius = mob . getSpawnRadius ( ) ;
if ( patrolRadius > 256 )
patrolRadius = 256 ;
if ( patrolRadius < 60 )
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 {
mob . destination = MovementUtilities . GetDestinationToCharacter ( mob , ( AbstractCharacter ) mob . getCombatTarget ( ) ) ;
MovementUtilities . moveToLocation ( mob , mob . destination , mob . getRange ( ) ) ;
} 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 ( ) ) ;
}
}
}
}