From dc829069831b622ed54ef118e0454ea3852595b1 Mon Sep 17 00:00:00 2001 From: Michal Tuszowski Date: Thu, 21 Aug 2025 19:30:33 +0000 Subject: [PATCH] Import GK_Foundry_Macros_Fix_v5.zip do wg-greyknights (2025-08-21T19:30:33Z) --- .../macro-gk-auto-loadout-on-archetype.js | 20 ----- .../macro-gk-auto-loadout-on-archetype.js | 15 ++++ .../{macro => macros}/macro-gk-glow-toggle.js | 0 .../macro-gk-import-world-items-FIXED.js | 80 +++++++++++++++++++ .../macro-gk-loadout-manager.js | 0 5 files changed, 95 insertions(+), 20 deletions(-) delete mode 100644 wg-greyknights/macro/macro-gk-auto-loadout-on-archetype.js create mode 100644 wg-greyknights/macros/macro-gk-auto-loadout-on-archetype.js rename wg-greyknights/{macro => macros}/macro-gk-glow-toggle.js (100%) create mode 100644 wg-greyknights/macros/macro-gk-import-world-items-FIXED.js rename wg-greyknights/{macro => macros}/macro-gk-loadout-manager.js (100%) diff --git a/wg-greyknights/macro/macro-gk-auto-loadout-on-archetype.js b/wg-greyknights/macro/macro-gk-auto-loadout-on-archetype.js deleted file mode 100644 index d75bf8c..0000000 --- a/wg-greyknights/macro/macro-gk-auto-loadout-on-archetype.js +++ /dev/null @@ -1,20 +0,0 @@ -// GK – Auto Loadout on Archetype Assignment -// Rejestruje Hook createItem: jeśli do aktora dodano 'Grey Knight (Archetype)', uruchomi 'GK – Loadout Manager'. -(() => { - if (window._gkAutoLoadoutHook) { ui.notifications.info("GK Auto-Loadout: już aktywne."); return; } - window._gkAutoLoadoutHook = Hooks.on("createItem", async (item, opts, userId) => { - try { - if (item?.type !== "archetype") return; - if (item?.name !== "Grey Knight (Archetype)") return; - const actor = item.parent; - if (!actor || game.userId !== userId) return; - const m = game.macros.getName("GK – Loadout Manager") || game.macros.getName("GK-Loadout-Manager") || null; - if (m) { - await m.execute(); - } else { - ui.notifications.warn("Brak makra 'GK – Loadout Manager'. Utwórz je i uruchom ponownie."); - } - } catch (e) { console.error("GK Auto-Loadout error", e); } - }); - ui.notifications.info("GK Auto-Loadout: hook zarejestrowany (createItem)."); -})(); \ No newline at end of file diff --git a/wg-greyknights/macros/macro-gk-auto-loadout-on-archetype.js b/wg-greyknights/macros/macro-gk-auto-loadout-on-archetype.js new file mode 100644 index 0000000..4e3eff4 --- /dev/null +++ b/wg-greyknights/macros/macro-gk-auto-loadout-on-archetype.js @@ -0,0 +1,15 @@ +// GK – Auto Loadout on Archetype Assignment (world esmodule friendly) +(() => { + if (window._gkAutoLoadoutHook) { return; } + window._gkAutoLoadoutHook = Hooks.on("createItem", async (item, opts, userId) => { + try { + if (item?.type !== "archetype") return; + if (item?.name !== "Grey Knight (Archetype)") return; + const actor = item.parent; + if (!actor || game.userId !== userId) return; + const macro = game.macros.getName("GK – Loadout Manager") || game.macros.getName("GK-Loadout-Manager"); + if (macro) await macro.execute(); + else ui.notifications.warn("Brak makra 'GK – Loadout Manager'. Dodaj je do świata (macros/)."); + } catch (e) { console.error("GK Auto-Loadout error", e); } + }); +})(); \ No newline at end of file diff --git a/wg-greyknights/macro/macro-gk-glow-toggle.js b/wg-greyknights/macros/macro-gk-glow-toggle.js similarity index 100% rename from wg-greyknights/macro/macro-gk-glow-toggle.js rename to wg-greyknights/macros/macro-gk-glow-toggle.js diff --git a/wg-greyknights/macros/macro-gk-import-world-items-FIXED.js b/wg-greyknights/macros/macro-gk-import-world-items-FIXED.js new file mode 100644 index 0000000..ffba9df --- /dev/null +++ b/wg-greyknights/macros/macro-gk-import-world-items-FIXED.js @@ -0,0 +1,80 @@ +// GK – Import World Items (from JSONs into Items Directory) — FIXED path handling +(async () => { + const FILES = [ + "fvtt-Item-archetype-grey-knight_v5.json", + "fvtt-Item-ability-aegis-of-titan_v5.json", + "fvtt-Item-nemesis-force-halberd_v4.json", + "fvtt-Item-gk-armour-integrated-storm-bolter_v2.json", + "fvtt-Item-aegis-power-armour_v2.json", + "fvtt-Item-terminator-aegis-gk_v4.json" + ]; + + const worldId = game.world?.id || game.world?.name || game.data?.world?.id || game.data?.world?.name; + const defaultDir = `worlds/${worldId}/foundry`; + + const pick = await new Promise(resolve => { + const content = ` +

Folder z JSON-ami (domyślnie: ${defaultDir})

+
+ + +
+

`; + const dlg = new Dialog({ + title: "GK – Import World Items (Fixed)", + content, + buttons: { + go: { label: "Importuj", icon: '', callback: html => resolve({ok:true, html}) }, + cancel: { label: "Anuluj", callback: () => resolve({ok:false}) } + }, + render: html => { + html.find("button.browse").on("click", () => { + const fp = new FilePicker({ + type: "any", + callback: path => { + const folder = (path || "").replace(/[/\\][^/\\]*$/, ""); + html.find('input[name="path"]').val(folder || defaultDir); + } + }); + fp.browse("data", defaultDir); + }); + }, + default: "go" + }); + dlg.render(true); + }); + if (!pick?.ok) return; + const dir = pick.html.find('input[name="path"]').val()?.trim() || defaultDir; + const overwrite = pick.html.find('input[name="overwrite"]')[0]?.checked; + + const ensureFolder = async (name, color="#4b6eaf") => { + let f = game.folders.find(x => x.type === "Item" && x.name === name); + if (!f) f = await Folder.create({name, type:"Item", color}); + return f; + }; + const worldFolder = await ensureFolder("Grey Knight Pack", "#4b6eaf"); + + const fetchJSON = async (path) => { + const res = await fetch(`/${path}`); + if (!res.ok) throw new Error(`Nie mogę pobrać: ${path} (HTTP ${res.status})`); + return await res.json(); + }; + + let created = 0, updated = 0, skipped = 0; + for (const fn of FILES) { + try { + const full = `${dir}/${fn}`; + const data = await fetchJSON(full); + if (data._id) delete data._id; + data.folder = worldFolder.id; + const existing = game.items.getName(data.name); + if (existing) { + if (overwrite) { await existing.update(data); updated++; } else { skipped++; } + } else { await Item.create(data); created++; } + } catch (e) { + console.error(`Błąd importu ${fn}`, e); + ui.notifications.warn(`Błąd importu: ${fn} (konsola).`); + } + } + ui.notifications.info(`GK Import: utworzono ${created}, zaktualizowano ${updated}, pominięto ${skipped}.`); +})(); \ No newline at end of file diff --git a/wg-greyknights/macro/macro-gk-loadout-manager.js b/wg-greyknights/macros/macro-gk-loadout-manager.js similarity index 100% rename from wg-greyknights/macro/macro-gk-loadout-manager.js rename to wg-greyknights/macros/macro-gk-loadout-manager.js