@ -13,6 +13,7 @@ import engine.InterestManagement.WorldGrid;
@@ -13,6 +13,7 @@ import engine.InterestManagement.WorldGrid;
import engine.ai.utilities.CombatUtilities ;
import engine.ai.utilities.MovementUtilities ;
import engine.gameManager.* ;
import engine.math.Vector2f ;
import engine.math.Vector3f ;
import engine.math.Vector3fImmutable ;
import engine.net.DispatchMessage ;
@ -350,7 +351,9 @@ public class MobileFSM {
@@ -350,7 +351,9 @@ public class MobileFSM {
}
CheckForRespawn ( mob ) ;
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
if ( mob . BehaviourType . ordinal ( ) ! = Enum . MobBehaviourType . Pet1 . ordinal ( ) ) {
CheckToSendMobHome ( mob ) ;
}
return ;
}
if ( ! mob . isAlive ( ) ) {
@ -358,7 +361,7 @@ public class MobileFSM {
@@ -358,7 +361,7 @@ public class MobileFSM {
CheckForRespawn ( mob ) ;
return ;
}
if ( mob . playerAgroMap . isEmpty ( ) & & mob . isPlayerGuard = = false )
if ( mob . playerAgroMap . isEmpty ( ) & & mob . isPlayerGuard = = false & & mob . BehaviourType . ordinal ( ) ! = Enum . MobBehaviourType . Pet1 . ordinal ( ) )
//no players loaded, no need to proceed
return ;
if ( mob . isCombat ( ) & & mob . getCombatTarget ( ) = = null ) {
@ -368,10 +371,13 @@ public class MobileFSM {
@@ -368,10 +371,13 @@ public class MobileFSM {
DispatchMessage . sendToAllInRange ( mob , rwss ) ;
}
mob . updateLocation ( ) ;
if ( mob . BehaviourType . ordinal ( ) ! = Enum . MobBehaviourType . Pet1 . ordinal ( ) ) {
CheckToSendMobHome ( mob ) ;
}
if ( mob . combatTarget ! = null & & mob . combatTarget . isAlive ( ) = = false ) {
mob . setCombatTarget ( null ) ;
}
mob . updateLocation ( ) ;
switch ( mob . BehaviourType ) {
case GuardCaptain :
GuardCaptainLogic ( mob ) ;
@ -430,6 +436,9 @@ public class MobileFSM {
@@ -430,6 +436,9 @@ public class MobileFSM {
return ;
switch ( mob . BehaviourType ) {
case Pet1 :
if ( mob . getOwner ( ) = = null ) {
return ;
}
if ( ! mob . playerAgroMap . containsKey ( mob . getOwner ( ) . getObjectUUID ( ) ) ) {
//mob no longer has its owner loaded, translocate pet to owner
MovementManager . translocate ( mob , mob . getOwner ( ) . getLoc ( ) , null ) ;
@ -479,6 +488,7 @@ public class MobileFSM {
@@ -479,6 +488,7 @@ public class MobileFSM {
if ( System . currentTimeMillis ( ) > aiAgent . deathTime + MBServerStatics . DESPAWN_TIMER_WITH_LOOT ) {
aiAgent . despawn ( ) ;
aiAgent . deathTime = System . currentTimeMillis ( ) ;
return ;
}
//No items in inventory.
} else {
@ -487,17 +497,20 @@ public class MobileFSM {
@@ -487,17 +497,20 @@ public class MobileFSM {
if ( System . currentTimeMillis ( ) > aiAgent . deathTime + MBServerStatics . DESPAWN_TIMER_ONCE_LOOTED ) {
aiAgent . despawn ( ) ;
aiAgent . deathTime = System . currentTimeMillis ( ) ;
return ;
}
//Mob never had Loot.
} else {
if ( System . currentTimeMillis ( ) > aiAgent . deathTime + MBServerStatics . DESPAWN_TIMER ) {
aiAgent . despawn ( ) ;
aiAgent . deathTime = System . currentTimeMillis ( ) ;
return ;
}
}
}
} else if ( System . currentTimeMillis ( ) > aiAgent . deathTime + ( aiAgent . spawnTime * 1000 ) ) {
} else if ( System . currentTimeMillis ( ) > ( aiAgent . deathTime + ( aiAgent . spawnTime * 1000 ) ) ) {
aiAgent . respawn ( ) ;
return ;
}
}
@ -568,17 +581,28 @@ public class MobileFSM {
@@ -568,17 +581,28 @@ public class MobileFSM {
private static void chaseTarget ( Mob mob ) {
mob . updateMovementState ( ) ;
if ( mob . playerAgroMap . containsKey ( mob . getCombatTarget ( ) . getObjectUUID ( ) ) = = false ) {
mob . setCombatTarget ( null ) ;
return ;
}
//if (mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false) {
// mob.setCombatTarget(null);
// return;
//}
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 {
//check if building
switch ( mob . getCombatTarget ( ) . getObjectType ( ) ) {
case PlayerCharacter :
case Mob :
mob . destination = MovementUtilities . GetDestinationToCharacter ( mob , ( AbstractCharacter ) mob . getCombatTarget ( ) ) ;
MovementUtilities . moveToLocation ( mob , mob . destination , mob . getRange ( ) ) ;
break ;
case Building :
mob . destination = mob . getCombatTarget ( ) . getLoc ( ) ;
MovementUtilities . moveToLocation ( mob , mob . getCombatTarget ( ) . getLoc ( ) , 0 ) ;
break ;
}
}
}
}
@ -626,6 +650,11 @@ public class MobileFSM {
@@ -626,6 +650,11 @@ public class MobileFSM {
}
private static void PetLogic ( Mob mob ) {
if ( mob . getOwner ( ) = = null & & mob . isNecroPet ( ) = = false & & mob . isSiege ( ) = = false ) {
if ( ZoneManager . getSeaFloor ( ) . zoneMobSet . contains ( mob ) ) {
mob . killCharacter ( "no owner" ) ;
}
}
if ( mob . getCombatTarget ( ) ! = null & & ! mob . getCombatTarget ( ) . isAlive ( ) )
mob . setCombatTarget ( null ) ;
if ( MovementUtilities . canMove ( mob ) & & mob . BehaviourType . canRoam )