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,167 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: wolvenkit.cli
|
|
3
|
+
title: WolvenKit.CLI commands ModWright runs — pack, import, convert serialize/deserialize
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.wolvenkit.cli.pack-ignores-non-archive-files
|
|
6
|
+
claim: "`pack` only generates the `.archive` file(s) from a folder of REDengine files — it does not
|
|
7
|
+
behave exactly like WolvenKit's own \"Build Project\" button, and specifically ignores extra
|
|
8
|
+
files such as `.xl` manifests; those still need to land at their final path by some other step
|
|
9
|
+
(e.g. a plain file copy) alongside the packed archive."
|
|
10
|
+
status: community
|
|
11
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, hint under
|
|
12
|
+
"Pack" ("It will only generate **.archive** file(s) and ignore any extra files (such as
|
|
13
|
+
**.xl**)"; the same hint also says the command does not behave exactly like the WolvenKit
|
|
14
|
+
application's `Build Project` button)
|
|
15
|
+
tags:
|
|
16
|
+
- wolvenkit
|
|
17
|
+
- cli
|
|
18
|
+
- pack
|
|
19
|
+
- .xl
|
|
20
|
+
- build-project
|
|
21
|
+
- gotcha
|
|
22
|
+
- id: cp2077.wolvenkit.cli.pack-multiple-paths-one-output-dir
|
|
23
|
+
claim: "`pack` accepts two invocation forms: `pack -p <path> [-o output]` (backward-compatible
|
|
24
|
+
single-path form) and `pack [-o output] <path1> <pathN>` (multiple project paths, each
|
|
25
|
+
producing its own `.archive`); when packing multiple projects at once only a single output
|
|
26
|
+
directory can be given for all of them — the wiki attributes this limitation to .NET."
|
|
27
|
+
status: community
|
|
28
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
|
|
29
|
+
"Pack" ("Usage" and the warning under "Example")
|
|
30
|
+
tags:
|
|
31
|
+
- wolvenkit
|
|
32
|
+
- cli
|
|
33
|
+
- pack
|
|
34
|
+
- multiple-paths
|
|
35
|
+
- output-directory
|
|
36
|
+
- id: cp2077.wolvenkit.cli.pack-must-not-replace-vanilla-archives
|
|
37
|
+
claim: The `pack` command's documentation carries an explicit warning not to replace existing
|
|
38
|
+
vanilla archives with its output.
|
|
39
|
+
status: community
|
|
40
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, danger hint
|
|
41
|
+
under "Pack" ("Do not replace existing vanilla archives")
|
|
42
|
+
tags:
|
|
43
|
+
- wolvenkit
|
|
44
|
+
- cli
|
|
45
|
+
- pack
|
|
46
|
+
- vanilla-archive
|
|
47
|
+
- safety
|
|
48
|
+
- id: cp2077.wolvenkit.cli.import-keep-flag-needs-matching-pair
|
|
49
|
+
claim: "`import`'s `-k`/`--keep` flag (used to preserve existing REDengine files' data when
|
|
50
|
+
importing raw files over them) requires that both halves of a matching pair already exist in
|
|
51
|
+
the output — e.g. both `judy_body_wet.xbm` and `judy_body_wet.dds` — and when `-o` is used,
|
|
52
|
+
the existing REDengine files must be located in that output folder while the raw source files
|
|
53
|
+
are read from the path given by `-p`."
|
|
54
|
+
status: community
|
|
55
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
|
|
56
|
+
"Import" (hint under the command)
|
|
57
|
+
tags:
|
|
58
|
+
- wolvenkit
|
|
59
|
+
- cli
|
|
60
|
+
- import
|
|
61
|
+
- keep-flag
|
|
62
|
+
- gotcha
|
|
63
|
+
detail: "RELATED: this documents the same `-k`/`--keep` flag as cp2077.toolchain.cli-import-flag,
|
|
64
|
+
but the wiki does not state what `-k` actually preserves beyond requiring the matching-pair
|
|
65
|
+
precondition — that fact's \"preserves the donor's material bindings\" reading remains an
|
|
66
|
+
inference from a mod's build pipeline, not confirmed by this page either."
|
|
67
|
+
- id: cp2077.wolvenkit.cli.convert-serialize-deserialize-flags
|
|
68
|
+
claim: '`convert -s "<path>"` converts a REDengine (CR2W) file into its human-readable (json) form;
|
|
69
|
+
`convert -d "<path>"` converts a json file back into a REDengine file. The older `cr2w
|
|
70
|
+
-s`/`cr2w -d` command spelling does the same thing but is documented as deprecated in favor of
|
|
71
|
+
`convert`.'
|
|
72
|
+
status: community
|
|
73
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, sections
|
|
74
|
+
"~~CR2W/W2RC~~ (Deprecated)" and "Convert"
|
|
75
|
+
tags:
|
|
76
|
+
- wolvenkit
|
|
77
|
+
- cli
|
|
78
|
+
- convert
|
|
79
|
+
- serialize
|
|
80
|
+
- deserialize
|
|
81
|
+
- cr2w
|
|
82
|
+
- deprecated
|
|
83
|
+
detail: "RELATED: grounds the direction of cp2077.toolchain.cli-convert-serialize (binary->json) and
|
|
84
|
+
cp2077.toolchain.cli-convert-deserialize (json->binary) in the actual CLI flags (`-s` and
|
|
85
|
+
`-d`) — those two facts describe a mod's pipeline usage without naming the flags."
|
|
86
|
+
- id: cp2077.wolvenkit.cli.tweak-command-flats-and-groups
|
|
87
|
+
claim: The `tweak` command compiles a `.tweak` yaml file (with top-level `flats` and/or `groups`
|
|
88
|
+
keys) into a TweakDB `.bin` loadable by TweakDBext; for a `groups` entry, member flats are
|
|
89
|
+
auto-generated by appending each member's name to the record's own name (e.g. a
|
|
90
|
+
`MyRecord.mine` group with an `affiliation` member yields flat `MyRecord.mine.affiliation`),
|
|
91
|
+
and the compiler does not validate that a group's `type` is a real TweakDB type — an unknown
|
|
92
|
+
type only surfaces later, as a message in `red4ext\logs\tweakdb.log` when TweakDBext loads the
|
|
93
|
+
resulting `.bin`.
|
|
94
|
+
status: community
|
|
95
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
|
|
96
|
+
"Tweak"
|
|
97
|
+
tags:
|
|
98
|
+
- wolvenkit
|
|
99
|
+
- cli
|
|
100
|
+
- tweak
|
|
101
|
+
- flats
|
|
102
|
+
- groups
|
|
103
|
+
- tweakdbext
|
|
104
|
+
- silent-failure
|
|
105
|
+
detail: This `tweak`/TweakDBext path is a different pipeline from TweakXL's yaml tweaks
|
|
106
|
+
(cp2077.tweakxl.yaml-syntax.*) — TweakDBext compiles to a binary TweakDB patch loaded
|
|
107
|
+
independently of TweakXL, so a fact about one does not transfer to the other without checking
|
|
108
|
+
which pipeline a given project actually uses.
|
|
109
|
+
- id: cp2077.wolvenkit.cli.tweak-type-name-drops-gamedata-and-record-suffix
|
|
110
|
+
claim: A TweakDB group's `type` value is the RTTI record type name with the `gamedata` prefix and
|
|
111
|
+
`_Record` suffix both dropped — e.g. RTTI type `gamedataVehicle_Record` is written as
|
|
112
|
+
`Vehicle` in `.tweak` yaml.
|
|
113
|
+
status: community
|
|
114
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
|
|
115
|
+
"Tweak > Groups" (naming rule and Vehicle example)
|
|
116
|
+
tags:
|
|
117
|
+
- wolvenkit
|
|
118
|
+
- cli
|
|
119
|
+
- tweak
|
|
120
|
+
- naming-convention
|
|
121
|
+
- rtti
|
|
122
|
+
- id: cp2077.wolvenkit.cli.tweak-supported-flat-types
|
|
123
|
+
claim: "`.tweak` yaml flats and group members must declare a base `type` from a fixed list: `CName`,
|
|
124
|
+
`String`, `TweakDBID`, `raRef:CResource`, `Float`, `Bool`, `Uint8/16/32/64`, `Int8/16/32/64`,
|
|
125
|
+
`Color`, `EulerAngles`, `Quaternion`, `Vector2`, `Vector3`, `LocKey`; any of these can be
|
|
126
|
+
wrapped as `array:<Type>` to declare an array field."
|
|
127
|
+
status: community
|
|
128
|
+
source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
|
|
129
|
+
"Tweak > Types"
|
|
130
|
+
tags:
|
|
131
|
+
- wolvenkit
|
|
132
|
+
- cli
|
|
133
|
+
- tweak
|
|
134
|
+
- type
|
|
135
|
+
- schema
|
|
136
|
+
detail: "`TweakDBID` values can be written as the full flat/group path (e.g. `myOtherFlat.cow`) or
|
|
137
|
+
as the shorthand hash/length form `TDBID:12345678:12`; `raRef:CResource` also accepts a raw
|
|
138
|
+
integer hash (e.g. pulled from a TweakDB dump) in place of a string path."
|
|
139
|
+
- id: cp2077.wolvenkit.cli.pack-is-not-byte-deterministic
|
|
140
|
+
claim: "WolvenKit CLI 8.20.0 `pack` of an unchanged tree does not reproduce the same bytes: two
|
|
141
|
+
packs are the same size and differ in a few dozen bytes near the end of the file, so a sha256
|
|
142
|
+
compare cannot tell an unchanged repack from a real change."
|
|
143
|
+
status: verified
|
|
144
|
+
verified_on: "2.31"
|
|
145
|
+
source: ModWright field verification
|
|
146
|
+
tags:
|
|
147
|
+
- wolvenkit
|
|
148
|
+
- cli
|
|
149
|
+
- pack
|
|
150
|
+
- determinism
|
|
151
|
+
- deploy
|
|
152
|
+
detail: "Where the differing bytes sit (after the file data) suggests per-entry timestamps in the
|
|
153
|
+
archive's file table; that is inferred, not read. Consequence: deploy's skip-identical check
|
|
154
|
+
redeploys a repacked archive whose content did not change."
|
|
155
|
+
- id: cp2077.wolvenkit.cli.archive-list-prints-backslash-paths
|
|
156
|
+
claim: "`archive <file> -l` prints one depot path per line with backslash separators
|
|
157
|
+
(`mod\\<modname>\\en-us.json`), so a glob written with `/` must match either separator."
|
|
158
|
+
status: verified
|
|
159
|
+
verified_on: "2.31"
|
|
160
|
+
source: ModWright field verification
|
|
161
|
+
tags:
|
|
162
|
+
- wolvenkit
|
|
163
|
+
- cli
|
|
164
|
+
- archive
|
|
165
|
+
- listing
|
|
166
|
+
- verify-listing
|
|
167
|
+
- glob
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: workspot.system
|
|
3
|
+
title: WorkspotGameSystem - the play-in-device signatures
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.workspot.system.playindevicesimple-signature
|
|
6
|
+
claim: "WorkspotGameSystem.PlayInDeviceSimple is declared as PlayInDeviceSimple(device:
|
|
7
|
+
ref<GameObject>, actor: ref<GameObject>, allowCameraMov: Bool, opt actorDataCompName: CName,
|
|
8
|
+
opt deviceDataCompName: CName, opt syncSlotName: CName, opt slideTime: Float, opt
|
|
9
|
+
slideBehaviour: WorkspotSlidingBehaviour, opt callbackEventRecipient: ref<Entity>). The third
|
|
10
|
+
argument is allowCameraMov: it is not a freeze-on-end flag."
|
|
11
|
+
status: verified
|
|
12
|
+
verified_on: "2.31"
|
|
13
|
+
source: codeberg adamsmasher/cyberpunk@a2e6bb3 orphans.swift:18383
|
|
14
|
+
tags:
|
|
15
|
+
- workspot
|
|
16
|
+
- playindevicesimple
|
|
17
|
+
- allowcameramov
|
|
18
|
+
- signature
|
|
19
|
+
detail: A quickhack mod plays V's jack-in kneel with true; a freezeOnEnd reading of the argument,
|
|
20
|
+
adopted and reverted on 2026-09-21, was wrong. The fourth argument is what a script passes as
|
|
21
|
+
the component name (that mod's own workspot component).
|
|
22
|
+
- id: cp2077.workspot.system.playindevice-signature
|
|
23
|
+
claim: "WorkspotGameSystem.PlayInDevice is declared as PlayInDevice(device: ref<GameObject>, actor:
|
|
24
|
+
ref<GameObject>, opt workspotStateFlavourName: CName, opt actorDataCompName: CName, opt
|
|
25
|
+
deviceDataCompName: CName, opt syncSlotName: CName, opt slideTime: Float, opt slideBehaviour:
|
|
26
|
+
WorkspotSlidingBehaviour, opt callbackEventRecipient: ref<Entity>); unlike PlayInDeviceSimple
|
|
27
|
+
it has no camera-movement flag and takes a workspot state flavour name instead."
|
|
28
|
+
status: verified
|
|
29
|
+
verified_on: "2.31"
|
|
30
|
+
source: codeberg adamsmasher/cyberpunk@a2e6bb3 orphans.swift:18385
|
|
31
|
+
tags:
|
|
32
|
+
- workspot
|
|
33
|
+
- playindevice
|
|
34
|
+
- signature
|
|
35
|
+
- id: cp2077.workspot.system.resource-without-anim-graph-crashes-on-play
|
|
36
|
+
claim: "A workWorkspotResource that carries only its workspotTree (no rootNode, empty nodesToInit
|
|
37
|
+
and animFeatures, no variables container, no staticCommandsRig) deserializes with WolvenKit
|
|
38
|
+
8.20, and its entity spawns. Playing V into it with PlayInDeviceSimple crashes the game in the
|
|
39
|
+
same frame: an access violation reading 0x44 at exe+0x4B2A1D, the entry of a routine called
|
|
40
|
+
with a null object. The same workspot with a vanilla workspot's layout (rootNode →
|
|
41
|
+
animAnimNode_Root → animAnimNode_Output → animAnimNode_WorkspotHub, nodesToInit holding the
|
|
42
|
+
three, the animAnimFeatureUpdateWorkspot feature named UpdateWorkspot, an empty
|
|
43
|
+
animAnimVariableContainer, staticCommandsRig) plays."
|
|
44
|
+
status: verified
|
|
45
|
+
verified_on: "2.31"
|
|
46
|
+
source: ModWright field verification
|
|
47
|
+
tags:
|
|
48
|
+
- workspot
|
|
49
|
+
- resource
|
|
50
|
+
- animgraph
|
|
51
|
+
- crash
|
|
52
|
+
- authoring
|
|
53
|
+
detail: A quickhack mod's build script writes the layout by hand; its key set matches the vanilla
|
|
54
|
+
q104 workspot's key for key. The animSetup hash stays 0 in the mod's resources and they play,
|
|
55
|
+
so the hash is not required.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: world.interactions
|
|
3
|
+
title: Native Interactions Framework
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.world.interactions.dependency-and-install-path
|
|
6
|
+
claim: Native Interactions Framework requires Red4Ext, CET, Codeware, Redscript and ArchiveXL
|
|
7
|
+
installed first, plus World Builder "if you want to place interactions which use props".
|
|
8
|
+
Installed correctly it produces the folder `Cyberpunk
|
|
9
|
+
2077\bin\x64\plugins\cyber_engine_tweaks\mods\nativeInteractions`.
|
|
10
|
+
status: community
|
|
11
|
+
source: wiki.redmodding.org "Installation" (Native Interactions Framework), sections "Requirements",
|
|
12
|
+
"Download" and "Installing" (info hint)
|
|
13
|
+
tags:
|
|
14
|
+
- nif
|
|
15
|
+
- native-interactions-framework
|
|
16
|
+
- dependency
|
|
17
|
+
- install-path
|
|
18
|
+
detail: The page names no version floors for any of the five dependencies. It is installed like any
|
|
19
|
+
other mod, by extracting into the base game directory (the one "called `Cyberpunk 2077` and
|
|
20
|
+
contains the folders `bin` and `archive`"). Page title corrected 2026-09-07 — the page is
|
|
21
|
+
simply "Installation" under the Native Interactions Framework section.
|
|
22
|
+
- id: cp2077.world.interactions.basic-interaction-fields
|
|
23
|
+
claim: A Simple Interaction (one that needs no props) is edited from the "Cog" icon beside its name,
|
|
24
|
+
in the "Edit Interaction" tab. `Icon Position` controls where the icon is; `Icon Visibility
|
|
25
|
+
Range` how close the player must be for the icon to show; `Interaction Range` how close for
|
|
26
|
+
the interaction prompt to show; `Interaction Angle` how close the screen centre / crosshair
|
|
27
|
+
must be to the icon for the prompt to show ("Smaller means closer"). `Workspot Position` and
|
|
28
|
+
`Workspot Orientation` control where and in what rotation an animation plays, and are
|
|
29
|
+
available only for interactions that play an animation at a specific position.
|
|
30
|
+
status: community
|
|
31
|
+
source: wiki.redmodding.org "Interaction Settings" (Native Interactions Framework), sections
|
|
32
|
+
"Editing Interactions", "Icon" and "Workspot Position"
|
|
33
|
+
tags:
|
|
34
|
+
- nif
|
|
35
|
+
- native-interactions-framework
|
|
36
|
+
- interaction-settings
|
|
37
|
+
- workspot
|
|
38
|
+
detail: "\"When using any positional controls, you can hold down 'Shift' to switch to precision
|
|
39
|
+
mode.\" For Workspot Orientation, \"Usually the green arrow points inwards\". Page title and
|
|
40
|
+
section names corrected 2026-09-07 (there is no \"Basic Interaction Configuration Fields\"
|
|
41
|
+
page and no \"Key Gotchas\" heading)."
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: world.loot-container
|
|
3
|
+
title: A lootable Arasaka weapon case — placement, drop table, and deploy safety
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.world.loot-container.cache-drops-weapon-directly
|
|
6
|
+
claim: A weapon mod's Arasaka cache loot table drops the weapon itself (Items.<ModWeapon>, quality
|
|
7
|
+
Quality.Random) directly, because the mod ships no crafting spec for a recipe to resolve
|
|
8
|
+
against.
|
|
9
|
+
status: contradicted
|
|
10
|
+
source: ModWright research
|
|
11
|
+
tags:
|
|
12
|
+
- world
|
|
13
|
+
- cache
|
|
14
|
+
- loot
|
|
15
|
+
- recipe
|
|
16
|
+
- retracted
|
|
17
|
+
detail: "This was true when written (2026-09-02) and is now stale: a full tiered crafting-spec layer
|
|
18
|
+
was added the next day. Superseded by cp2077.world.loot-container.cache-drops-tiered-recipe.
|
|
19
|
+
The mod's own cache notes were not edited to reflect this — a later entry in its plan says so
|
|
20
|
+
explicitly."
|
|
21
|
+
- id: cp2077.world.loot-container.cache-drops-tiered-recipe
|
|
22
|
+
claim: A weapon mod's Arasaka cache loot table (LootTables.<ModCacheLoot>) drops one of five tiered
|
|
23
|
+
crafting recipes (Items.Recipe_<Tier>_<ModWeapon>, Common through Legendary), each gated by a
|
|
24
|
+
LootPrereqs.CraftedIconicWeaponRecipePrereq_<Tier> level-band prerequisite so exactly one
|
|
25
|
+
resolves per player level — mirroring vanilla's own iconic-spec drop pattern — not a direct
|
|
26
|
+
weapon drop.
|
|
27
|
+
status: inferred
|
|
28
|
+
source: ModWright research
|
|
29
|
+
tags:
|
|
30
|
+
- world
|
|
31
|
+
- cache
|
|
32
|
+
- loot
|
|
33
|
+
- recipe
|
|
34
|
+
- tiered
|
|
35
|
+
supersedes: cp2077.world.loot-container.cache-drops-weapon-directly
|
|
36
|
+
detail: "The mod's own notes on the change: the comment in the loot table had said the mod ships no
|
|
37
|
+
crafting spec, which was now false. The rewrite added Items.$(tier)_<ModWeapon> crafting
|
|
38
|
+
results, an Items.Recipe_Preset_<ModWeapon> base and Items.Recipe_$(tier)_<ModWeapon>
|
|
39
|
+
instances (with hideOnItemsAdded so a crafted recipe disappears once used) — the same
|
|
40
|
+
crafting-spec pattern used by a ranged weapon mod and Silent Ashura, added one day after the
|
|
41
|
+
cache's initial build and drop-table design."
|
|
42
|
+
- id: cp2077.world.loot-container.vanilla-case-mesh-already-has-arasaka-livery
|
|
43
|
+
claim: The vanilla lootable_weapon_case_medium_neomilitary_a[_lid].mesh assets already carry four
|
|
44
|
+
material appearances — default, arasaka, militech, toolbox — including a complete Arasaka
|
|
45
|
+
livery (its own multilayered mlsetup plus xx_decals_arasaka_d01[_arasaka] decal materials),
|
|
46
|
+
but no vanilla .app exposes the arasaka appearance; a two-component .app selecting
|
|
47
|
+
meshAppearance = arasaka is the only custom asset needed to ship an Arasaka-branded lootable
|
|
48
|
+
case.
|
|
49
|
+
status: inferred
|
|
50
|
+
source: ModWright research
|
|
51
|
+
tags:
|
|
52
|
+
- world
|
|
53
|
+
- cache
|
|
54
|
+
- mesh
|
|
55
|
+
- appearance
|
|
56
|
+
- arasaka
|
|
57
|
+
- livery
|
|
58
|
+
detail: No mesh work and no textures were needed for this asset — a significant cost reduction
|
|
59
|
+
versus a from-scratch container.
|
|
60
|
+
- id: cp2077.world.loot-container.chip-container-too-small-for-blade
|
|
61
|
+
claim: arasaka_chip_container_a, the other genuinely Arasaka-branded container in the game, measures
|
|
62
|
+
0.14 x 0.04 x 0.11 m — a shard case, effectively invisible in the world and far too small to
|
|
63
|
+
plausibly hold a 1.28 m blade — and was rejected as the cache container in favor of the medium
|
|
64
|
+
weapon case.
|
|
65
|
+
status: inferred
|
|
66
|
+
source: ModWright research
|
|
67
|
+
tags:
|
|
68
|
+
- world
|
|
69
|
+
- cache
|
|
70
|
+
- mesh
|
|
71
|
+
- measurement
|
|
72
|
+
- rejected
|
|
73
|
+
detail: The chosen lootable_weapon_case_medium_neomilitary_a is 1.28 m long, matching the weapon.
|
|
74
|
+
- id: cp2077.world.loot-container.case-mesh-long-axis-is-local-x-not-forward
|
|
75
|
+
claim: For the medium lootable weapon case mesh, the body origin sits on the BASE (local Z spans
|
|
76
|
+
0.000..0.171) and the case's long axis is its local X (1.259 m) rather than local Y — even
|
|
77
|
+
though an entity's forward direction is local +Y. A case built straight from a captured player
|
|
78
|
+
transform therefore lies with its long side running ACROSS the captured facing, like a case
|
|
79
|
+
set down in front of the player, not end-on; a yawOffsetDeg of 90 rotates it to lie end-on
|
|
80
|
+
instead.
|
|
81
|
+
status: inferred
|
|
82
|
+
source: ModWright research
|
|
83
|
+
tags:
|
|
84
|
+
- world
|
|
85
|
+
- cache
|
|
86
|
+
- mesh
|
|
87
|
+
- orientation
|
|
88
|
+
- placement
|
|
89
|
+
detail: Measured directly off the mesh bounds, not guessed. The lid mesh's own bounds (Y out to
|
|
90
|
+
0.506, Z down to -0.046) are explicitly called out as NOT meaningful for placement — they are
|
|
91
|
+
in the lid's own hinge frame, positioned and animated by the .app component transform and the
|
|
92
|
+
TransformAnimator, and should be ignored when reasoning about the case's world footprint.
|
|
93
|
+
- id: cp2077.world.loot-container.transformanimator-kept-because-vanilla-meshes-unmodified
|
|
94
|
+
claim: "Also observed on a second mod, as the contrasting case to
|
|
95
|
+
cp2077.entities.transform-animator-open-anim (documented on a ranged weapon mod, which had to
|
|
96
|
+
strip its gameTransformAnimatorComponent because a custom, longer lid floated incorrectly in
|
|
97
|
+
the donor's open pose): a lootable Arasaka case KEEPS the TransformAnimator intact and its lid
|
|
98
|
+
opens correctly, because both of its case meshes are used completely unmodified from vanilla.
|
|
99
|
+
The animator only has to be removed when the geometry it swings has been altered."
|
|
100
|
+
status: inferred
|
|
101
|
+
source: ModWright research
|
|
102
|
+
tags:
|
|
103
|
+
- world
|
|
104
|
+
- cache
|
|
105
|
+
- transform-animator
|
|
106
|
+
- lid
|
|
107
|
+
- mesh
|
|
108
|
+
detail: Contrast case for the existing fact cp2077.entities.transform-animator-open-anim / the
|
|
109
|
+
process lesson about removing vs. keeping the animator — here the animator survives because
|
|
110
|
+
the geometry it swings was never altered.
|
|
111
|
+
- id: cp2077.world.loot-container.placement-captured-via-cet-console-oneliner
|
|
112
|
+
claim: A world-placement position + orientation can be captured directly in the exact JSON shape a
|
|
113
|
+
placement file expects, by standing at the target spot in game and pasting a short CET console
|
|
114
|
+
Lua one-liner that reads Game.GetPlayer():GetWorldPosition()/GetWorldOrientation() and
|
|
115
|
+
string.formats them as x/y/z/rotation{i,j,k,r} fields.
|
|
116
|
+
status: verified
|
|
117
|
+
source: ModWright field verification
|
|
118
|
+
tags:
|
|
119
|
+
- world
|
|
120
|
+
- cache
|
|
121
|
+
- placement
|
|
122
|
+
- cet
|
|
123
|
+
- console
|
|
124
|
+
- workflow
|
|
125
|
+
detail: The player's own transform is used AS the object's transform ("think of it as standing in
|
|
126
|
+
for the case"), which is why
|
|
127
|
+
cp2077.world.loot-container.case-mesh-long-axis-is-local-x-not-forward's yawOffsetDeg
|
|
128
|
+
correction is necessary — the player's forward is not the case's long axis. Re-siting is then
|
|
129
|
+
one edit to placement.json plus a script rerun, no second in-game trip needed unless the spot
|
|
130
|
+
itself was wrong.
|
|
131
|
+
- id: cp2077.world.loot-container.three-artifacts-must-deploy-together
|
|
132
|
+
claim: Deploying a world-placed lootable container requires three artifacts to move together — the
|
|
133
|
+
archive (holding the .app/.ent/sector/block), the archive's .xl manifest (holding the
|
|
134
|
+
`streaming:` block REGISTRATION), and the tweaks yaml (loot table + crafting specs); if the
|
|
135
|
+
archive is redeployed but the .xl is left at an older version, the container silently fails to
|
|
136
|
+
appear even though the archive itself contains everything needed.
|
|
137
|
+
status: verified
|
|
138
|
+
source: ModWright field verification
|
|
139
|
+
tags:
|
|
140
|
+
- world
|
|
141
|
+
- cache
|
|
142
|
+
- deploy
|
|
143
|
+
- archivexl
|
|
144
|
+
- manifest
|
|
145
|
+
- silent-failure
|
|
146
|
+
detail: "Named as an actual incident: \"This is exactly what went wrong on 2026-09-03: archive
|
|
147
|
+
packed, .xl left at its 08-19 version.\" The mod's deploy script now gates on this by grepping
|
|
148
|
+
the deployed .xl for a `streaming:` line and throwing if it is missing."
|
|
149
|
+
- id: cp2077.world.loot-container.deploy-verifies-with-md5-not-mtime
|
|
150
|
+
claim: A mod's archive deploy scripts verify a successful copy by comparing MD5 hashes of source and
|
|
151
|
+
destination (not file size or modification time), and only create a rollback backup of the
|
|
152
|
+
previously-live archive when its hash actually differs from the incoming one.
|
|
153
|
+
status: inferred
|
|
154
|
+
source: ModWright research
|
|
155
|
+
tags:
|
|
156
|
+
- world
|
|
157
|
+
- cache
|
|
158
|
+
- deploy
|
|
159
|
+
- md5
|
|
160
|
+
- rollback
|
|
161
|
+
- verification
|
|
162
|
+
detail: Rollback copies are hash-verified immediately after being written (throws "rollback copy
|
|
163
|
+
mismatch" if the backup itself doesn't match), and the final live-archive copy is
|
|
164
|
+
hash-compared against the staged source before the script reports success. Consistent with the
|
|
165
|
+
same hash-over-mtime discipline used in mesh deploy (see
|
|
166
|
+
cp2077.anims.method.identify-builds-by-anims-md5-never-mtime and
|
|
167
|
+
cp2077.anims.method.copy-live-archive-to-rollback-before-every-deploy).
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: world.sectors
|
|
3
|
+
title: Sector structure, streaming blocks, and world placement
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.sectors.entspawner-export-format
|
|
6
|
+
claim: entspawner export json is a recipe format, not a final sector; it reveals sector and
|
|
7
|
+
descriptor configuration (category, level, streaming fields, appearance names) that can be
|
|
8
|
+
used to build a correct hand-authored sector.
|
|
9
|
+
status: verified
|
|
10
|
+
verified_on: "2.31"
|
|
11
|
+
source: ModWright field verification
|
|
12
|
+
tags:
|
|
13
|
+
- entspawner
|
|
14
|
+
- export
|
|
15
|
+
- recipe
|
|
16
|
+
- sector
|
|
17
|
+
- reference
|
|
18
|
+
detail: "A vanilla suitcase was placed in game with entSpawner (worldBuilder v1.0.81, installed from
|
|
19
|
+
GitHub after the old install turned out to be a hollow Vortex skeleton) and project
|
|
20
|
+
\"malorian\" was exported to bin\\...\\mods\\entSpawner\\export\\malorian_exported.json. The
|
|
21
|
+
export gave category \"Exterior\" level 1, the full appearance name
|
|
22
|
+
suitcase_small_neomilitary_a, the placement (-835.758, 328.628, 7.884) and the streaming
|
|
23
|
+
values. It did not by itself fix the placement: what finally shipped was the sector GENERATED
|
|
24
|
+
by WolvenKit GUI's official entSpawner import script, with the loot instanceData injected into
|
|
25
|
+
it by a script; the hand-authored sector was abandoned."
|
|
26
|
+
- id: cp2077.sectors.sector-category-alwaysloaded
|
|
27
|
+
claim: A modded streaming sector and its streamingblock descriptor for a world placement use
|
|
28
|
+
category AlwaysLoaded at level 0.
|
|
29
|
+
status: contradicted
|
|
30
|
+
source: ModWright research
|
|
31
|
+
tags:
|
|
32
|
+
- sector
|
|
33
|
+
- descriptor
|
|
34
|
+
- category
|
|
35
|
+
- level
|
|
36
|
+
- always-loaded
|
|
37
|
+
- retracted
|
|
38
|
+
detail: "This was the hand-authored guess: the mod's sector build script started from a donor
|
|
39
|
+
descriptor selected by `category == \"AlwaysLoaded\"` and the early cache architecture is
|
|
40
|
+
described in its notes as \"one AlwaysLoaded descriptor\". The entSpawner export showed the
|
|
41
|
+
vanilla-tool value is Exterior/1. Superseded by cp2077.sectors.sector-category-level."
|
|
42
|
+
- id: cp2077.sectors.sector-category-level
|
|
43
|
+
claim: Sector descriptors have category and level fields; "Exterior" category with level 1 is
|
|
44
|
+
correct for outdoor world placements; always-loaded category with level 0 causes invisible
|
|
45
|
+
entities.
|
|
46
|
+
status: inferred
|
|
47
|
+
source: ModWright research
|
|
48
|
+
tags:
|
|
49
|
+
- sector
|
|
50
|
+
- descriptor
|
|
51
|
+
- category
|
|
52
|
+
- level
|
|
53
|
+
- exterior
|
|
54
|
+
- always-loaded
|
|
55
|
+
supersedes: cp2077.sectors.sector-category-alwaysloaded
|
|
56
|
+
detail: Early builds used AlwaysLoaded/0 and entities were invisible; the switch to Exterior/1 came
|
|
57
|
+
from the entSpawner export and ships in the working mod. Two candidate causes of the
|
|
58
|
+
invisibility (category/level and a wrong appearanceName) were changed at the same time, so
|
|
59
|
+
neither is proven to be the cause. The mod's notes call them "the likely invisibility causes".
|
|
60
|
+
- id: cp2077.sectors.streaming-block-json-structure
|
|
61
|
+
claim: A .streamingblock json file contains descriptor entries; each descriptor references a
|
|
62
|
+
.streamingsector file path and specifies load behavior (category, level, streaming fields).
|
|
63
|
+
status: inferred
|
|
64
|
+
source: ModWright research
|
|
65
|
+
tags:
|
|
66
|
+
- streaming-block
|
|
67
|
+
- json
|
|
68
|
+
- descriptor
|
|
69
|
+
- sector
|
|
70
|
+
detail: "The shipped block is malorian\\all.streamingblock, referencing
|
|
71
|
+
malorian\\sectors\\malorian.streamingsector, and it is registered in the mod's .archive.xl
|
|
72
|
+
under `streaming: blocks:`. The mod's older notes still name the abandoned hand-authored paths
|
|
73
|
+
mod\\<modname>\\<mod>.streamingblock and mod\\<modname>\\<mod>.streamingsector; the .xl
|
|
74
|
+
manifest is the ground truth."
|
|
75
|
+
- id: cp2077.sectors.streaming-sector-node-data
|
|
76
|
+
claim: A .streamingsector json file contains worldEntityNode entries with nodedata objects; each
|
|
77
|
+
nodedata specifies position, rotation, appearance, streaming distance, and interaction chunks.
|
|
78
|
+
status: inferred
|
|
79
|
+
source: ModWright research
|
|
80
|
+
tags:
|
|
81
|
+
- streaming-sector
|
|
82
|
+
- world-entity-node
|
|
83
|
+
- nodedata
|
|
84
|
+
detail: "The two halves are separate: `nodes[]` holds the worldEntityNode (entityTemplate,
|
|
85
|
+
appearanceName, instanceData with the loot chunk), while `nodeData[]` holds one transform
|
|
86
|
+
entry per node, matched by NodeIndex. A shipped cache sits at the old Malorian factory site on
|
|
87
|
+
the City Center NE waterfront, given as approximately (-836, 329)."
|
|
88
|
+
- id: cp2077.sectors.node-appearance-name-full
|
|
89
|
+
claim: Sector node appearanceName must be the full internal appearance name; using "default",
|
|
90
|
+
partial names, or typos produces invisible entities with no log error.
|
|
91
|
+
status: inferred
|
|
92
|
+
source: ModWright research
|
|
93
|
+
tags:
|
|
94
|
+
- node
|
|
95
|
+
- appearance-name
|
|
96
|
+
- appearance
|
|
97
|
+
- invisible
|
|
98
|
+
- silent-failure
|
|
99
|
+
detail: "The name must RESOLVE to an appearance that exists in the referenced entity: the vanilla
|
|
100
|
+
control node needs suitcase_small_neomilitary_a, while the custom node ships with
|
|
101
|
+
appearanceName \"default\" and works, because the custom case's .app defines an appearance
|
|
102
|
+
literally named \"default\". So the rule is \"the appearance's real name\", not \"never
|
|
103
|
+
default\"."
|
|
104
|
+
- id: cp2077.sectors.control-node-testing
|
|
105
|
+
claim: When diagnosing sector issues, place a vanilla entity node alongside the custom one as a
|
|
106
|
+
control; comparing render and loot outcomes isolates whether the bug is in the custom entity
|
|
107
|
+
or the sector structure.
|
|
108
|
+
status: verified
|
|
109
|
+
verified_on: "2.31"
|
|
110
|
+
source: ModWright field verification
|
|
111
|
+
tags:
|
|
112
|
+
- testing
|
|
113
|
+
- control
|
|
114
|
+
- diagnosis
|
|
115
|
+
- node
|
|
116
|
+
- sector
|
|
117
|
+
detail: "The technique was actually run in game: node 0 = the custom Malorian case, node 1 = an
|
|
118
|
+
untouched vanilla suitcase +1.5m in x, both carrying the same loot instanceData. What it
|
|
119
|
+
settled was that hand-authored sectors were a dead end — the experiment's \"Still
|
|
120
|
+
invisible/unlootable\" branch fired (conclusion: stop hand-authoring), and the placement was
|
|
121
|
+
redone through the official entSpawner import. It did not, as an earlier version of this fact
|
|
122
|
+
claimed, narrow the bug to the appearance chain."
|
|
123
|
+
- id: cp2077.sectors.custom-ent-vs-vanilla-control
|
|
124
|
+
claim: If custom entity is invisible while vanilla control renders, the bug is in the custom .ent
|
|
125
|
+
appearance chain or resource paths; if vanilla loots but custom doesn't, the bug is in
|
|
126
|
+
interaction chunks or physics.
|
|
127
|
+
status: unverified
|
|
128
|
+
source: ModWright research
|
|
129
|
+
tags:
|
|
130
|
+
- diagnosis
|
|
131
|
+
- entity
|
|
132
|
+
- loot
|
|
133
|
+
- appearance
|
|
134
|
+
- physics
|
|
135
|
+
detail: This is the decision tree written before the run, not a result. The branch that actually
|
|
136
|
+
fired was the third one — still invisible/unlootable — so neither inference in the claim was
|
|
137
|
+
exercised.
|
|
138
|
+
- id: cp2077.sectors.no-node-transforms-in-import
|
|
139
|
+
claim: When importing a sector or entity json, wolvenkit does not apply or read node transform
|
|
140
|
+
(position/rotation) data; transforms must be embedded in vertex positions during mesh export
|
|
141
|
+
(blender transform_apply).
|
|
142
|
+
status: unverified
|
|
143
|
+
source: ModWright research
|
|
144
|
+
tags:
|
|
145
|
+
- transform
|
|
146
|
+
- sector
|
|
147
|
+
- import
|
|
148
|
+
- node
|
|
149
|
+
- vertex
|
|
150
|
+
detail: "Treat with suspicion: the sector's own Position/Orientation/Pivot fields ARE the world
|
|
151
|
+
placement and are honoured (per the mod's sector build script, and moving the case is
|
|
152
|
+
described as editing X/Y/Z and rebuilding). The lesson is about GLB mesh import only."
|
|
153
|
+
- id: cp2077.sectors.streaming-field-values-from-export
|
|
154
|
+
claim: Streaming field values (MaxStreamingDistance, UkFloat1, Uk10, Uk11) should be taken directly
|
|
155
|
+
from entspawner export rather than guessed; exact values ensure proper load/unload behavior at
|
|
156
|
+
distance.
|
|
157
|
+
status: inferred
|
|
158
|
+
source: ModWright research
|
|
159
|
+
tags:
|
|
160
|
+
- streaming
|
|
161
|
+
- fields
|
|
162
|
+
- distance
|
|
163
|
+
- values
|
|
164
|
+
- export
|
|
165
|
+
- nodedata
|
|
166
|
+
detail: MaxStreamingDistance 120, UkFloat1 100, Uk10 1056, Uk11 512. These are nodeData fields, one
|
|
167
|
+
entry per node. The mod's notes are explicit that they "already matched" the hand-authored
|
|
168
|
+
values, so they were never a cause of the invisibility; the meaning of the Uk fields is
|
|
169
|
+
undocumented. The advice to copy rather than estimate is the author's, not a measured result.
|
|
170
|
+
- id: cp2077.sectors.sector-json-file-uniqueness
|
|
171
|
+
claim: All handleid and bufferid values in a sector json file must be unique across the entire file
|
|
172
|
+
(not just per node); a duplicate anywhere causes silent deserialization failure.
|
|
173
|
+
status: verified
|
|
174
|
+
source: ModWright field verification
|
|
175
|
+
tags:
|
|
176
|
+
- sector
|
|
177
|
+
- json
|
|
178
|
+
- uniqueness
|
|
179
|
+
- handleid
|
|
180
|
+
- bufferid
|
|
181
|
+
detail: The fields are spelled HandleId and BufferId in the CR2W json. The observed failure was a
|
|
182
|
+
duplicate BufferId "1" on the second node, which broke deserialization with "a useless generic
|
|
183
|
+
JsonException at the buffer's closing brace". The scripts step around it by assigning explicit
|
|
184
|
+
unique values (HandleId "980"/"500", BufferId "2"/"9"). The duplicate-HandleId half of the
|
|
185
|
+
rule is stated in the mod's notes but no failure from it is recorded. This is a WolvenKit
|
|
186
|
+
deserializer behaviour, not an engine observation.
|
|
187
|
+
- id: cp2077.sectors.instance-data-loot-field
|
|
188
|
+
claim: Sector node instanceData field carries loot configuration (loot-tables, loot-quality,
|
|
189
|
+
display-name); presence of instanceData is necessary but not sufficient for looting (also
|
|
190
|
+
requires LootContainerObjectAnimatedByTransform chunk in the entity itself).
|
|
191
|
+
status: verified
|
|
192
|
+
verified_on: "2.31"
|
|
193
|
+
source: ModWright field verification
|
|
194
|
+
tags:
|
|
195
|
+
- sector
|
|
196
|
+
- instance-data
|
|
197
|
+
- loot
|
|
198
|
+
- configuration
|
|
199
|
+
detail: Exact field names are lootTables, lootQuality, containerType and displayName inside the
|
|
200
|
+
instanceData buffer's LootContainerObjectAnimatedByTransform chunk. The shipped injection sets
|
|
201
|
+
lootTables [LootTables.<ModCacheLoot>], lootQuality Legendary and containerType
|
|
202
|
+
ClothingContainer on the sector node, while cache_case.ent carries its own lootTables,
|
|
203
|
+
contentAssignment, lootQuality and displayName LocKey#<Mod>-Cache-Name. Both layers ship in
|
|
204
|
+
the working case.
|
|
205
|
+
- id: cp2077.sectors.raycasting-vs-vertex-sampling
|
|
206
|
+
claim: When placing objects relative to mesh geometry (e.g., a plaque on a case lid), use
|
|
207
|
+
raycast-based placement rather than vertex sampling; vertex sampling fails on large flat
|
|
208
|
+
faces.
|
|
209
|
+
status: verified
|
|
210
|
+
source: ModWright field verification
|
|
211
|
+
tags:
|
|
212
|
+
- placement
|
|
213
|
+
- raycast
|
|
214
|
+
- vertex-sampling
|
|
215
|
+
- mesh
|
|
216
|
+
detail: A build script places an embossed plaque by raycast. The mod's notes call the
|
|
217
|
+
vertex-sampling failure a "recurring trap". This is a Blender-side authoring lesson, not an
|
|
218
|
+
in-game observation.
|
|
219
|
+
- id: cp2077.sectors.pivot-point-precision
|
|
220
|
+
claim: When rotating mesh geometry (e.g., closing a case lid via 180° Z-axis spin), the pivot point
|
|
221
|
+
must be at the exact rotation axis; a misplaced pivot produces visible gaps or misalignment.
|
|
222
|
+
status: verified
|
|
223
|
+
verified_on: "2.31"
|
|
224
|
+
source: ModWright field verification
|
|
225
|
+
tags:
|
|
226
|
+
- pivot
|
|
227
|
+
- rotation
|
|
228
|
+
- geometry
|
|
229
|
+
- alignment
|
|
230
|
+
- lid
|
|
231
|
+
detail: The vanilla gun-case meshes are authored OPEN and exterior-up, so closing the lid is a 180°
|
|
232
|
+
spin about Z plus a translate onto the bottom (an earlier X-axis fold put it exterior-down).
|
|
233
|
+
The lid animation shipped in v1.0.0, so the pivot is confirmed in game.
|