Update Healer Man server

This commit is contained in:
phenom committed 2026-09-24 18:15:45 -04:00
1 parent 71246e5b75
commit a868401ebc
40 files changed
+1522 -161

No files matched your search

+50 -30
View File
@@ -34,6 +34,7 @@ import {
updateCombatEffectQueue,
originalInstantCastEvent,
originalInstantTerminalEvent,
risingTideArrivalDelayMs,
type ActiveCombatEffect,
} from "./combatEffectRuntime";
import { OriginalCombatEffect } from "./OriginalCombatEffect";
@@ -296,37 +297,56 @@ export function CombatEffects({ active, safeGraphics = false }: CombatEffectsPro
activeRef.current = active;
}, [active]);
useEffect(() => subscribeCombatPresentation((message) => {
if (message.kind === "reset") {
setEffects([]);
resetCombatAudio();
return;
}
const event = message.event;
if (activeRef.current) playCombatAudio(event);
setEffects((current) => {
const withoutCast = event.phase === "release" || event.phase === "cast-cancel"
? current.filter((effect) => !(
effect.event.phase === "cast-start"
&& effect.event.sourceActorId === event.sourceActorId
&& effect.event.abilityId === event.abilityId
))
: current;
const presentationSettings = settingsRef.current;
const quality = qualityRef.current;
if (
event.phase === "cast-cancel"
|| !activeRef.current
|| quality === "off"
|| !presentationSettings.vfxEnabled[event.actorGroup]
) return withoutCast;
const withInstantSourceCast = effectiveCombatVfxMode(presentationSettings) === "original"
&& originalInstantCastEvent(event)
? addOriginalInstantCastEffect(withoutCast, event, quality)
: withoutCast;
return updateCombatEffectQueue(withInstantSourceCast, event, quality);
useEffect(() => {
const pendingArrivals = new Set<ReturnType<typeof setTimeout>>();
const present = (event: CombatPresentationEvent) => {
if (activeRef.current) playCombatAudio(event);
setEffects((current) => {
const withoutCast = event.phase === "release" || event.phase === "cast-cancel"
? current.filter((effect) => !(
effect.event.phase === "cast-start"
&& effect.event.sourceActorId === event.sourceActorId
&& effect.event.abilityId === event.abilityId
))
: current;
const presentationSettings = settingsRef.current;
const quality = qualityRef.current;
if (
event.phase === "cast-cancel"
|| !activeRef.current
|| quality === "off"
|| !presentationSettings.vfxEnabled[event.actorGroup]
) return withoutCast;
const withInstantSourceCast = effectiveCombatVfxMode(presentationSettings) === "original"
&& originalInstantCastEvent(event)
? addOriginalInstantCastEffect(withoutCast, event, quality)
: withoutCast;
return updateCombatEffectQueue(withInstantSourceCast, event, quality);
});
};
const unsubscribe = subscribeCombatPresentation((message) => {
if (message.kind === "reset") {
for (const timer of pendingArrivals) clearTimeout(timer);
pendingArrivals.clear();
setEffects([]);
resetCombatAudio();
return;
}
const event = message.event;
const arrivalDelay = risingTideArrivalDelayMs(event);
if (arrivalDelay > 0) {
const timer = setTimeout(() => {
pendingArrivals.delete(timer);
present(event);
}, arrivalDelay);
pendingArrivals.add(timer);
} else present(event);
});
}), []);
return () => {
unsubscribe();
for (const timer of pendingArrivals) clearTimeout(timer);
};
}, []);
useEffect(() => () => resetCombatAudio(), []);