import { PLAYER_AGGRO_ID } from "../game/aggro"; import { useCombatStore } from "../game/combatStore"; import { useShellStore } from "../app/shellStore"; import { isWow335HunterPetFamily, WOW335_HUNTER_PET_FAMILY_CHOICES, } from "../game/wow335HunterPetFamilySelection"; export function SummonFrames({ now }: { readonly now: number }) { const summons = useCombatStore((state) => state.summons); const selectedFriendlyActorId = useCombatStore((state) => state.selectedFriendlyActorId); const selectedTargetId = useCombatStore((state) => state.selectedTargetId); const selectFriendlyActor = useCombatStore((state) => state.selectFriendlyActor); const commandHunterPet = useCombatStore((state) => state.commandHunterPet); const setHunterPetReactMode = useCombatStore((state) => state.setHunterPetReactMode); const hunterPetFamily = useCombatStore((state) => state.hunterPetFamily); const setHunterPetFamily = useCombatStore((state) => state.setHunterPetFamily); const mobs = useCombatStore((state) => state.mobs); const setHunterPetGrowlAutocast = useCombatStore((state) => state.setHunterPetGrowlAutocast); const hunterPetFamilyLocked = Object.values(mobs).some((mob) => mob.engaged && !mob.dead && !mob.despawned); const hasPlayerHunterPet = summons.some((summon) => summon.hunterPet && summon.ownerActorId === PLAYER_AGGRO_ID); const chooseHunterPetFamily = (value: unknown) => { if (!isWow335HunterPetFamily(value)) return; const previousFamily = hunterPetFamily; if (!setHunterPetFamily(value)) return; if (!useShellStore.getState().saveActiveHunterPetFamily(value)) setHunterPetFamily(previousFamily); }; if (!summons.length) return null; return (
{summons.map((summon) => { const healthPercent = summon.maxHealth > 0 ? Math.max(0, Math.min(100, summon.health / summon.maxHealth * 100)) : 0; const remaining = summon.expiresAt >= Number.MAX_SAFE_INTEGER ? "∞" : `${Math.max(0, Math.ceil((summon.expiresAt - now) / 1_000))}s`; const playerHunterPet = Boolean(summon.hunterPet && summon.ownerActorId === PLAYER_AGGRO_ID); const command = summon.hunterPetCommand ?? "follow"; const reactMode = summon.hunterPetReactMode ?? "defensive"; return (
{playerHunterPet && (
{(["attack", "follow", "stay"] as const).map((petCommand) => ( ))}
)}
); })}
); }