modwright 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +35 -0
- package/README.md +212 -0
- package/assets/claude/agents/mw-explore.md +46 -0
- package/assets/claude/agents/mw-fixture.md +33 -0
- package/assets/claude/agents/mw-rule-author.md +51 -0
- package/assets/claude/agents/mw-scaffold-author.md +48 -0
- package/assets/claude/skills/mw-author.md +59 -0
- package/assets/claude/skills/mw-new-item.md +51 -0
- package/assets/claude/skills/mw-new-spell.md +50 -0
- package/assets/claude/skills/mw-scaffold.md +59 -0
- package/assets/claude/skills/mw-ship.md +57 -0
- package/assets/claude/skills/mw-validate.md +51 -0
- package/assets/claude/skills/mw-verify.md +59 -0
- package/assets/nivalisnights/extract_resources.py +177 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
- package/bridges/bg3-se/README.md +99 -0
- package/bridges/bg3-se/bridge.json +68 -0
- package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
- package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
- package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
- package/bridges/cp2077-cet/README.md +165 -0
- package/bridges/cp2077-cet/bridge.json +53 -0
- package/dist/core/bridge/arm.js +175 -0
- package/dist/core/bridge/cet-console.js +26 -0
- package/dist/core/bridge/cet-log.js +362 -0
- package/dist/core/bridge/index.js +11 -0
- package/dist/core/bridge/locate.js +35 -0
- package/dist/core/bridge/paths.js +34 -0
- package/dist/core/bridge/pending.js +89 -0
- package/dist/core/bridge/poll.js +155 -0
- package/dist/core/bridge/stage.js +100 -0
- package/dist/core/bridge/status.js +97 -0
- package/dist/core/bridge/types.js +145 -0
- package/dist/core/bridge/validate.js +107 -0
- package/dist/core/build/index.js +6 -0
- package/dist/core/build/manifest.js +47 -0
- package/dist/core/build/paths.js +32 -0
- package/dist/core/build/run.js +342 -0
- package/dist/core/build/stage.js +265 -0
- package/dist/core/build/steps/bg3.js +129 -0
- package/dist/core/build/steps/core.js +195 -0
- package/dist/core/build/steps/cyberpunk.js +95 -0
- package/dist/core/build/steps/listing.js +35 -0
- package/dist/core/build/types.js +13 -0
- package/dist/core/build/zip.js +148 -0
- package/dist/core/compat/check.js +113 -0
- package/dist/core/compat/pe.js +220 -0
- package/dist/core/compat/types.js +1 -0
- package/dist/core/compat/version.js +70 -0
- package/dist/core/deploy/guards.js +292 -0
- package/dist/core/deploy/index.js +5 -0
- package/dist/core/deploy/plan.js +696 -0
- package/dist/core/deploy/reload-apply.js +361 -0
- package/dist/core/deploy/reload.js +358 -0
- package/dist/core/deploy/sources.js +169 -0
- package/dist/core/deploy/types.js +1 -0
- package/dist/core/epic.js +54 -0
- package/dist/core/fsutil.js +191 -0
- package/dist/core/home.js +70 -0
- package/dist/core/knowledge/facts.js +229 -0
- package/dist/core/knowledge/index.js +4 -0
- package/dist/core/knowledge/search.js +112 -0
- package/dist/core/knowledge/store.js +123 -0
- package/dist/core/knowledge/types.js +1 -0
- package/dist/core/ledger/check.js +42 -0
- package/dist/core/ledger/hooks.js +80 -0
- package/dist/core/ledger/index.js +7 -0
- package/dist/core/ledger/query.js +17 -0
- package/dist/core/ledger/record.js +84 -0
- package/dist/core/ledger/status.js +53 -0
- package/dist/core/ledger/store.js +98 -0
- package/dist/core/ledger/types.js +108 -0
- package/dist/core/logs/index.js +4 -0
- package/dist/core/logs/registry.js +50 -0
- package/dist/core/logs/scan.js +195 -0
- package/dist/core/logs/triage.js +160 -0
- package/dist/core/logs/types.js +1 -0
- package/dist/core/lsx.js +10 -0
- package/dist/core/lz4.js +66 -0
- package/dist/core/mods.js +229 -0
- package/dist/core/process.js +49 -0
- package/dist/core/project/build-steps.js +83 -0
- package/dist/core/project/describe.js +74 -0
- package/dist/core/project/index.js +5 -0
- package/dist/core/project/load.js +146 -0
- package/dist/core/project/schema.js +264 -0
- package/dist/core/project/types.js +3 -0
- package/dist/core/prompts.js +72 -0
- package/dist/core/registry.js +35 -0
- package/dist/core/safety/backup.js +206 -0
- package/dist/core/safety/execute.js +188 -0
- package/dist/core/safety/index.js +5 -0
- package/dist/core/safety/plan.js +122 -0
- package/dist/core/safety/restore.js +172 -0
- package/dist/core/safety/types.js +1 -0
- package/dist/core/scaffold/bootstrap.js +7 -0
- package/dist/core/scaffold/catalog.js +28 -0
- package/dist/core/scaffold/claude-assets.js +271 -0
- package/dist/core/scaffold/collisions.js +64 -0
- package/dist/core/scaffold/emit.js +356 -0
- package/dist/core/scaffold/engine.js +680 -0
- package/dist/core/scaffold/ids.js +78 -0
- package/dist/core/scaffold/index.js +10 -0
- package/dist/core/scaffold/jsonpath.js +121 -0
- package/dist/core/scaffold/load.js +81 -0
- package/dist/core/scaffold/render.js +85 -0
- package/dist/core/scaffold/sequence.js +396 -0
- package/dist/core/scaffold/types.js +309 -0
- package/dist/core/steam.js +63 -0
- package/dist/core/surfaceutil.js +36 -0
- package/dist/core/testplan/check.js +67 -0
- package/dist/core/testplan/index.js +5 -0
- package/dist/core/testplan/load.js +100 -0
- package/dist/core/testplan/registry.js +317 -0
- package/dist/core/testplan/run.js +389 -0
- package/dist/core/testplan/types.js +82 -0
- package/dist/core/text/converters/bg3.js +50 -0
- package/dist/core/text/converters/cyberpunk.js +36 -0
- package/dist/core/text/converters/index.js +261 -0
- package/dist/core/text/diff/cr2w.js +180 -0
- package/dist/core/text/diff/index.js +16 -0
- package/dist/core/text/diff/loca.js +43 -0
- package/dist/core/text/diff/lsx.js +126 -0
- package/dist/core/text/handles.js +86 -0
- package/dist/core/text/index.js +6 -0
- package/dist/core/text/json.js +46 -0
- package/dist/core/text/templates/cache.js +71 -0
- package/dist/core/text/templates/index.js +3 -0
- package/dist/core/text/templates/library.js +245 -0
- package/dist/core/text/templates/types.js +51 -0
- package/dist/core/text/toolchain.js +16 -0
- package/dist/core/text/types.js +1 -0
- package/dist/core/text/validate.js +149 -0
- package/dist/core/text/xml.js +58 -0
- package/dist/core/toolchain/datafetch.js +151 -0
- package/dist/core/toolchain/env.js +63 -0
- package/dist/core/toolchain/features.js +170 -0
- package/dist/core/toolchain/index.js +8 -0
- package/dist/core/toolchain/install.js +191 -0
- package/dist/core/toolchain/locate.js +275 -0
- package/dist/core/toolchain/remember.js +84 -0
- package/dist/core/toolchain/run.js +318 -0
- package/dist/core/toolchain/specs.js +351 -0
- package/dist/core/toolchain/types.js +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/userconfig.js +66 -0
- package/dist/core/validate/context.js +139 -0
- package/dist/core/validate/index.js +5 -0
- package/dist/core/validate/registry.js +58 -0
- package/dist/core/validate/run.js +131 -0
- package/dist/core/validate/suppressions.js +91 -0
- package/dist/core/validate/types.js +2 -0
- package/dist/core/yamledit.js +51 -0
- package/dist/index.js +389 -0
- package/dist/server.js +1914 -0
- package/dist/surfaces/baldursgate3/compat.js +164 -0
- package/dist/surfaces/baldursgate3/identity.js +110 -0
- package/dist/surfaces/baldursgate3/index/build.js +331 -0
- package/dist/surfaces/baldursgate3/index/index.js +17 -0
- package/dist/surfaces/baldursgate3/index/info.js +40 -0
- package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
- package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
- package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
- package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
- package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
- package/dist/surfaces/baldursgate3/index/queries.js +327 -0
- package/dist/surfaces/baldursgate3/index/schema.js +62 -0
- package/dist/surfaces/baldursgate3/index.js +3 -0
- package/dist/surfaces/baldursgate3/logs.js +278 -0
- package/dist/surfaces/baldursgate3/modsettings.js +115 -0
- package/dist/surfaces/baldursgate3/pak.js +153 -0
- package/dist/surfaces/baldursgate3/settings.js +49 -0
- package/dist/surfaces/baldursgate3/surface.js +232 -0
- package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
- package/dist/surfaces/baldursgate3/validators/files.js +476 -0
- package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
- package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
- package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
- package/dist/surfaces/baldursgate3/validators/story.js +790 -0
- package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/compat.js +223 -0
- package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
- package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
- package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
- package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
- package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
- package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
- package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
- package/dist/surfaces/cyberpunk2077/index.js +3 -0
- package/dist/surfaces/cyberpunk2077/logs.js +742 -0
- package/dist/surfaces/cyberpunk2077/paths.js +12 -0
- package/dist/surfaces/cyberpunk2077/surface.js +218 -0
- package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
- package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
- package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
- package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
- package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
- package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
- package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
- package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
- package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
- package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
- package/dist/surfaces/eldenring/binders.js +111 -0
- package/dist/surfaces/eldenring/compat.js +166 -0
- package/dist/surfaces/eldenring/dcx.js +49 -0
- package/dist/surfaces/eldenring/index.js +13 -0
- package/dist/surfaces/eldenring/loaders.js +132 -0
- package/dist/surfaces/eldenring/logs.js +67 -0
- package/dist/surfaces/eldenring/paramdef.js +256 -0
- package/dist/surfaces/eldenring/params.js +129 -0
- package/dist/surfaces/eldenring/surface.js +121 -0
- package/dist/surfaces/eldenring/tools.js +52 -0
- package/dist/surfaces/eldenring/validators/binders.js +193 -0
- package/dist/surfaces/eldenring/validators/packages.js +159 -0
- package/dist/surfaces/eldenring/validators/params.js +334 -0
- package/dist/surfaces/eldenring/validators/profiles.js +287 -0
- package/dist/surfaces/index.js +34 -0
- package/dist/surfaces/nivalisnights/compat.js +229 -0
- package/dist/surfaces/nivalisnights/index/build.js +310 -0
- package/dist/surfaces/nivalisnights/index/index.js +5 -0
- package/dist/surfaces/nivalisnights/index/queries.js +231 -0
- package/dist/surfaces/nivalisnights/index.js +4 -0
- package/dist/surfaces/nivalisnights/logs.js +473 -0
- package/dist/surfaces/nivalisnights/surface.js +195 -0
- package/dist/surfaces/skyrimse/archives.js +229 -0
- package/dist/surfaces/skyrimse/compat.js +163 -0
- package/dist/surfaces/skyrimse/index.js +12 -0
- package/dist/surfaces/skyrimse/loadorder.js +174 -0
- package/dist/surfaces/skyrimse/logs.js +241 -0
- package/dist/surfaces/skyrimse/plugins.js +149 -0
- package/dist/surfaces/skyrimse/records.js +94 -0
- package/dist/surfaces/skyrimse/surface.js +240 -0
- package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
- package/dist/surfaces/skyrimse/validators/archives.js +110 -0
- package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
- package/dist/surfaces/skyrimse/validators/records.js +117 -0
- package/dist/surfaces/stardewvalley/compat.js +190 -0
- package/dist/surfaces/stardewvalley/config.js +42 -0
- package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
- package/dist/surfaces/stardewvalley/index/index.js +229 -0
- package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
- package/dist/surfaces/stardewvalley/index.js +12 -0
- package/dist/surfaces/stardewvalley/logs.js +307 -0
- package/dist/surfaces/stardewvalley/mods.js +182 -0
- package/dist/surfaces/stardewvalley/surface.js +244 -0
- package/dist/surfaces/stardewvalley/validators/content.js +321 -0
- package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
- package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
- package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
- package/dist/surfaces/subnautica2/compat.js +138 -0
- package/dist/surfaces/subnautica2/index.js +5 -0
- package/dist/surfaces/subnautica2/logs.js +129 -0
- package/dist/surfaces/subnautica2/paks.js +173 -0
- package/dist/surfaces/subnautica2/surface.js +151 -0
- package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
- package/dist/surfaces/valheim/compat.js +171 -0
- package/dist/surfaces/valheim/index/index.js +301 -0
- package/dist/surfaces/valheim/index/tables.js +103 -0
- package/dist/surfaces/valheim/index.js +11 -0
- package/dist/surfaces/valheim/logs.js +197 -0
- package/dist/surfaces/valheim/packaging.js +131 -0
- package/dist/surfaces/valheim/plugins.js +270 -0
- package/dist/surfaces/valheim/references.js +121 -0
- package/dist/surfaces/valheim/surface.js +223 -0
- package/dist/surfaces/valheim/validators/packaging.js +218 -0
- package/dist/surfaces/valheim/validators/plugins.js +287 -0
- package/dist/surfaces/valheim/validators/references.js +169 -0
- package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
- package/knowledge/baldursgate3/audio.voice.yaml +182 -0
- package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
- package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
- package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
- package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
- package/knowledge/baldursgate3/crash.causes.yaml +90 -0
- package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
- package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
- package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
- package/knowledge/baldursgate3/dialogue.yaml +122 -0
- package/knowledge/baldursgate3/feats.classes.yaml +164 -0
- package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
- package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
- package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
- package/knowledge/baldursgate3/journal.quests.yaml +214 -0
- package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
- package/knowledge/baldursgate3/localization.handles.yaml +92 -0
- package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
- package/knowledge/baldursgate3/origins.companions.yaml +144 -0
- package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
- package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
- package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
- package/knowledge/baldursgate3/process.launch.yaml +34 -0
- package/knowledge/baldursgate3/progressions.yaml +92 -0
- package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
- package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
- package/knowledge/baldursgate3/races.progression.yaml +228 -0
- package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
- package/knowledge/baldursgate3/scriptextender.yaml +252 -0
- package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
- package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
- package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
- package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
- package/knowledge/baldursgate3/stats.spells.yaml +293 -0
- package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
- package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
- package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
- package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
- package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
- package/knowledge/baldursgate3/ui.icons.yaml +412 -0
- package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
- package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
- package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
- package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
- package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
- package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
- package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
- package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
- package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
- package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
- package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
- package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
- package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
- package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
- package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
- package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
- package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
- package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
- package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
- package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
- package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
- package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
- package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
- package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
- package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
- package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
- package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
- package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
- package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
- package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
- package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
- package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
- package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
- package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
- package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
- package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
- package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
- package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
- package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
- package/knowledge/cyberpunk2077/player.control.yaml +918 -0
- package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
- package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
- package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
- package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
- package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
- package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
- package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
- package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
- package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
- package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
- package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
- package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
- package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
- package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
- package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
- package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
- package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
- package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
- package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
- package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
- package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
- package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
- package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
- package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
- package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
- package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
- package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
- package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
- package/knowledge/eldenring/formats.binders.yaml +237 -0
- package/knowledge/eldenring/launcher.me3.yaml +230 -0
- package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
- package/knowledge/eldenring/params.paramdef.yaml +149 -0
- package/knowledge/eldenring/params.regulation.yaml +142 -0
- package/knowledge/eldenring/saves.online.yaml +118 -0
- package/knowledge/eldenring/toolchain.cli.yaml +256 -0
- package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
- package/knowledge/skyrimse/archives.bsa.yaml +212 -0
- package/knowledge/skyrimse/install.detection.yaml +41 -0
- package/knowledge/skyrimse/loadorder.files.yaml +242 -0
- package/knowledge/skyrimse/plugins.esl.yaml +189 -0
- package/knowledge/skyrimse/plugins.format.yaml +224 -0
- package/knowledge/skyrimse/skse.runtime.yaml +283 -0
- package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
- package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
- package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
- package/knowledge/stardewvalley/game.versions.yaml +202 -0
- package/knowledge/stardewvalley/install.layout.yaml +277 -0
- package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
- package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
- package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
- package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
- package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
- package/knowledge/subnautica2/game.build.yaml +331 -0
- package/knowledge/subnautica2/modding.state.yaml +210 -0
- package/knowledge/subnautica2/ue5.containers.yaml +72 -0
- package/knowledge/subnautica2/ue5.paks.yaml +203 -0
- package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
- package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
- package/knowledge/valheim/bepinex.loader.yaml +247 -0
- package/knowledge/valheim/bepinex.plugins.yaml +251 -0
- package/knowledge/valheim/game.versions.yaml +321 -0
- package/knowledge/valheim/install.layout.yaml +216 -0
- package/knowledge/valheim/jotunn.library.yaml +334 -0
- package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
- package/knowledge/valheim/toolchain.build.yaml +111 -0
- package/package.json +29 -0
- package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
- package/scaffolds/baldursgate3/new-item.yaml +264 -0
- package/scaffolds/baldursgate3/new-mod.yaml +174 -0
- package/scaffolds/baldursgate3/new-passive.yaml +100 -0
- package/scaffolds/baldursgate3/new-project.yaml +118 -0
- package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
- package/scaffolds/baldursgate3/new-spell.yaml +102 -0
- package/scaffolds/baldursgate3/new-status.yaml +119 -0
- package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
- package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
- package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
- package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
- package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
- package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
- package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
- package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
- package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
- package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
- package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
- package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
- package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
- package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
- package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
- package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
- package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
- package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
- package/scaffolds/stardewvalley/new-project.yaml +184 -0
- package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
- package/scripts/mw-tool.mjs +184 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: scriptextender.console
|
|
3
|
+
title: Script Extender in-game console usage
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.scriptextender.console.input-line-needs-enter-press
|
|
6
|
+
claim: The SE console window does not accept typed input immediately — pressing Enter once activates
|
|
7
|
+
the input line, shown by the prompt changing to "S >>"; if console output has scrolled past
|
|
8
|
+
the input line, the guide's fix is to "repeat this a few times until you can see the S >>"
|
|
9
|
+
rather than assuming the console is broken.
|
|
10
|
+
status: community
|
|
11
|
+
source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:54-60, §2.2 Activate the input ("To
|
|
12
|
+
be able to input commands into the console press enter once."; the next line covers repeating
|
|
13
|
+
it until the `S >>` prompt is visible)
|
|
14
|
+
tags:
|
|
15
|
+
- scriptextender
|
|
16
|
+
- console
|
|
17
|
+
- input
|
|
18
|
+
- gotcha
|
|
19
|
+
- id: bg3.scriptextender.console.p-and-d-print-functions
|
|
20
|
+
claim: "Two bare (non-Osi-prefixed) global functions are available at the SE console for printing
|
|
21
|
+
values: _P (plain print — the guide's worked example is _P(\"Hello World\")) and _D (a richer
|
|
22
|
+
dump/inspect print, used as _D(Osi.GetHostCharacter()) and
|
|
23
|
+
_D(Ext.Entity.Get(...).CharacterCreationAppearance))."
|
|
24
|
+
status: community
|
|
25
|
+
source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:67-72, §2.3.1 ("_P("Hello World")")
|
|
26
|
+
and :525-542, §6.1.1 ("_D(Osi.GetHostCharacter())")
|
|
27
|
+
tags:
|
|
28
|
+
- scriptextender
|
|
29
|
+
- console
|
|
30
|
+
- print
|
|
31
|
+
- debug
|
|
32
|
+
- globals
|
|
33
|
+
detail: "Checked against the source (2026-09-08): the third citation, §7's
|
|
34
|
+
`_D(Ext.Entity.Get(GetHostCharacter()).CharacterCreationAppearance)`, has been dropped from
|
|
35
|
+
`source` — §7 is an unwritten \"Work in Progress\" stub and that string appears only inside
|
|
36
|
+
its \"// TODO\" list. _P and _D themselves are properly worked examples in §2.3.1 and §6.1.1;
|
|
37
|
+
the Ext.Entity example is not documented, only listed as something to document."
|
|
38
|
+
- id: bg3.scriptextender.console.osi-functions-callable-bare-or-prefixed
|
|
39
|
+
claim: At the SE console, Osiris calls are callable both through the Osi table
|
|
40
|
+
(Osi.GetHostCharacter(), Osi.AddGold(...)) and as bare global functions with the same name and
|
|
41
|
+
no Osi. prefix (the guide's TemplateAddTo("d32a68ff-...", GetHostCharacter(), 10) example
|
|
42
|
+
calls GetHostCharacter() bare inside an argument list to the same effect as
|
|
43
|
+
Osi.GetHostCharacter()).
|
|
44
|
+
status: community
|
|
45
|
+
source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:76-79, §2.3.2 (bare
|
|
46
|
+
TemplateAddTo/GetHostCharacter call);
|
|
47
|
+
bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:32-33
|
|
48
|
+
("_P(Osi.GetRegion(GetHostCharacter()))" — GetHostCharacter used bare inside an Osi.-prefixed
|
|
49
|
+
call)
|
|
50
|
+
tags:
|
|
51
|
+
- scriptextender
|
|
52
|
+
- console
|
|
53
|
+
- osi
|
|
54
|
+
- globals
|
|
55
|
+
- calling-convention
|
|
56
|
+
- id: bg3.scriptextender.console.reset-command-hotreloads-scripts
|
|
57
|
+
claim: "Typing \"reset\" at the SE console and pressing Enter \"will reset the console and all
|
|
58
|
+
loaded scripts, allowing you to see instant changes of your code\" — the guide's workflow
|
|
59
|
+
after every code edit is: save the file, re-open/re-activate the console, type reset."
|
|
60
|
+
status: community
|
|
61
|
+
source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:420-450, §4.5 Testing the symlink
|
|
62
|
+
("This will reset the console and all loaded scripts, allowing you to see instant changes of
|
|
63
|
+
your code.")
|
|
64
|
+
tags:
|
|
65
|
+
- scriptextender
|
|
66
|
+
- console
|
|
67
|
+
- reset
|
|
68
|
+
- hot-reload
|
|
69
|
+
detail: "The same section carries a precondition the drafted fact omitted: reset only picks up
|
|
70
|
+
edited scripts if the mod folder is symlinked into (or physically inside) the game's Data
|
|
71
|
+
folder — otherwise the mod has to be repacked to see changes. It also notes some changes only
|
|
72
|
+
apply on a session reload (F8)."
|
|
73
|
+
related:
|
|
74
|
+
- id: bg3.se.console-reset-degrades-osiris
|
|
75
|
+
detail: Confirms reset's intended use (hot-reloading Lua) from the community side, matching the
|
|
76
|
+
existing verified caution that the same command degrades Osiris mid-session and should not
|
|
77
|
+
be used for anything Osi-driven.
|
|
78
|
+
- id: bg3.scriptextender.console.bare-expression-prints-nothing
|
|
79
|
+
claim: 'The Script Extender debug console does not echo the value of a bare expression: typing
|
|
80
|
+
Ext.Stats.Get("X") returns to the prompt with no output whether or not X exists. Wrap the call
|
|
81
|
+
in _D(...) (or print) to see the result; _D(Ext.Stats.Get("X")) dumps the whole stats object
|
|
82
|
+
as JSON-like text (ModId, ModifierList, Using, SpellType, every field), and prints nil for a
|
|
83
|
+
missing entry.'
|
|
84
|
+
status: verified
|
|
85
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
86
|
+
source: ModWright field verification
|
|
87
|
+
tags:
|
|
88
|
+
- scriptextender
|
|
89
|
+
- console
|
|
90
|
+
- lua
|
|
91
|
+
- dump
|
|
92
|
+
- stats
|
|
93
|
+
detail: "The missing-entry case was exercised later the same day
|
|
94
|
+
(bg3.scriptextender.console.ext-stats-get- missing-entry-prints-null): _D prints null, not
|
|
95
|
+
nil. The S >> prompt is the server context."
|
|
96
|
+
- id: bg3.scriptextender.console.ext-mod-getmod-info-directory-names-loaded-copy
|
|
97
|
+
claim: "Ext.Mod.GetMod(uuid).Info, dumped with _D at the SE console, reports the module the running
|
|
98
|
+
game bound to that UUID: Directory is the module folder actually loaded
|
|
99
|
+
(Mods/<Directory>/meta.lsx), alongside Name, Author, Description, ModVersion, PublishVersion,
|
|
100
|
+
PublishHandle and Hash. When several installed paks or loose modules share one UUID, this is
|
|
101
|
+
the only observable that says which copy won; modsettings.lsx's Folder attribute is the mod
|
|
102
|
+
manager's last binding and can disagree."
|
|
103
|
+
status: verified
|
|
104
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
105
|
+
source: ModWright field verification
|
|
106
|
+
tags:
|
|
107
|
+
- scriptextender
|
|
108
|
+
- console
|
|
109
|
+
- ext-mod
|
|
110
|
+
- uuid
|
|
111
|
+
- duplicate
|
|
112
|
+
- directory
|
|
113
|
+
detail: Which copy the game picks among same-UUID installs is not yet characterised (an earlier
|
|
114
|
+
launch bound a different copy with one more mod.io pak present); this fact is about how to
|
|
115
|
+
observe the choice, not how it is made. Omitting the closing parenthesis
|
|
116
|
+
(_D(Ext.Mod.GetMod("...").Info) is a Lua syntax error the console reports as "')' expected
|
|
117
|
+
near <eof>".
|
|
118
|
+
- id: bg3.scriptextender.console.getstats-unknown-types-on-runtime-32
|
|
119
|
+
claim: 'Ext.Stats.GetStats(type) on Script Extender runtime 32 (Patch 8) rejects four of the
|
|
120
|
+
thirteen type names the API document lists — SpellSet, EquipmentSet, ItemGroup and NameGroup —
|
|
121
|
+
with a console line "bg3se::lua::stats::FetchStatEntries(): Unknown stats entry type: <type>"
|
|
122
|
+
and returns nothing for them; the other nine (StatusData, SpellData, PassiveData, Armor,
|
|
123
|
+
Weapon, Character, Object, TreasureTable, TreasureCategory) answer normally.'
|
|
124
|
+
status: verified
|
|
125
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
126
|
+
source: ModWright field verification
|
|
127
|
+
tags:
|
|
128
|
+
- scriptextender
|
|
129
|
+
- stats
|
|
130
|
+
- getstats
|
|
131
|
+
- console
|
|
132
|
+
- runtime-32
|
|
133
|
+
detail: The bridge (bridges/bg3-se, Probes.lua STAT_TYPES) now iterates only the nine known types. A
|
|
134
|
+
stat of one of the four rejected types is therefore not reachable through bg3.stat.exists on
|
|
135
|
+
this runtime; whether a later extender build accepts them is unknown.
|
|
136
|
+
- id: bg3.scriptextender.console.ext-stats-get-missing-entry-prints-null
|
|
137
|
+
claim: _D(Ext.Stats.Get("<name>")) for an entry that is not loaded prints null, so the same one-line
|
|
138
|
+
check distinguishes present (a full stats object) from absent (null) without any other setup.
|
|
139
|
+
status: verified
|
|
140
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
141
|
+
source: ModWright field verification
|
|
142
|
+
tags:
|
|
143
|
+
- scriptextender
|
|
144
|
+
- console
|
|
145
|
+
- stats
|
|
146
|
+
- missing
|
|
147
|
+
- id: bg3.scriptextender.console.db-tables-read-via-get-method
|
|
148
|
+
claim: Osiris databases are readable from SE Lua/console as members of the Osi table with a
|
|
149
|
+
colon-called Get method, e.g. Osi.DB_Players:Get(nil) to dump every fact in DB_Players — the
|
|
150
|
+
guide gives this as the pattern for reading any DB_ database by name (Osi.DB_<Name>:Get(...)).
|
|
151
|
+
status: verified
|
|
152
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
153
|
+
source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:635-650, §7 Script Extender Functions
|
|
154
|
+
tags:
|
|
155
|
+
- scriptextender
|
|
156
|
+
- console
|
|
157
|
+
- database
|
|
158
|
+
- osi
|
|
159
|
+
- lua
|
|
160
|
+
detail: 'Checked against the source (2026-09-08): citation does not support the claim: §7 is an
|
|
161
|
+
unwritten stub ("Work in Progress", then a "// TODO" list); the `_D(Osi.DB_Players:Get(nil))`
|
|
162
|
+
string appears only as a bullet in that to-do list of things someone still means to document.
|
|
163
|
+
The page states no pattern, nothing about the `nil` argument, and nothing about other DB_
|
|
164
|
+
databases. The syntax may well be right — it just is not documented anywhere read here, so it
|
|
165
|
+
stayed unverified until run at the console. Run 2026-09-09: the DB_Players form works as
|
|
166
|
+
written and DB_Origins behaves the same, which closes the "another DB_ name" question. The
|
|
167
|
+
dump is a list of rows, each row a list of column values; a one-row database prints as its
|
|
168
|
+
single string.'
|
|
169
|
+
- id: bg3.scriptextender.console.session-loaded-message-confirms-console-ready
|
|
170
|
+
claim: After loading or starting a save, the SE console prints a session-loaded confirmation line
|
|
171
|
+
(plus any installed mods' own debug output) before it is meaningful to issue further commands
|
|
172
|
+
— the guide treats seeing this output as the signal to proceed, not just the console window
|
|
173
|
+
existing.
|
|
174
|
+
status: community
|
|
175
|
+
source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:44-50, §2.1 Load a save ("When the
|
|
176
|
+
save is loaded you should see some output in your console, telling you that the session has
|
|
177
|
+
loaded and other debug statements depending on what kind of mods you have installed")
|
|
178
|
+
tags:
|
|
179
|
+
- scriptextender
|
|
180
|
+
- console
|
|
181
|
+
- session-loaded
|
|
182
|
+
- workflow
|
|
183
|
+
- id: bg3.scriptextender.console.getposition-getregion-for-capturing-placement-data
|
|
184
|
+
claim: "Osi.GetPosition(target) and Osi.GetRegion(object) at the console are the documented way to
|
|
185
|
+
capture a level-placement data point without a mod dependency: \"Using Script Extender to get
|
|
186
|
+
positional information does not create a dependency on it for your mod, you're simply using it
|
|
187
|
+
to capture data points.\" GetPosition returns X, Y, Z space-separated (no commas) when
|
|
188
|
+
printed, but the values must be re-entered comma-separated into other Osi calls."
|
|
189
|
+
status: community
|
|
190
|
+
source: bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:21 ("Using Script Extender
|
|
191
|
+
to get positional information does not create a dependency on it for your mod, you're simply
|
|
192
|
+
using it to capture data points.") and :29-39, §Position (the GetRegion/GetPosition commands
|
|
193
|
+
and the no-commas-when-printed, commas-when-re-entered note)
|
|
194
|
+
tags:
|
|
195
|
+
- scriptextender
|
|
196
|
+
- console
|
|
197
|
+
- getposition
|
|
198
|
+
- getregion
|
|
199
|
+
- workflow
|
|
200
|
+
- id: bg3.scriptextender.console.createat-spawns-a-copy-not-the-original
|
|
201
|
+
claim: Osi.CreateAt(templateId, x, y, z, temporary, playSpawn, spawnFinishEvent) called at the
|
|
202
|
+
console "doesn't add the original to the map, we're creating a copy based on the original" —
|
|
203
|
+
templateId is the target RootTemplate's MapKey, temporary=0 makes the spawned copy permanent,
|
|
204
|
+
and the call returns a GUIDSTRING for the new object that should be captured into a console
|
|
205
|
+
variable for later reference (e.g. newbox = Osi.CreateAt(...)).
|
|
206
|
+
status: community
|
|
207
|
+
source: bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:43-57, §Spawn Item ("It
|
|
208
|
+
doesn't add the original to the map, we're creating a copy based on the original."; worked
|
|
209
|
+
example assigning the return to `newbox`)
|
|
210
|
+
tags:
|
|
211
|
+
- scriptextender
|
|
212
|
+
- console
|
|
213
|
+
- createat
|
|
214
|
+
- roottemplate
|
|
215
|
+
- workflow
|
|
216
|
+
- id: bg3.scriptextender.console.itemrotateytoangle-is-absolute-not-relative
|
|
217
|
+
claim: Osi.ItemRotateYToAngle(item, angleDeg, speedDegPerSec) rotates an item TO an absolute Y-axis
|
|
218
|
+
angle, not BY that angle — issuing the same command with 90 degrees twice in a row leaves the
|
|
219
|
+
item at 90 degrees both times, it does not accumulate to 180. Osi.ItemRotateY (without
|
|
220
|
+
"ToAngle") is a separate, distinctly named generated call with the same three parameters.
|
|
221
|
+
status: community
|
|
222
|
+
source: bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:70-84, §Rotation ("We are
|
|
223
|
+
not rotating **BY** that angle."; the paragraph then works through the repeated-90-degrees
|
|
224
|
+
case); LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:3107 (ItemRotateY), :3112
|
|
225
|
+
(ItemRotateYToAngle)
|
|
226
|
+
tags:
|
|
227
|
+
- scriptextender
|
|
228
|
+
- console
|
|
229
|
+
- itemrotateytoangle
|
|
230
|
+
- rotation
|
|
231
|
+
- gotcha
|
|
232
|
+
detail: 'Checked against the source (2026-09-08): an earlier wording called ItemRotateY "the call
|
|
233
|
+
for a relative rotation". The tutorial never mentions ItemRotateY and the generated stub gives
|
|
234
|
+
only its name and parameters, so its semantics are an assumption from the name; only its
|
|
235
|
+
separate existence is cited here.'
|
|
236
|
+
- id: bg3.scriptextender.console.lua-loader-takes-code-then-an-env-table
|
|
237
|
+
claim: "A mod's server Lua state under Script Extender runtime 32 exposes a Lua loader (reached as
|
|
238
|
+
`loadstring or load`) that compiles a source string, and its optional second argument is an
|
|
239
|
+
environment table, not a chunk name: calling it as loader(code, \"=name\", \"t\") raises \"bad
|
|
240
|
+
argument #2 to 'loader' (table expected, got string)\", while loader(code) compiles and the
|
|
241
|
+
chunk runs against the mod's globals (Ext, Osi and the rest resolve)."
|
|
242
|
+
status: verified
|
|
243
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
244
|
+
source: ModWright field verification
|
|
245
|
+
tags:
|
|
246
|
+
- scriptextender
|
|
247
|
+
- lua
|
|
248
|
+
- load
|
|
249
|
+
- loadstring
|
|
250
|
+
- sandbox
|
|
251
|
+
- bridge
|
|
252
|
+
- eval
|
|
253
|
+
detail: Which of `load` and `loadstring` the state actually binds was not separated (the handler
|
|
254
|
+
takes the first defined); the second-argument shape matches the classic sandboxed-loadstring
|
|
255
|
+
convention rather than Lua 5.4's load(chunk, name, mode, env). Osi.TemplateAddTo returns
|
|
256
|
+
nothing (returnCount 0), so the inventory is the only read-back;
|
|
257
|
+
Osi.GetItemByTemplateInInventory returns one guid and cannot count.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: scriptextender
|
|
3
|
+
title: Script Extender configuration, APIs, and Osiris integration
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.se.mutually-exclusive-with-toolkit
|
|
6
|
+
claim: SE and the official Toolkit are mutually exclusive for AUTHORING — pick the hand-authored
|
|
7
|
+
pipeline for SE mods. (Publishing an SE mod through the Toolkit is a separate question; see
|
|
8
|
+
bg3.publishing.se-mods-can-ship-on-modio.)
|
|
9
|
+
status: verified
|
|
10
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
11
|
+
source: ModWright field verification
|
|
12
|
+
tags:
|
|
13
|
+
- scriptextender
|
|
14
|
+
- toolkit
|
|
15
|
+
- authoring
|
|
16
|
+
detail: This is why the whole BG3 pipeline here is hand-authored + LSLib/Divine + Nexus, with the
|
|
17
|
+
Toolkit used only to publish to mod.io. It is also why the Toolkit's "Convert UI Assets" step
|
|
18
|
+
(which would auto-write GUI/metadata.lsf) is unavailable.
|
|
19
|
+
- id: bg3.se.config-required
|
|
20
|
+
claim: 'SE config MUST be Mods/<Mod>/ScriptExtender/Config.json — capital C (pak-internal paths are
|
|
21
|
+
case-sensitive; lowercase config.json silently fails in a packed mod) — with the
|
|
22
|
+
RequiredVersion key, NOT the DOS2-era RequiredExtensionVersion. Shape: { "RequiredVersion":
|
|
23
|
+
21, "ModTable": "<Mod>", "FeatureFlags": ["Lua"] }.'
|
|
24
|
+
status: verified
|
|
25
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
26
|
+
source: ModWright field verification
|
|
27
|
+
tags:
|
|
28
|
+
- scriptextender
|
|
29
|
+
- config
|
|
30
|
+
- bootstrap
|
|
31
|
+
detail: "Both failure modes were found on an earlier mod: a lowercase config.json (tolerated for
|
|
32
|
+
loose files, fatal in a pak) and the DOS2-era RequiredExtensionVersion key — both silent. SE
|
|
33
|
+
enumeration works loose and packed, but only for mods in the active load order.
|
|
34
|
+
RequiredVersion is a floor: set it to the lowest SE major that has the APIs you use."
|
|
35
|
+
- id: bg3.se.bootstrap-files
|
|
36
|
+
claim: "Server bootstrap: Mods/<Mod>/ScriptExtender/Lua/BootstrapServer.lua (runs when a session
|
|
37
|
+
loads). Client bootstrap: Mods/<Mod>/ScriptExtender/Lua/BootstrapClient.lua (runs at the main
|
|
38
|
+
menu)."
|
|
39
|
+
status: verified
|
|
40
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
41
|
+
source: ModWright field verification
|
|
42
|
+
tags:
|
|
43
|
+
- scriptextender
|
|
44
|
+
- bootstrap
|
|
45
|
+
- lua
|
|
46
|
+
detail: The file names and paths are exact. Register listeners on SessionLoaded.
|
|
47
|
+
- id: bg3.se.osiris-listener-arity
|
|
48
|
+
claim: 'Listen to Osiris events with Ext.Osiris.RegisterListener("StatusApplied", 4, "after", fn).
|
|
49
|
+
Get the correct ARITY — wrong arity = dead listener. Signatures: StatusApplied(object, status,
|
|
50
|
+
causee, storyActionID) [4]; StatusRemoved(object, status, causee, applyStoryActionID) [4];
|
|
51
|
+
CastedSpell(caster, spell, spellType, spellElement, storyActionID) [5]; KilledBy(defender,
|
|
52
|
+
attackOwner, attacker, storyActionID) [4]; Died(character) [1];
|
|
53
|
+
TemplateKilledBy(characterTemplate, defender, attackOwner, attacker, storyActionID) [5].'
|
|
54
|
+
status: verified
|
|
55
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
56
|
+
source: ModWright field verification
|
|
57
|
+
tags:
|
|
58
|
+
- scriptextender
|
|
59
|
+
- osiris
|
|
60
|
+
- listeners
|
|
61
|
+
- arity
|
|
62
|
+
detail: Canonical signatures come from LaughingLeader BG3ModdingTools/generated/Osi{,.Events}.lua;
|
|
63
|
+
the 2026-09-08 intake drafted a second fact restating these same six signatures from that file
|
|
64
|
+
(bg3.osiris.signatures.listener-event-arity-confirmed-against-generated-file), which was
|
|
65
|
+
deleted as a duplicate with its line citations merged into this fact's source instead.
|
|
66
|
+
Correlate related events on the shared storyActionID — but its lifetime is UNDOCUMENTED and
|
|
67
|
+
IDs are reused within a session, so any correlation table needs a TTL/cleanup sweep; never
|
|
68
|
+
treat a storyActionID as globally unique. A weapon kill carries its own storyActionID distinct
|
|
69
|
+
from the spell that applied the victim's status.
|
|
70
|
+
- id: bg3.se.v32-api-date
|
|
71
|
+
claim: The SE v32 API reference in these notes was verified 2026-08-29 against
|
|
72
|
+
Ext.Utils.Version()==32; v32 released 2026-06-21. Canonical Osiris signatures from
|
|
73
|
+
LaughingLeader BG3ModdingTools/generated/Osi{,.Events}.lua; Lua events from Norbyte/bg3se
|
|
74
|
+
BG3Extender/IdeHelpers/ExtIdeHelpers.lua.
|
|
75
|
+
status: verified
|
|
76
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
77
|
+
source: ModWright field verification
|
|
78
|
+
tags:
|
|
79
|
+
- scriptextender
|
|
80
|
+
- se-v32
|
|
81
|
+
- api
|
|
82
|
+
- reference
|
|
83
|
+
detail: "The damage pipeline names churn between versions: current ones are
|
|
84
|
+
Ext.Events.EsvLuaBeforeDealDamage (fires BEFORE mitigation — modify here) and
|
|
85
|
+
Ext.Events.EsvLuaDealDamage. StatsDealDamageFunctor has IgnoreImmunities but no
|
|
86
|
+
IgnoreResistances, so resistance bypass must be done in these hooks. Old DOS2-era Game.Math /
|
|
87
|
+
bare DealDamage names are gone."
|
|
88
|
+
- id: bg3.se.use-spell-forced-cast
|
|
89
|
+
claim: Osi.UseSpell(caster, spellID, target[, target2[, withoutMove:int]]) — overloads 3/4/5 args,
|
|
90
|
+
NO level parameter; Osi.UseSpellAtPosition(caster, spellID, x, y, z[, withoutMove]) for point
|
|
91
|
+
casts. Forced casts resolve at spell power level 0, so encode any level in the spell ID (cast
|
|
92
|
+
the pre-leveled child), not the call.
|
|
93
|
+
status: verified
|
|
94
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
95
|
+
source: ModWright field verification
|
|
96
|
+
tags:
|
|
97
|
+
- scriptextender
|
|
98
|
+
- osiris
|
|
99
|
+
- usespell
|
|
100
|
+
- forced-cast
|
|
101
|
+
detail: SpellPowerLevel-scaled effects therefore see 0 on forced casts. Whether forced casts consume
|
|
102
|
+
resources was still untested at the time of that finding.
|
|
103
|
+
- id: bg3.se.console-reset-degrades-osiris
|
|
104
|
+
claim: 'SE console `reset` hot-reloads BootstrapServer.lua/BootstrapClient.lua without restarting
|
|
105
|
+
the game, BUT reset mid-session degrades Osiris ("Not syncing adapters - DB not available"):
|
|
106
|
+
Osi queries return junk and Osi calls silently no-op afterwards. Use reset only to reload Lua
|
|
107
|
+
code; anything Osi-driven needs a save reload (F8) instead.'
|
|
108
|
+
status: verified
|
|
109
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
110
|
+
source: ModWright field verification
|
|
111
|
+
tags:
|
|
112
|
+
- scriptextender
|
|
113
|
+
- console
|
|
114
|
+
- reset
|
|
115
|
+
- osiris
|
|
116
|
+
detail: "Degradation detector: Osi.GetMaxHitpoints(host) vs Ext.Entity.Get(host).Health.MaxHp
|
|
117
|
+
disagreeing. Quickload (F8) starts a fresh session — SessionLoaded re-fires, Osi state is
|
|
118
|
+
clean, and session-granted passives/statuses are wiped back to the save's state."
|
|
119
|
+
- id: bg3.se.lua-best-practices
|
|
120
|
+
claim: Wrap everything in pcall. Remove dev diagnostics (UI-viewmodel probes, StaticData dumps)
|
|
121
|
+
before release. Stats entries are live-editable from the SE console —
|
|
122
|
+
Ext.Stats.Get("<entry>"), then SetRawAttribute + Sync; functor/complex fields REQUIRE
|
|
123
|
+
SetRawAttribute (plain assignment throws "Inappropriate type" in SE v32).
|
|
124
|
+
status: verified
|
|
125
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
126
|
+
source: ModWright field verification
|
|
127
|
+
tags:
|
|
128
|
+
- scriptextender
|
|
129
|
+
- lua
|
|
130
|
+
- error-handling
|
|
131
|
+
- diagnostics
|
|
132
|
+
detail: Simple string fields accept plain assignment. Stats .txt FILE edits still need a game
|
|
133
|
+
restart (a whole-file runtime reload API is unconfirmed), and Progressions/ClassDescriptions
|
|
134
|
+
.lsx are read at session load only.
|
|
135
|
+
- id: bg3.se.corpse-removal
|
|
136
|
+
claim: 'Corpse/entity removal: Osi.RequestDelete(obj), guarded with Osi.IsDead(obj)==1 and
|
|
137
|
+
Osi.IsPlayer(obj)~=1. DeathType "Disintegrate" only drives the dissolve VFX; the corpse entity
|
|
138
|
+
persists — removing it needs SE.'
|
|
139
|
+
status: verified
|
|
140
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
141
|
+
source: ModWright field verification
|
|
142
|
+
tags:
|
|
143
|
+
- scriptextender
|
|
144
|
+
- osiris
|
|
145
|
+
- corpse
|
|
146
|
+
- deletion
|
|
147
|
+
detail: Stats-side disintegration is cosmetic only, which is why the visual alone never removes the
|
|
148
|
+
body.
|
|
149
|
+
- id: bg3.se.osi-queries-broken-actions-work
|
|
150
|
+
claim: "In this SE build, Osiris ACTIONS work but Osi QUERIES are unreliable: Osi.SetFlag works
|
|
151
|
+
while Osi.GetFlag returned 0 for a provably-set flag, and every Osi query is treated as
|
|
152
|
+
suspect."
|
|
153
|
+
status: verified
|
|
154
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
155
|
+
source: ModWright field verification
|
|
156
|
+
tags:
|
|
157
|
+
- scriptextender
|
|
158
|
+
- osiris
|
|
159
|
+
- queries
|
|
160
|
+
- flags
|
|
161
|
+
detail: "Design around it: drive state with actions and read state from Ext.Entity / stats rather
|
|
162
|
+
than Osi queries. Note that a degraded session (console `reset`) produces the same symptom for
|
|
163
|
+
a different reason — see bg3.se.console-reset-degrades-osiris."
|
|
164
|
+
- id: bg3.se.osiris-restricted-at-sessionloaded
|
|
165
|
+
claim: 'Osiris functions are NOT callable during SessionLoaded (and other early load phases):
|
|
166
|
+
calling any Osi.* there throws "Attempted to call Osiris function in restricted context".
|
|
167
|
+
Registering listeners (Ext.Osiris.RegisterListener) at SessionLoaded is fine; calling an
|
|
168
|
+
Osiris function synchronously at that point is not.'
|
|
169
|
+
status: verified
|
|
170
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
171
|
+
source: ModWright field verification
|
|
172
|
+
tags:
|
|
173
|
+
- scriptextender
|
|
174
|
+
- osiris
|
|
175
|
+
- sessionloaded
|
|
176
|
+
- restricted-context
|
|
177
|
+
- lua
|
|
178
|
+
detail: Move any actual Osi.* call (GetHostCharacter, GetFlag, TemplateAddTo, ...) out of
|
|
179
|
+
SessionLoaded and into a gameplay/Osiris event handler where the story is live (e.g. a
|
|
180
|
+
level-load or region listener). An Ext.Osiris.IsCallable() guard, if present in the installed
|
|
181
|
+
SE build, can gate calls from ambiguous contexts; deferring to an Osiris event is the reliable
|
|
182
|
+
fix.
|
|
183
|
+
- id: bg3.scriptextender.osi-inventory-calls-complete-asynchronously
|
|
184
|
+
claim: 'Osi.ToInventory, Osi.TemplateAddTo, Osi.TemplateRemoveFrom and Osi.RequestDelete return
|
|
185
|
+
before the change is applied: a GetItemByTemplateInInventory / GetInventoryOwner / Exists read
|
|
186
|
+
in the same chunk, or 2-4 s later in a following probe, still shows the old state; 8-20 s
|
|
187
|
+
later it shows the new one. A read-back must settle for at least ~8 s, and issuing a
|
|
188
|
+
"fallback" TemplateAddTo because the first read looked unchanged creates a duplicate.'
|
|
189
|
+
status: verified
|
|
190
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
191
|
+
source: ModWright field verification
|
|
192
|
+
tags:
|
|
193
|
+
- scriptextender
|
|
194
|
+
- osiris
|
|
195
|
+
- inventory
|
|
196
|
+
- async
|
|
197
|
+
- bridge
|
|
198
|
+
- id: bg3.scriptextender.story-items-are-matched-by-instance-not-template
|
|
199
|
+
claim: "Osiris goals bind to a specific global item INSTANCE (UseFinished(_Player,
|
|
200
|
+
S_GLO_PixieBell_8c99b6c7-..., 1) in GLO_Pixie.txt), so a second item spawned from the same
|
|
201
|
+
template (TemplateAddTo of UNI_SCL_PixieBell's MapKey) is inert: its use action runs but no
|
|
202
|
+
goal reacts. To hand a player such an item, move the real instance with
|
|
203
|
+
Osi.ToInventory(\"<Name>_<MapKey>\", host, 1, 1, 1); the story parks such items at a hidden
|
|
204
|
+
\"asylum\" trigger per level (the pixie and her bell stood at 20/0/-1417 in SCL_Main_A) so the
|
|
205
|
+
instance exists to be moved."
|
|
206
|
+
status: verified
|
|
207
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
208
|
+
source: Gustav.pak GLO_Pixie.txt lines 37-42; bridge requests req-mu8oxy6g, req-mu8p0lk3,
|
|
209
|
+
req-mu8p11jx, req-mu8p3i4c
|
|
210
|
+
tags:
|
|
211
|
+
- osiris
|
|
212
|
+
- story
|
|
213
|
+
- global-items
|
|
214
|
+
- templateaddto
|
|
215
|
+
- toinventory
|
|
216
|
+
- id: bg3.scriptextender.level-placement-via-levelgameplaystarted-and-container-instance-id
|
|
217
|
+
claim: "A mod can place its item in a specific vanilla container natively-shaped for SE: register
|
|
218
|
+
Ext.Osiris.RegisterListener(\"LevelGameplayStarted\", 2, \"after\", fn) at SessionLoaded and,
|
|
219
|
+
when the level name matches, Osi.TemplateAddTo(<item template>, \"<ContainerName>_<MapKey>\",
|
|
220
|
+
1, 0) after a GetItemByTemplateInInventory dedup. The container id is the level
|
|
221
|
+
Items/_merged.lsf node's Name and MapKey joined by \"_\"
|
|
222
|
+
(CONT_GEN_Rock_Pile_Grave_Open_A_000_472199db-9e39-4f40-9a0d-9c439b1953bf). It fires on a save
|
|
223
|
+
loaded into that level, not only on first entry."
|
|
224
|
+
status: verified
|
|
225
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
226
|
+
source: ModWright field verification
|
|
227
|
+
tags:
|
|
228
|
+
- scriptextender
|
|
229
|
+
- osiris
|
|
230
|
+
- placement
|
|
231
|
+
- levelgameplaystarted
|
|
232
|
+
- containers
|
|
233
|
+
- id: bg3.scriptextender.in-game-container-survey-through-the-bridge
|
|
234
|
+
claim: 'The reliable way to find "the container the player is standing at" is a bridge bg3.lua.eval
|
|
235
|
+
on the server: Osi.GetPosition(Osi.GetHostCharacter()), then iterate
|
|
236
|
+
Ext.Entity.GetAllEntitiesWithComponent("ServerItem"), keep entities whose
|
|
237
|
+
Transform.Transform.Translate is within a few metres, and print Uuid.EntityUuid,
|
|
238
|
+
ServerItem.Template.Name, Osi.IsContainer(uuid),
|
|
239
|
+
Ext.Loca.GetTranslatedString(DisplayName.NameKey.Handle.Handle) and
|
|
240
|
+
Osi.GetInventoryOwner(uuid) (which shows what already sits inside which container). Offline
|
|
241
|
+
level surveys anchored on a name-regex centroid picked the wrong object twice (a cellar chest
|
|
242
|
+
950 m from the graveyard; a chest 45 m from the display case).'
|
|
243
|
+
status: verified
|
|
244
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
245
|
+
source: ModWright field verification
|
|
246
|
+
tags:
|
|
247
|
+
- scriptextender
|
|
248
|
+
- bridge
|
|
249
|
+
- survey
|
|
250
|
+
- entities
|
|
251
|
+
- containers
|
|
252
|
+
- levels
|