Update Healer Man server

This commit is contained in:
phenom committed 2026-09-20 20:15:40 -04:00
1 parent f864b5aea7
commit fdb6739f8d
10 files changed
+236 -16

No files matched your search

+13 -3
View File
@@ -57,6 +57,7 @@ import {
commitPartyAbilityUse,
partyAbilityAmount,
} from "./partyAbilityAi";
import { minimumHostileTargetsForAbility } from "./combatRotation";
import { emitRotationDecision } from "./rotationTelemetry";
import { imminentCooldownMechanic } from "./companionCooldownPolicy";
import { normalizeActorResourcePool } from "./combatActors";
@@ -799,7 +800,7 @@ function partyHostileTargets(
for (const id of ordered) {
if (selected.length >= (targeting.maximumTargets ?? 3)) break;
const position = getMobPosition(id);
if (!position || combat.mobs[id]?.dead) continue;
if (!position || !combat.mobs[id]?.engaged || combat.mobs[id]?.dead) continue;
if (selected.length > 0 && distanceSquared(previous, position) > (targeting.jumpRange ?? 12) ** 2) continue;
if (!combatHasLineOfSight(previous, position)) continue;
selected.push(id);
@@ -812,7 +813,7 @@ function partyHostileTargets(
return Object.values(combat.mobs)
.filter((mob) => {
const position = getMobPosition(mob.id);
return !mob.dead && Boolean(position
return mob.engaged && !mob.dead && Boolean(position
&& distanceSquared(origin, position) <= (targeting.radius ?? ability.radius ?? ability.range.max) ** 2
&& combatHasLineOfSight(origin, position)
&& (!memberSpatial || isPositionInFacingArc(memberSpatial, position, targeting.attackArcRadians ?? Math.PI / 2)));
@@ -826,7 +827,7 @@ function partyHostileTargets(
return Object.values(combat.mobs)
.filter((mob) => {
const position = getMobPosition(mob.id);
return !mob.dead && Boolean(position
return mob.engaged && !mob.dead && Boolean(position
&& distanceSquared(center, position) <= radius * radius
&& combatHasLineOfSight(center, position));
})
@@ -1824,7 +1825,14 @@ export function advanceDungeonPartyCombat(now = Date.now()): void {
const abilityTargetId = (ability.target === "self" && !hostileSelfArea) || ability.target === "friendly"
? member.id
: memberTargetId;
const minimumHostiles = minimumHostileTargetsForAbility(ability.name);
return partyAbilityTargetIsValid(runtimeMember, ability, abilityTargetId)
&& (minimumHostiles <= 1 || partyHostileTargets(
ability,
abilityTargetId,
memberPosition,
member.id,
).length >= minimumHostiles)
&& (ability.name !== "Envenom" || matchingAuraStacks(
currentCombat.auras,
ROGUE_DEADLY_POISON_DOSE_TAG,
@@ -1845,6 +1853,8 @@ export function advanceDungeonPartyCombat(now = Date.now()): void {
// Let maintained effects tick instead of resetting their first tick on every GCD.
&& !currentCombat.effects.some((effect) => effect.sourceActorId === member.id
&& effect.sourceAbilityId === ability.id && effect.targetId === abilityTargetId && effect.remainingTicks > 0)
&& !currentCombat.areaEffects.some((effect) => effect.sourceActorId === member.id
&& effect.sourceAbilityId === ability.id && effect.expiresAt > now)
&& !ability.effects.some((effect) => effect.kind === "apply-aura"
&& currentCombat.auras.some((aura) => aura.sourceId === member.id
&& aura.definition.id === effect.aura.id && aura.targetId === abilityTargetId));