Update Healer Man server

This commit is contained in:
phenom committed 2026-09-27 14:31:15 -04:00
1 parent ab1434a3b8
commit e284f4fc76
60 files changed
+2704 -118

No files matched your search

+16 -1
View File
@@ -327,6 +327,10 @@ function collectAbilitySpellIds() {
for (const chains of Object.values(wow.classes ?? {})) {
for (const chain of chains) for (const rank of chain.ranks ?? []) add("wow335", Number(rank.spellId));
}
// Penance's player spell delegates visible healing and damage bolts to
// child spells that are absent from the learnable progression catalog.
add("wow335", 47750);
add("wow335", 47666);
const coa = JSON.parse(fs.readFileSync(path.join(projectRoot, "src", "game", "generated", "coaAbilityRuntimeCatalog.json"), "utf8"));
for (const abilities of Object.values(coa.abilitiesByClass ?? {})) {
@@ -474,10 +478,21 @@ function buildWowEntries(source, requestedIds, tables) {
}
sounds.push(...soundEntry(soundTable, row.missileSound), ...soundEntry(soundTable, row.animationSound));
}
// Creature 19668 uses display 19110: the FleshBeast model with its black skin.
// The summon is a persistent actor, so retain its model beside the cast kit.
if (source === "wow335" && spellId === 34433) {
addAssets("summon", [{ model: "Creature/FleshBeast/FleshBeast.mdx" }]);
}
for (const [phase, assets] of Object.entries(phases)) {
phases[phase] = [...new Map(assets.map((asset) => [`${asset.model}:${asset.attachment ?? ""}`, asset])).values()];
}
const uniqueSounds = [...new Map(sounds.map((sound) => [sound.sourcePath, sound])).values()];
const uniqueSounds = [...new Map(sounds.map((sound) => [sound.sourcePath, sound])).values()]
.map((sound) => {
if (source !== "wow335" || ![47540, 47666, 47750].includes(spellId)) return sound;
if (spellId === 47540) return { ...sound, phase: "cast-start" };
const phase = /ShadowCast|Pennance_MissileLoop/i.test(sound.sourcePath) ? "tick" : "impact";
return { ...sound, phase };
});
if (!visualIds.length && !uniqueSounds.length) continue;
entries.push({
key: `${source}:${spellId}`,
@@ -116,7 +116,11 @@ export function packageWowOriginalEffects(manifest, options = {}) {
const skin = original.buffer.readUInt32LE(60) ? source.read(skinName) : null;
if (original.buffer.readUInt32LE(60) && !skin) throw new Error(`Missing skin: ${skinName}`);
const mesh = skin ? decodeWotlkM2Mesh(original.buffer, skin.buffer, name) : null;
const packagedTextures = effects.textures.map(packageTexture);
const packagedTextures = effects.textures.map((texture) => packageTexture(
name === "creature/fleshbeast/fleshbeast.m2" && texture.type === 11 && !texture.filename
? { ...texture, filename: "Creature/FleshBeast/FleshBeastBlack.blp" }
: texture,
));
const readyParticleIndices = effects.particles.flatMap((particle, index) => (
packagedTextures[particle.textureIndex]?.url
&& particle.samples.emissionRate.some((sample) => (sample.value?.value ?? sample.value) > 0)
@@ -0,0 +1,7 @@
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Shadowfiend summon preview</title></head>
<body style="margin:0;background:#0b121b;color:#e8eef8;font:14px system-ui">
<div id="root"></div><script type="module" src="/src/dev/ShadowfiendPreview.tsx"></script>
</body>
</html>