// gk-greyknight — auto-attach loadout (scoped, no clashes) v0.4.7 Hooks.once("ready", () => { const PACK_KEY = "gk-greyknight.gk-items"; // our compendium const PACK_SRC_PREFIX = `Compendium.${PACK_KEY}.`; // prefix in core.sourceId const ITEMS = { ability: "Aegis of Titan (Ability)", nemesis: "Nemesis Force Halberd", storm: "Grey Knight Armour Integrated Storm Bolter", aegisPA: "Aegis Power Armour", aegisTerm: "Terminator Aegis (Grey Knights)" }; const FLAG_SCOPE = "gk-greyknight"; const FLAG_DONE = "autoLoadoutDone"; async function fetchFromCompendium(name) { const pack = game.packs.get(PACK_KEY); if (!pack) return null; const index = await pack.getIndex(); const hit = index.find(e => e.name === name); if (!hit) return null; const doc = await pack.getDocument(hit._id); return doc?.toObject(); } async function ensureOnActor(actor, name, equip=false) { let have = actor.items.getName(name); if (have) { if (typeof have.system?.equipped !== "undefined") await have.update({"system.equipped": !!equip}); return have; } let src = await fetchFromCompendium(name); if (!src) { const world = game.items.getName(name); if (world) src = world.toObject(); } if (!src) return null; if (equip && src.system && typeof src.system.equipped !== "undefined") src.system.equipped = true; const [created] = await actor.createEmbeddedDocuments("Item", [src]); return created; } async function setEquipped(actor, name, on) { const it = actor.items.getName(name); if (it && typeof it.system?.equipped !== "undefined") await it.update({"system.equipped": !!on}); } // Dedupe our hook if (window._gkAutoLoadoutHookId) { Hooks.off("createItem", window._gkAutoLoadoutHookId); window._gkAutoLoadoutHookId = null; } window._gkAutoLoadoutHookId = Hooks.on("createItem", async (item, opts, userId) => { try { // 1) only archetypes if (item?.type !== "archetype") return; // 2) only our GK archetype coming from our pack (prevents clashes with Cubicle7 archetypes) const src = item?.flags?.core?.sourceId || ""; const isFromOurPack = src.startsWith(PACK_SRC_PREFIX); const isOurGKByName = item?.name === "Grey Knight (Archetype)"; if (!isFromOurPack && !isOurGKByName) return; // ignore all others (e.g. Inquisitor, Guardsman, etc.) // 3) only the client that created the item if (game.userId !== userId) return; // 4) once per actor const actor = item.parent; if (!actor) return; if (actor.getFlag(FLAG_SCOPE, FLAG_DONE)) return; await actor.setFlag(FLAG_SCOPE, FLAG_DONE, true); // Dialog const content = `