Imported from 0xFlan/operator-map-modding-guide (
skills/operator-unity-modding/SKILL.md). Install upstream withnpx skills add 0xFlan/operator-map-modding-guide --skill operator-unity-modding. Copyright stays with the author.
Operator Unity Modding
Use this skill for an OPERATOR map or visual mod where the result must behave and render like the shipped game, not merely compile or appear correct in an isolated Unity project.
Use OPERATOR: Modded Operations — Standalone Map Framework as the public framework name. Use OPERATOR: Modded Operations as the short name and MODDED OPS as the mission-laptop tab label. Keep Cerberus as the name of the shipped mission-laptop UI location.
Read references/operator-native-rendering.md before changing foliage, materials, lighting, terrain, or player spawns. For a project with a BIBLE or evidence log, read that file completely. Refer to the file as <PROJECT_EVIDENCE_LOG> in reusable output.
Read references/operator-mod-api-research.md before researching or changing a generalized OPERATOR mod API, standalone/additive content registration, Nexus package format, multiplayer content agreement, build adapter, diagnostics plugin, or Creator SDK contract.
Read references/operator-native-cerberus-ui.md before changing the OPERATOR mission-laptop/Cerberus tabs, operation lists, briefing pages, or shared laptop state.
Read references/operator-standalone-map-runtime.md before changing a standalone scene/package, map-specific BepInEx companion, portable material transport, runtime TerrainData, A* graph, AI/HVT grounding, map release layout, or Restart/KIA lifecycle claim.
Read references/operator-interactive-prefabs.md before importing, cloning, reconstructing, networking, or validating DoorV2, DoorHandleV2, FinalIK interaction objects, shootable door parts, or A* door links.
Read references/implementation-locators.md before citing standalone assembly names, source members, bundle names, scene identity, Ukrainian Forest runtime evidence, or reusable file-system paths.
Non-negotiable workflow
- Establish the actual game build, Unity editor version, mod path, authoring project, runtime source, and deployed files. Preserve unrelated user changes. For generalized API work, bind every build or deployment to an exact source-state manifest and exact game/dependency fingerprints; a Git commit alone is insufficient when an input repository is dirty, untracked, or unborn.
- Inspect the shipped equivalent before changing the mod. Record the native shader, material properties, textures, LOD representation, scene/runtime owner, and player-spawn code path. Do not generalize from names or a Unity preview.
- Author with complete native prefabs or complete native meshes plus their matching native material closure. Keep source scale, embed bases into the sampled terrain, and reject positions that violate the playable lane or spawn area.
- For every material, package the base-color, alpha, normal, mask, and authored property table. At runtime bind the exact installed shader family and recreate its native material state; never use a generic Standard/HDRP approximation as the final visual path. If an imported raw
.matisHidden/InternalErrorShader, do not callCopyPropertiesFromMaterialon it: use it as serialized evidence, retain proxy texture bindings, and explicitly rehydrate the live family profile.- Resolve
NATIVE_PROXY_*, library/template wrappers, andMOD_*names back to the original native material identity before selecting that profile. A proxy name must never decide whether a material is grass, leaf, bark, or a native special case.
- Resolve
- Treat foliage as a special case: validate alpha cutout, double-sided state, queue, material-type mask, shadow/depth passes, normal/map keywords, and native color values. Transparent image files alone do not make foliage transparent in HDRP.
- Treat spawn correction as a networked runtime behavior, not only a marker-placement task. For a standalone package, install only the current package scene's verified marker list after the framework reconstructs declared terrain and passes its walkable-ground contract, and before native player creation. An exact-map companion can add a diagnostic after its material, grounding, and A* work; it does not own generic terrain decoding or generic player registration. On the current exact build, team PVP is one-based: assign
SpawnPoint.Team=1to Team 1 markers andSpawnPoint.Team=2to Team 2 markers, and select them fromPlayerMaster.MyTeamIdentifier.TeamID. Do not infer a team fromToString()or retain a cached marker after the player's team changes. For a legacy retail-scene overlay, patch the selected spawn and move path and keep a bounded late-player safety repair that targets the actual local-player hierarchy and Smooth Sync ownership. If that legacy path loads a large bundle after OPERATOR reads template markers, prime the original markers and invisible support pads before bundle loading. Inspect the mode owner too: Standard PVP (PvpGameode) and FFA (FFA) can run first-round or respawn paths outsideGameManager.MovePlayerToSpawn. Audit exact installed signatures, then use an idempotent map-scoped handoff at the game scene callback and relevant game-mode spawn phases. - Build, run static layout/material validators, deploy only while the game is closed, and test a real operation. A forced-scene screenshot is diagnostic evidence only; it is not proof that a player spawns on ground or that gameplay rendering is correct.
- Do not say the mod is ready while a user-reported visual, collision, spawn, or asset problem remains unverified.
- Keep standalone ownership explicit: Core/catalog and OPERATOR: Modded Operations stay map-independent; the package directory stays data-only; Modded Operations owns generic manifest-declared runtime TerrainData reconstruction; an optional separately installed companion owns only exact-package/exact-scene material, grounding, lighting, navigation, interactive, and diagnostic work and tears it down on unload. Install data packages beneath
<OPERATOR_INSTALL>/OperatorMods, put BepInEx companions beneathBepInEx/plugins, and put MelonLoader companions beneathMods. Do not put a companion DLL insideOperatorModsor put map-specific shader/navigation logic in the framework. For manifest scene variants, onlySceneVariants.Count > 1opts in. A fresh Operation Room Confirm advances a persistent per-package-and-map shuffle bag; alive and KIA Restart retain the active scene. Single-scene maps bypass selector state, RNG, and logs. Validate a shared variant bundle against the exact declared union, and never move selection into a companion throughScenePathmutation or a Harmony validator patch. Gate authored variation separately from selection: compare every scene pair from actual transforms and connection evidence after removing names and canonicalizing translation, 90-degree rotation, and reflection. Reject exact unlabeled graph/spatial duplicates and require several independent layout differences; unique IDs, motif labels, or screenshots alone are insufficient. - Match the vanilla game-mode owner by operation mode. For standalone PVE,
a bare
GameModeis insufficient: the verified KIA path requires anInfiltrationManager-compatible component,InfiltrationManager.instance, and its synchronizedRaidTimer. Suppress unsafe official-scene-only callbacks, maintain only the bounded standalone state, and clear static ownership on unload/restart. Keep the shipped persistentGameManagerNetworkas the owner of Mission Failed UI and Restart Operation; never clone that UI into a map bundle/companion or load a donor mission to supply it. - Preserve native launch and AI ownership. At Confirm, capture the exact
player-owned
MissionLaptopandPlayerNetworkingbefore asynchronous package I/O. Keep the modal in a loading state, then close it and start the native operation in one final frame. For PVE, filter registered prefabs for rootBrainAI, rootNetworkIdentity, enabled weapon spawning, and a non-empty weapon list. Create bots throughRaidManager.ServerSpawnAI(false), not a one-argument manual network spawn. The current first Confirm path, reciprocal firearm behavior, native all-enemies-dead completion, extraction, and success return arePROVEN-RUNTIMEfor the pinned single-player Forest scope. Multiplayer replication remains a separate gate. For Standard PVE, require exactly one package-authoredPVE_ExfilZone_marker with a positiveBoxCollidertrigger. The map owns its transform and trigger geometry. The generic framework owns one scene-generationRaidManager, oneExfilZone, their native state, and the ATAK marker. Start withNetworkcanExtract=false; preserve the shippedRaidManager.UpdateAICountall-AI-dead transition; require physical entry into the unlocked trigger; preserve the shipped 15-second extraction timer andGameManagerNetwork.SuccessfulOperation; then unload only the operation generation and let the persistent Operation Room read the success result. Never unlock on spawn count, a framework-only kill count, or an observer shortcut. Never clearSuccessfulOperationduring success teardown. - Define navigation and AI markers from the authoritative playable physics
and bullet-interaction volume, never a larger render-only terrain/scenery
apron. The map/package owns marker coordinates; the exact-scene companion
rejects or quarantines out-of-bounds markers before grounding/nav lookup and
scans only the playable graph; OPERATOR: Modded Operations consumes the package's PVE
minEnemies/maxEnemieswithout map names or coordinates. For a fixed map-specific AI profile, use only the closed schema-v2pveAiProfileon PVE. Measure every accepted player-to-enemy gap. Keep the initial detection range below the intended start gap and one native wander radius below the intended encounter midpoint. PreserveBrainAI.WanderTimer * Patience; the current native method searches from the bot's current position after that delay. If a package needs a faster native response, use only the optional closed profile disposition and maximum-reaction-time cap. Apply disposition throughBotSpawnDetailsbefore the shipped spawn, and cap both native base and current reaction time once after spawn without raising a faster prefab value. Never mix AI donor teams: select one proven hostile native team cohort, exclude the live player team, and validate the shipped team/reference/target-pool closure. Do not patch damage or directly edit friendly/enemy/target lists. For indoor tactical encounters, validate every possible enemy marker against a clear standing capsule, the playable graph, a plausible ingress-facing direction, and a nearby non-trigger collider under an audited native cover asset; repeat the contract after runtime marker snap. Prove movement and cover with the nativeBrainAI.agent.Agent.position(FollowerEntity.position),_currentCover, state, target, and actor rotation rather than marker names. Treat foliage sight as map content: research the same installed vanilla prefab andEyesAImask, then activate only authored sight-collider children with exact layer, trigger, count, collision-matrix, and bullet-mask evidence. Never make the generic framework synthesize map-specific sight geometry or change PVP. Require one enabledPathfinding.RVO.RVOSimulatorwith the map-scopedAstarPath. Measure BOT V2 displacement throughBrainAI.agent.Agent.position, not the stationary rootBrainAI.transform.position. - Treat normal
DoorV2objects as authored map/building prefab content. Import an authorized complete source prefab with its original.metaand all dependencies, preserve its pivot, physics sync, paired handles, FinalIK objects, damage parts, navigation cut, and both A* links, and let normal scene and Mirror lifecycle initialize it. Some AssetRipper exports lose custom fields; reject those damaged exports. When complete authorized dependencies are unavailable and the user explicitly requests exact-build recovery, follow the fail-closed experimental reconstruction procedure in the interactive-prefab reference; do not promote or generalize it until the complete live matrix passes. Preserve serialized dead fields unless the game developer migrates the existing prefab data. Validate clearance against the instantiated socket/aperture transform, not only the design-plan boundary. If endpoint geometry can differ, test both the raw endpoint and measured socket centre; do not apply the door-owner's tangent offset blindly to an opposite open-corridor endpoint or confuse the aperture offset with the door-leaf hinge pivot. Runtemplates/Editor/ValidateDoorV2Prefab.csbefore the map build. Its serialized graph checks are necessary but not sufficient: A* endpoint attachment, interaction, damage, replication, late join, restart, and unload still require the live door matrix. - Treat standalone player-spawn and time-code settings as reversible
process-global state. Capture and conditionally restore the previous
SpawnPointsInScene,Pspawns,PnextSpawnIndex, NVG colour, and runtime Volume ownership on unload and restart. Initialize the standalone spawn index to zero on the current pinned build. Route an owned player throughPlayerMaster.SpawnPlayer()so the shippedClientSpawnBSowner setup runs on request 1. If a repeat-generation owned host still has no newPlayerSpawnedObjectafter 300 frames, use the exact generated server body as a bounded recovery; use it on request 1 only for an unowned server player. Record attempts before native calls, cap them per player/generation, and retain a completed-player set. Register each run-time PVE/PVP game-mode template on every peer with a deterministic, collision-checked nonzero Mirror asset ID before host spawn; validate and adopt the expected clone on remote peers and unregister on release. For a ClassInjector-createdNetworkBehavioursubtype, verify the native constructor baseline before registration and spawn. On the pinned build, theIntPtrwrapper can leavesyncObjects=null; initialize only that missing field to Mirror's exact empty IL2CPP list baseline, hard-gate every root behaviour, permit one recorded native spawn attempt, and unspawn then unregister then destroy. Never retry a partially entered spawn, restore a null list, or clear global Mirror spawners. If a map companion holds a local player transform during initial grounding, publish its ready/applied state only after the exact currentTerrainandTerrainCollidershare oneTerrainData. Clear the held transform/controller, safety frames, counters, applied flag, destination scene, and local-move flag on scene unload before armory return. - Keep package mission presentation explicit. The closed manifest owns row
and briefing text, time choices, infiltration records, and the map-level
preview path. Keep the raw preview outside Unity bundles, verify its
length/hash, and use the same decoded sprite for preparation, fullscreen,
and infiltration-selector views. Schema version 1 has no unrestricted
per-user image override: changing the image requires a new author-built
package version with updated
files[]bytes/hash and content identity. Normalized infiltration anchors place 2D UI markers; the selected scene spawn set places players in 3D. Put reusable/address-loaded Unity assets in dependency bundles and put the exact.unityscene in the scene bundle. - For Standard PVP on the current pinned build, create a
PvpGameode-derived owner, not a plainGameMode. Assign separate non-empty Team 1 and Team 2SpawnPointlists. SeedMaxRounds=13,RoundsToWin=7, andRoundTime=120. Call the shippedPvpGameode.OnStartClientandServer_AllPlayersLoadedbodies. Supply two audio sources, all 16 non-empty clip arrays with retail lengths,TeleType, timer/score text, six result roots, two animators, exact fade strings, and win/lose/tie text. Keep shipped respawn, freeze, death, score, round, and end-operation methods. Stop generic repeated movement after native PVP activates. ClearPvpGameode.instanceduring teardown only when the operation still owns it. Require a host and remote client test. Before the native scene transition, require the protocol-v6 PVP or PVE peer agreement. It binds the exact selected-loader suite receipt and sidecar, game/build capabilities, complete package identity, loader-neutral runtime pair, and host-confirmed PVE count. A declared companion must publish its exact-scene ready marker only after its strict world gate; its failure marker wins before and after readiness. Do not send scene-ready early. Bind every initial load and retained-content Restart to a host-issued, nonzero monotonic scene-generation epoch and a strictly newer remote local scene generation. Reject stale/future acknowledgements, connection-object replacement, membership changes, missing identities, and bounded timeout; never reuse unversioned readiness from the prior scene. Discover PVE and PVP markers separately and require at leastceil(maxPlayers/2)markers per PVP team; the pinned retail ceiling of 12 therefore requires six per side. The current agreement intentionally rejects late join. Never promote either mode from static/build evidence alone. Test separate host and remote processes. PVP requires reciprocal firearm hits, movement, death/score/round respawn, restart epochs, natural return, abort, and exact teardown. PVE separately requires the host count, identical authoritative AI netIds/poses/movement/health on every peer, reciprocal combat, completion, extraction, Restart on both peers, and exact teardown. Expose an enemy-count control only on the private modded-PVE operation clone; do not mutate Tier 1, shipped operation arrays, vanilla enemy ranges, or PVP. - Make every post-readiness
Updatepath bounded. Perform the exact full-scene marker/spawn/companion scan once, cache the accepted generation-owned object, and then validate that cached object's liveness, active state, scene handle, and exact name in O(1). Cadence diagnostics and registry snapshots; do not runResources.FindObjectsOfTypeAll, enumerate all scene roots/transforms, or allocate LINQ arrays every rendered frame. Place an owner-local player once per player/scene-generation assignment, record the acknowledgement, and retire the placement path. Never use periodic spawn correction after gameplay readiness and never write a remote player's transform. Keep every companion dormant outside its exact owned scene. Read renderer state throughsharedMaterial; Unity's instance-material accessor clones native material state even when the caller only intends to inspect it. Measure an exact sustained gameplay window and gate both frame time and memory growth; do not diagnose a leak from one absolute process value without a same-build baseline or start-to-peak growth record. - Keep verified dependency-bundle ownership in the generic framework. A
companion must not call
AssetBundle.GetAllLoadedAssetBundles()as an ownership lookup and must not load a second copy of a large bundle. A map-scoped borrower API can return an exact asset, but require a live probe for the concrete asset type before a release depends on it. Modded Operations0.3.17plus Forest0.4.12returned null for all three raw pineTextAssetrequests. Forest0.4.19instead resolves the exact resident compiled shaders and binds portable proxy textures to the real shader property names. Treat the generic borrower asPROVEN-STATIC, notSUPPORTED, until the concrete requested type passes live. Only the framework unloads its bundles. Bound a multi-map framework cache at a proven Operation Room boundary: retain the active/restart map and any in-flight selected-map prefetch; after fresh launch transfers ownership, evict prior distinct maps withUnload(false). The Operation Room remains Unity's active scene underneath an additive package scene, so also require a zero active package-scene handle and compare every candidate scene bundle's declared paths with all loaded scenes. Never unload a bundle referenced by a loaded scene or same-map Restart. Runtime QA must prove the exact framework-owned current-map cache entry and its non-null dependency and scene bundle handles. TreatAssetBundle.GetAllLoadedAssetBundles()only as a process diagnostic; a zero result is not ownership evidence and must not override the framework's verified cache. - For
SeedMesh_Tree_Bark, audit the installed shader property table. The current Forest bark slots use_MainTex,Normal_vegetation,mask_vegetation,Vector1_DDCDCAD2,Vector1_16F2F1E4,Vector1_813F3AD6,_Wetness_sm,_Vertex_AO_sm, and_cutoff. Generic_Smoothnessor_BaseColorwrites do not prove this shader. - Select lighting from a comparable vanilla biome and copy its complete
light plus active Volume contract. The current Forest day reference is
sharedassets11.assetsPVP Woods Warehouse: 30,000 lux, 5,500 K, bounce 5, bloom.03, and lens-flare intensity.5. The rejected bright PVP donor used 52,241.375 lux, bloom.359, and lens flare1. Make one component the process-global render owner. In the version-pinned accepted Forest0.3.22runtime evidence, the package selectsnative-outdoor-v1, Modded Operations applies and restores the sun/Volume/NVG transaction, the package owns the verified LUT, and the map companion does not install a second global Volume. Revalidate this owner on a newer framework. At 02:00, require white phosphor across all tubes and visible world detail outside the brighter ECOTI channel. - At the exact additive-scene boundary, call the shipped
GameManagerNetwork.ShowLoadingScreen()before terrain or material preparation. On the supported build, the method is at RVA0x00916210and the native hide method is at RVA0x0090E950. VerifyLoadingScreen.activeSelfandactiveInHierarchy; theLoadingScreenVisiblegetter returns_hideLoadingScreenSoonand is not the canvas-state probe. LetGameManagerNetworkown the hide transition. - For a public mod repository, publish the complete authored source and a
hash-pinned decompiler snapshot of each final mod DLL. Record the DLL
version, bytes, SHA-256, and decompiler version. Represent each omitted
authorized or large asset with an explicit bracketed record such as
[PREFAB ASSET],[PREVIEW IMAGE],[TEXTURE SET], or[SCENE ASSETBUNDLE]; include its expected path, type, address, source evidence, and validation gate. Never use placeholder bytes at a filename declared by a release manifest. Do not describe generated IL2CPP interop wrappers as original game source.
Native-art decision rules
- Use the game's own textures and materials. Generated art can supplement only when the user explicitly permits it and it is compatible with the native shader contract.
- For indoor furniture, prove ordered renderer material slots, shader identity, the export-axis conversion, local front/back markers, and the complete active renderer/collider child subtree from the installed donor. Never flatten a furniture assembly or infer its facing from its imported bounds.
- If a visible child or assembly dependency cannot be transported exactly, exclude that furniture family fail-closed. A correctly named mesh with a plausible texture is not a native-prefab proof.
- Use highest authored LOD for every directly placed object. Do not make a low LOD the "high quality" version. A deliberate LOD0-only root is acceptable, but every placement/repair utility must treat its MeshFilter/MeshRenderer hierarchy as occupied even without an LODGroup.
- A tree is not accepted from structural closure alone. Require a complete crown silhouette through the normal player camera at close, middle, and far distances; reject a family that reads as bare trunks even when its mesh, submesh, and material counts are technically valid.
- Ground a combined crown-and-trunk tree from its actual highest-detail
bark/trunk submesh vertices after final position, yaw, scale, and one
batched
Physics.SyncTransforms(). Do not use a pivot, the whole-renderer minimum, or a generic collider bottom. Identify bark/trunk slots and define a visual-QA-proven per-family reference. Ukrainian Forest uses renderer-free childNATIVE_TRUNK_GROUND_DATUM_ONE_SIXTH: pines use one sixth of the full LOD0 trunk at the center sample; broad oaks use the oriented main stem, a0.25 membed, and the lowest contact in a bounded0.60 mto2.00 mlower-root footprint. Store the selected contact X/Z in the datum. Require at least0.75of the complete rendered tree above terrain, reject an absolute correction above12 m, and sample the datum position at run time. - A one-sided/open mesh is not a boulder. Require a complete closed (or bottom-only-open) native LOD0 mesh, matching material, collider, and multi-angle QA.
- Treat biome clusters as complete compositions. Require multiple grounded high-detail plants plus appropriately feathered understory/stone/ground elements, then inspect internal spacing and crown overlap from inside and outside the cluster. A single tree is not a biome package, and a scene-wide count does not excuse implausibly condensed knots or empty spawn/center areas.
- Give every lived-in prop an environmental owner. Keep loose ammunition and supplies organized near positions that use them; keep garbage, pallets, barrels, food, and shelter debris attached to trenches, camps, walls, wrecks, or deliberate tree shelters. Reject isolated open-field clutter, unsupported upright pallets, repeated-prop intersections, and low local density hidden by a high global count.
- For a native ragdoll-derived fixture, accept the natural death pose first, preserve its skeleton/root rotation exactly, and apply only a measured vertical contact correction. Renderer bounds and logged terrain gaps are diagnostics, not acceptance: require the visible skinned mesh to contact or sit slightly inside the final surface in low-angle player-camera views.
- Keep fire, smoke, atmospheric fog, and ground scorch as separate visual contracts. Fire remains source-local and emissive; smoke rises, expands, rolls coherently, and fades into fog; scorch conforms to the ground with no halo, hard edge, clipping, flicker, or through-fog visibility. Reject obvious independent puff tiles or billboard squares even when particle/material counts pass.
- Before replacing a legacy smoke system with VFX Graph, fingerprint the retail VFX/HDRP runtime and prove one exact-version bundle spike. Evaluate six-way-lit baked smoke, curl-noise turbulence, drag, soft particles, camera fade, motion-blended flipbooks, sorting, and fog integration. Treat this as an experimental candidate until player-camera and performance gates pass; never promote the workflow solely from editor or documentation evidence.
- For slope-bound cover, measure the full collider/mesh footprint. Reposition or remove a sandbag wall when its sampled terrain span exceeds the allowed contact tolerance; do not hide a floating wall with a vertical offset.
- Avoid perfect rows. Use a deterministic but nonuniform layout with varied lateral position, longitudinal spacing, rotation, and compatible ground embedding; preserve deliberate lanes and spawn clearances.
- For outdoor ground, inspect the shipped Terrain component chain before treating direct MeshRenderers as equivalent. A Terrain with
TerrainBRGRegistereranddrawTreesAndFoliage=Falseis a BRG/detail-data path; stage any custom detail injection behind a private flag, preserve a direct-native fallback, and do not claim parity or foliage interaction before a player-camera test. - Establish the target scene's lighting owner before changing a sun or HDRP Volume. Use
VectorTimeOfDay.singleton->SetTimeOfDay(float)->SunLight/SunDataonly when that live SunLight belongs to the target scene. Otherwise retain the target map's staticNice Sunroot and apply only fields verified from a matching shipped static scene; preserve its HDRP, lens-flare, on-demand-shadow, and directional-resolution components, then refresh its shadow contract after changing it.SunSettings,Mirror_DayNight, or weather fields are not ownership proof by themselves. - Inspect a matching shipped HDRP Volume and
HDAdditionalLightDatabefore recreating exposure, tone mapping, bloom, or light units. Do not copy a weather effect (for example, a desert dust volume) into an unrelated biome, and do not call a profile from another map an exact match unless its live overrides were recorded. Preserve the selected native light, assignRenderSettings.sun, remove/disable competing mod/template directional lights, and never add a directional fill beside it. Create one explicitly logged fallback only when no verified target-scene sun exists, then validate source ownership and a live one-shadow-direction result. - Mount overhead light meshes from the roof's interior underside. Sample the full fixture renderer footprint and query upward from below when roof thickness or one-sided colliders make a downward top-face hit ambiguous; restore any temporary global backface-query state. Gate the live fixture-top-to-underside gap and inspect a normal player-camera upward view before calling the fixture visible or correctly mounted.
- When a shipped HDRP
Volume.sharedProfileusesTonemappingMode.External, resolve the profile PPtr and itsTexture3DLUT from the installed asset data. Package the exact raw LUT as a linear, one-mip half-float Texture3D; load it through the native IL2CPP AssetBundle path; validate its dimensions/format in the emitted bundle; and use an explicitly logged safe fallback if it cannot load. Only describe the full Volume as exact after every applied override is directly decoded or live-audited. - Treat red-dot and laser appearance as a rendering-stack question before changing optic materials: compare the live HDRP exposure/tonemap/bloom/camera contract at matched settings first.
- For the pinned OPERATOR holographic/reflex path, inspect the live shader before
writing a generic HDRP emissive property.
HWSReticleBrightnessusingUltimate Scope Shaders/HolographicSightapplies the selectedreticleSettings[CurrentBrightnessSetting]through_Reticle_Brightness; preserve the optic-specific_Reticle_Colorand the shipped UpArrow/DownArrowSetReticleSettingpath._EmissiveIntensityis absent on this shader and a guarded write to it is a no-op. Its exact size float is misspelled_Retical_Size; larger values enlarge the centred sample while tiling/offset and aim centre stay fixed. Prove the matched indoor exposure/Bloom stack first. If the user then requests a correction, treat normal/NVG renderers independently, scale brightness arrays only from exact snapshots, clone/deduplicate eligible size materials by renderer identity, and restore original arrays/material references on weapon change, restart, unload, or failure. The pinned accepted CompM4 proof used normal/NVG brightness 2.0x/1.0x and normal/NVG size 13.5/16.5; these are exact-build project evidence, not universal optic defaults. - Preserve weapon-local flashlight and laser graphs during indoor isolation.
Audit the equipped
WeaponV3.FlashlightsandWeaponV3.Lasersselections, their active hierarchy, exactHDAdditionalLightData, layers, and native materials. On the pinned PEQ visible-laser branch, the active layer-0 Light is the visible-dot emitter while the HDRP/Unlit line renderer remains disabled; preserve that enabled state. Apply any requested indoor boost once from captured native baselines, deduplicate controller-owned Lights, and exclude layer-16/IRonlyobjects. Restore original values/materials before clearing ownership sets. The pinned accepted kill-house proof used 6x for the visible flashlight/light emitter and 4x for an owned visible-beam material; treat those as project-specific. Prove the visible flashlight branch after cycling past IR illuminators rather than treating any active flashlight-list entry as a visible white light.
Evidence and self-improvement loop
After each failed test, add a short entry to the project's BIBLE with:
- observed symptom and test context;
- confirmed root cause versus rejected hypotheses;
- exact changed file/property/method;
- validation result and remaining uncertainty.
Promote a finding into this skill's reference only after it is reproducible from shipped data or a successful runtime test. Never turn an untested workaround into a reusable rule. When game updates change shaders, scene structures, or generated interop, repeat the inspection and revise the reference rather than trusting historical values.
Required verification matrix
| Area | Minimum evidence |
|---|---|
| Foliage | Native-map material audit + native-map capture where possible + custom-map close/mid/far crown-silhouette capture + no opaque atlas cards or visually bare tree family |
| Props/rocks | Matching native mesh/material closure + multi-angle complete-shape check + collider/grounding check |
| Terrain | Dimensions, collision/raycast, texture mips, normal maps, and seamless blend validation |
| Spawn | Real operation, local player transform at a terrain point, no late snap/fall, respawn tested |
| LOD | Runtime audit that all direct objects use authored LOD0/highest detail and no quality system silently substitutes a proxy |
| HDRP environment | Shipped scene Volume + light-unit audit, custom map profile audit, and player-side visual check; do not trust an arbitrary offscreen BRG camera |
| Standalone ownership | Exact package/map/scene gating + generic-adapter map-name isolation + companion refusal outside its scene + clean teardown |
| Runtime navigation | Exact playable physics/bullet bounds + pre-nav marker containment + one resident playable-only scanned graph + tight ground and IsPointOnNavmesh proof for every enemy/HVT/mission marker before and after restart |
| Interactive doors | Complete reference graph + hinge-axis pivot + two-sided FinalIK interaction + latch/hinge damage + native A* open/breach traversal + host/client/late-join/restart teardown |
| Mission UI/lifecycle | One physical first Confirm without a second laptop interaction + tab/Back/Cancel/selector flow + exact scene + PVE/PVP isolation + reciprocal firearm damage + normal Restart; for Standard PVE, exactly one package-authored extraction trigger + initial lock + shipped all-AI-dead unlock + native ATAK marker + physical 15-second extraction + shipped Mission Successful return; separately prove native lethal damage -> shipped Mission Failed popup -> shipped Restart control -> fresh playable exact scene, with the mode singleton/timer reset |
| Public repository | Complete authored source + final-DLL decompiler snapshot + DLL/tool hashes and versions + exact placeholders for all omitted payloads + zero private machine paths |
| Deployment | Source/deployed hashes match while OPERATOR was closed |
Safe execution
- Never overwrite a user's authoring scene or unrelated project files.
- Do not deploy while OPERATOR is running.
- Treat OperatorModAPI as a local in-process extension framework, not an authentication, sandbox, anti-cheat, or hostile-code security boundary. Prioritize bounded work, deterministic teardown, exact compatibility refusal, actionable diagnostics, and containment of ordinary mod failures.
- Keep reverse engineering read-only and fingerprint-pinned. Do not execute analyzed code, attach invasive tooling to a user's game, or redistribute DLLs copied from the installed game.
- A QA game instance launched by the agent may be closed only after its executable path, PID, and start time are verified. Use a graceful close first; never force-close a user's game.
- Keep private QA switches environment-gated and out of normal release behavior.
- Remove every private force-scene, capture, material-audit, and auto-launch flag after QA. A normal session must not load a source map, start an operation, disable player cameras, or retain invisible diagnostic support.
- Accept only QA screenshots/logs created after the recorded run start and by the captured process identity. Do not move or hash a pre-existing familiar filename into a new run as if it were current visual evidence.
- Use tokens such as
<OPERATOR_INSTALL>,<AUTHOR_WORKSPACE>,<PROJECT_EVIDENCE_LOG>, and<USER_PROFILE>in reusable documentation. Do not publish a private drive path or an operating-system account name.