mirror of
https://bitbucket.org/projectswg/holocore.git
synced 2026-01-16 23:04:20 -05:00
Added group combat for patrols
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user