pet AI implemented

This commit is contained in:
2023-04-15 22:04:55 -05:00
parent ca40d7a71d
commit cfa59d8012
4 changed files with 101 additions and 62 deletions
+34 -2
View File
@@ -56,7 +56,7 @@ public class MobileFSM {
SpellAggroGrouperWimpy(Spell, true, false, true, false, false), SpellAggroGrouperWimpy(Spell, true, false, true, false, false),
//Independent Types //Independent Types
SimpleStandingGuard(null, false, false, false, false, false), SimpleStandingGuard(null, false, false, false, false, false),
Pet1(null, false, false, false, false, false), Pet1(null, false, false, true, false, false),
Simple(null, false, false, true, false, false), Simple(null, false, false, true, false, false),
Helpee(null, false, true, true, false, true), Helpee(null, false, true, true, false, true),
HelpeeWimpy(null, true, false, true, false, false), HelpeeWimpy(null, true, false, true, false, false),
@@ -566,7 +566,11 @@ public class MobileFSM {
} }
} }
public static void run(Mob mob) { 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; return;
} }
if (mob.isAlive() == false) { if (mob.isAlive() == false) {
@@ -593,7 +597,12 @@ public class MobileFSM {
if (!mob.BehaviourType.isWimpy && !mob.isMoving() && mob.combatTarget != null) { if (!mob.BehaviourType.isWimpy && !mob.isMoving() && mob.combatTarget != null) {
CheckForAttack(mob); CheckForAttack(mob);
} }
} else {
CheckMobMovement(mob);
CheckForAttack(mob);
} }
}
private static void CheckForAggro(Mob aiAgent) { private static void CheckForAggro(Mob aiAgent) {
//looks for and sets mobs combatTarget //looks for and sets mobs combatTarget
if (!aiAgent.isAlive()) { if (!aiAgent.isAlive()) {
@@ -629,6 +638,7 @@ public class MobileFSM {
} }
private static void CheckMobMovement(Mob mob) { private static void CheckMobMovement(Mob mob) {
mob.updateLocation(); mob.updateLocation();
if (mob.isPet() == false && mob.isSummonedPet() == false && mob.isNecroPet() == false) {
if (mob.getCombatTarget() == null) { if (mob.getCombatTarget() == null) {
//patrol //patrol
int patrolRandom = ThreadLocalRandom.current().nextInt(1000); int patrolRandom = ThreadLocalRandom.current().nextInt(1000);
@@ -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) { private static void CheckForRespawn(Mob aiAgent) {
//handles checking for respawn of dead mobs even when no players have mob loaded //handles checking for respawn of dead mobs even when no players have mob loaded
+4
View File
@@ -79,6 +79,7 @@ public class aiInfoCmd extends AbstractDevCmd {
Mob mob = (Mob) target; Mob mob = (Mob) target;
output = "Mob AI Information:" + newline; output = "Mob AI Information:" + newline;
output += mob.getName() + newline; output += mob.getName() + newline;
if(mob.BehaviourType != null) {
output += "BehaviourType: " + mob.BehaviourType.toString() + newline; output += "BehaviourType: " + mob.BehaviourType.toString() + newline;
output += "Behaviour Helper Type: " + mob.BehaviourType.BehaviourHelperType.toString() + newline; output += "Behaviour Helper Type: " + mob.BehaviourType.BehaviourHelperType.toString() + newline;
output += "Wimpy: " + mob.BehaviourType.isWimpy + newline; output += "Wimpy: " + mob.BehaviourType.isWimpy + newline;
@@ -86,6 +87,9 @@ public class aiInfoCmd extends AbstractDevCmd {
output += "Can Roam: " + mob.BehaviourType.canRoam + newline; output += "Can Roam: " + mob.BehaviourType.canRoam + newline;
output += "Calls For Help: " + mob.BehaviourType.callsForHelp + newline; output += "Calls For Help: " + mob.BehaviourType.callsForHelp + newline;
output += "Responds To Call For Help: " + mob.BehaviourType.respondsToCallForHelp + newline; output += "Responds To Call For Help: " + mob.BehaviourType.respondsToCallForHelp + newline;
} else{
output += "BehaviourType: NULL" + newline;
}
output += "Player Aggro Map Size: " + mob.playerAgroMap.size() + newline; output += "Player Aggro Map Size: " + mob.playerAgroMap.size() + newline;
if(mob.playerAgroMap.size() > 0){ if(mob.playerAgroMap.size() > 0){
output += "Players Loaded:" + newline; output += "Players Loaded:" + newline;
@@ -2022,7 +2022,6 @@ public class ClientMessagePump implements NetMsgHandler {
return; return;
CombatManager.setAttackTarget(msg, conn); CombatManager.setAttackTarget(msg, conn);
if (pet.getCombatTarget() == null) if (pet.getCombatTarget() == null)
return; return;
} }
+5 -1
View File
@@ -181,6 +181,7 @@ public class Mob extends AbstractIntelligenceAgent {
this.parentZone = parent; this.parentZone = parent;
this.parentZoneID = (parent != null) ? parent.getObjectUUID() : 0; this.parentZoneID = (parent != null) ? parent.getObjectUUID() : 0;
this.ownerUID = owner.getObjectUUID(); this.ownerUID = owner.getObjectUUID();
this.BehaviourType = MobileFSM.MobBehaviourType.Pet1;
initializeMob(true, false, false); initializeMob(true, false, false);
clearStatic(); clearStatic();
} }
@@ -1955,10 +1956,13 @@ public class Mob extends AbstractIntelligenceAgent {
} }
// Combine mobbase and mob aggro arrays into one bitvector // Combine mobbase and mob aggro arrays into one bitvector
try {
this.notEnemy.addAll(this.getMobBase().notEnemy); this.notEnemy.addAll(this.getMobBase().notEnemy);
this.enemy.addAll(this.getMobBase().enemy); this.enemy.addAll(this.getMobBase().enemy);
}
catch(Exception ex){
}
try { try {
NPCManager.applyRuneSetEffects(this); NPCManager.applyRuneSetEffects(this);
recalculateStats(); recalculateStats();