diff --git a/src/main/java/com/projectswg/holocore/resources/support/npc/ai/NpcCombatMode.kt b/src/main/java/com/projectswg/holocore/resources/support/npc/ai/NpcCombatMode.kt index f1ec700b..c10eb29b 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/npc/ai/NpcCombatMode.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/npc/ai/NpcCombatMode.kt @@ -13,6 +13,7 @@ import com.projectswg.holocore.intents.support.objects.swg.MoveObjectIntent import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader import com.projectswg.holocore.resources.support.data.server_info.mongodb.PswgDatabase import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject +import com.projectswg.holocore.resources.support.objects.swg.custom.AIBehavior import com.projectswg.holocore.resources.support.objects.swg.custom.AIObject import com.projectswg.holocore.resources.support.objects.swg.custom.NpcMode import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponObject @@ -39,9 +40,12 @@ class NpcCombatMode(obj: AIObject) : NpcMode(obj) { .min(Comparator.comparingInt { it.health }).orElse(null) override fun onPlayerMoveInAware(player: CreatureObject, distance: Double) { - if (distance > spawner.aggressiveRadius && !ai.defenders.contains(player.objectId)) { - // If out of aggressive range, and not actively fighting - targets.remove(player) + if (distance > spawner.aggressiveRadius) { + // If out of aggressive range, and not actively in combat + if (spawner.behavior == AIBehavior.PATROL && spawner.npcs.none { it.defenders.contains(player.objectId) }) + targets.remove(player) + else if (!ai.defenders.contains(player.objectId)) + targets.remove(player) } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/custom/AIObject.java b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/custom/AIObject.java index ca08f9c3..63702b41 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/custom/AIObject.java +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/custom/AIObject.java @@ -142,7 +142,12 @@ public class AIObject extends CreatureObject { maxAggroDistance = -1; // Ensures the following if-statement will fail and remove the player from the list if (distance <= maxAggroDistance && isLineOfSight(player)) { - StartNpcCombatIntent.broadcast(this, List.of(player)); + if (spawner.getBehavior() == AIBehavior.PATROL) { + for (AIObject npc : spawner.getNpcs()) + StartNpcCombatIntent.broadcast(npc, List.of(player)); + } else { + StartNpcCombatIntent.broadcast(this, List.of(player)); + } } } } diff --git a/src/main/java/com/projectswg/holocore/services/support/npc/ai/AISchedulingService.java b/src/main/java/com/projectswg/holocore/services/support/npc/ai/AISchedulingService.java index 507ed9b6..17610250 100644 --- a/src/main/java/com/projectswg/holocore/services/support/npc/ai/AISchedulingService.java +++ b/src/main/java/com/projectswg/holocore/services/support/npc/ai/AISchedulingService.java @@ -40,8 +40,10 @@ public class AISchedulingService extends Service { @IntentHandler private void handleStartNpcCombatIntent(StartNpcCombatIntent snci) { modes.compute(snci.getObject(), (o, prev) -> { - if (prev instanceof NpcCombatMode) + if (prev instanceof NpcCombatMode) { + ((NpcCombatMode) prev).addTargets(snci.getTargets()); return prev; + } NpcCombatMode mode = new NpcCombatMode(o); mode.addTargets(snci.getTargets()); start(o, mode);