Browse Source

new chase logic for mobs

master
FatBoy-DOTC 2 years ago
parent
commit
0ee7507467
  1. 69
      src/engine/ai/MobileFSM.java

69
src/engine/ai/MobileFSM.java

@ -5,21 +5,15 @@ @@ -5,21 +5,15 @@
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.ai;
import engine.Enum;
import engine.Enum.DispatchChannel;
import engine.ai.utilities.CombatUtilities;
import engine.ai.utilities.MovementUtilities;
import engine.gameManager.*;
import engine.math.Vector3fImmutable;
import engine.net.DispatchMessage;
import engine.net.client.msg.PerformActionMsg;
import engine.net.client.msg.PowerProjectileMsg;
import engine.net.client.msg.UpdateStateMsg;
import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.*;
import engine.powers.ActionsBase;
import engine.powers.PowersBase;
@ -61,8 +55,8 @@ public class MobileFSM { @@ -61,8 +55,8 @@ public class MobileFSM {
Helpee(null, false, true, true, false, true),
HelpeeWimpy(null, true, false, true, false, false),
None(null, false, false, false, false, false),
GuardCaptain(null,false,true,true,true,false),
GuardMinion(GuardCaptain,false,true,true,false,true);
GuardCaptain(null, false, true, true, true, false),
GuardMinion(GuardCaptain, false, true, true, false, true);
private static HashMap<Integer, MobBehaviourType> _behaviourTypes = new HashMap<>();
public MobBehaviourType BehaviourHelperType;
@ -374,8 +368,8 @@ public class MobileFSM { @@ -374,8 +368,8 @@ public class MobileFSM {
if (!MovementUtilities.updateMovementToCharacter(aiAgent, mob))
return;
}
private static void patrol(Mob mob){
if(mob.isMoving() == true){
private static void patrol(Mob mob) {
if (mob.isMoving() == true) {
//early exit for a mob who is already moving to a patrol point
//while mob moving, update lastPatrolTime so that when they stop moving the 10 second timer can begin
mob.stopPatrolTime = System.currentTimeMillis();
@ -383,7 +377,7 @@ public class MobileFSM { @@ -383,7 +377,7 @@ public class MobileFSM {
}
//wait between 10 and 15 seconds after reaching patrol point before moving
int patrolDelay = ThreadLocalRandom.current().nextInt(10000) + 5000;
if(mob.stopPatrolTime + patrolDelay > System.currentTimeMillis()){
if (mob.stopPatrolTime + patrolDelay > System.currentTimeMillis()) {
//early exit while waiting to patrol again
return;
}
@ -397,7 +391,7 @@ public class MobileFSM { @@ -397,7 +391,7 @@ public class MobileFSM {
//guard captains inherit barracks patrol points dynamically
if (mob.contract != null && NPC.ISGuardCaptain(mob.contract.getContractID())) {
Building barracks = mob.building;
if(barracks != null && barracks.patrolPoints != null && barracks.getPatrolPoints().isEmpty() == false) {
if (barracks != null && barracks.patrolPoints != null && barracks.getPatrolPoints().isEmpty() == false) {
mob.patrolPoints = barracks.patrolPoints;
}
}
@ -519,7 +513,7 @@ public class MobileFSM { @@ -519,7 +513,7 @@ public class MobileFSM {
callGotResponse = true;
}
}
if(callGotResponse){
if (callGotResponse) {
//wait 60 seconds to call for help again
mob.nextCallForHelp = System.currentTimeMillis() + 60000;
}
@ -533,7 +527,7 @@ public class MobileFSM { @@ -533,7 +527,7 @@ public class MobileFSM {
// return;
//}
//TEST CODE FOR BEHAVIOUR CHANGING START
if(mob.BehaviourType == null || mob.BehaviourType.ordinal() == MobBehaviourType.None.ordinal()){
if (mob.BehaviourType == null || mob.BehaviourType.ordinal() == MobBehaviourType.None.ordinal()) {
mob.BehaviourType = MobBehaviourType.Simple;
}
//TEST CODE FOR BEHAVIOUR CHANGING END
@ -590,7 +584,7 @@ public class MobileFSM { @@ -590,7 +584,7 @@ public class MobileFSM {
continue;
}
// No aggro for this race type
if(aiAgent.notEnemy.contains(loadedPlayer.getRace().getRaceType()))
if (aiAgent.notEnemy.contains(loadedPlayer.getRace().getRaceType()))
continue;
if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) {
aiAgent.setAggroTargetID(playerID);
@ -602,30 +596,25 @@ public class MobileFSM { @@ -602,30 +596,25 @@ public class MobileFSM {
private static void CheckMobMovement(Mob mob) {
mob.updateLocation();
if (mob.isPet() == false && mob.isSummonedPet() == false && mob.isNecroPet() == false) {
patrol(mob);
} else{
if (mob.getCombatTarget() == null) {
patrol(mob);
} else {
chaseTarget(mob);
}
} else {
//pet logic
if(mob.playerAgroMap.containsKey(mob.getOwner().getObjectUUID()) == false){
if (mob.playerAgroMap.containsKey(mob.getOwner().getObjectUUID()) == false) {
//mob no longer has its owner loaded, translocate pet to owner
MovementManager.translocate(mob,mob.getOwner().getLoc(),null);
MovementManager.translocate(mob, mob.getOwner().getLoc(), null);
}
if (mob.getCombatTarget() == null || mob.combatTarget.isAlive() == false) {
//move back to owner
if (CombatUtilities.inRange2D(mob, mob.getOwner(), 10) == 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());
}
} else {
chaseTarget(mob);
}
}
}
@ -637,7 +626,7 @@ public class MobileFSM { @@ -637,7 +626,7 @@ public class MobileFSM {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) {
aiAgent.despawn();
//update time of death after mob despawns so respawn time happens after mob despawns.
if(aiAgent.deathTime != 0) {
if (aiAgent.deathTime != 0) {
aiAgent.setDeathTime(System.currentTimeMillis());
}
respawn(aiAgent);
@ -650,7 +639,7 @@ public class MobileFSM { @@ -650,7 +639,7 @@ public class MobileFSM {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
aiAgent.despawn();
//update time of death after mob despawns so respawn time happens after mob despawns.
if(aiAgent.deathTime != 0) {
if (aiAgent.deathTime != 0) {
aiAgent.setDeathTime(System.currentTimeMillis());
}
respawn(aiAgent);
@ -660,7 +649,7 @@ public class MobileFSM { @@ -660,7 +649,7 @@ public class MobileFSM {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
aiAgent.despawn();
//update time of death after mob despawns so respawn time happens after mob despawns.
if(aiAgent.deathTime != 0) {
if (aiAgent.deathTime != 0) {
aiAgent.setDeathTime(System.currentTimeMillis());
}
respawn(aiAgent);
@ -735,4 +724,16 @@ public class MobileFSM { @@ -735,4 +724,16 @@ public class MobileFSM {
aiAgent.setCombatTarget(null);
}
}
private static void chaseTarget(Mob mob) {
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());
}
}
}
}
Loading…
Cancel
Save