agentleFS
willy92winswilly92wins/DayZ-Modding-Knowledge-Pack/skills/dayz-underground/SKILL.md

dayz-underground

Skill20 starsChanged 42 days agoMITView on GitHub

Use when: terrain holes, terrain hole, SurfaceIsHole, CfgWorlds Holes, tiles[], holes.cfg, hole in the terrain, agujero o hueco en el terreno, underground area, zona subterránea, bunker, búnker, tunnel, túnel, trench, trinchera, cave, irrigation tunnel, cfgundergroundtriggers.json, UndergroundTrigger, breadcrumbs, EyeAccommodation, EUndergroundPresence, INPUT_UDT_UNDERGROUND_SYNC, underground trigger editor, disallowedTypesInUnderground, bunker broadcast, cfgbunkerbroadcast.json, Buldozer MarkUnderground or CopyTileCoord. DayZ 1.30 Exp (1.30.164014). Not construction parts, rebuilding or code locks: dayz-basebuilding. Not the bunker-broadcast storage file: dayz-persistence. Not sandstorm or heat: dayz-environment-hazards.

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    No vanilla 1.30 script calls it.

    line 94
  2. Very specific:

    Config-only mod: Add a custom group in CfgWorlds >> ChernarusPlus >> Holes and repeat the check on its cell.

    line 222
  3. Distinctive:

    Mod geometry: Place an object with Object Spawner under that hole and verify that it is visible from inside and outside, and that it …

    line 224

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

DayZ Underground (1.30 Exp)

Underground areas in DayZ 1.30 Experimental (build 1.30.164014): the hole in the terrain (terrain holes, new in 1.30), the underground triggers that darken and change the environment, the player's "underground" state, and what Badlands builds on top (radio-announced bunkers, irrigation tunnel entrance).

Citations exp\scripts\scripts\… are from dta\scripts.pbo of 1.30.164014, compared with 1.29. Everything marked source_verified was opened in those files. Nothing in this skill has been tested in game yet: §Verification Status states the level of each claim and §Before designing with holes, how to raise it.

The model: three pieces

PieceWhat it isWhere definedWho uses it
Holeheightmap cells without terrainCfgWorlds >> <world> >> Holes (map config)the engine, upon loading the world
Geometrytunnel or bunker placed below the surface.wrp (Terrain Builder), Object Spawner or scriptthe engine
Triggersboxes that darken, alter sound, and flag "underground"cfgundergroundtriggers.jsonthe server creates them, the client applies the effects

The hole only removes terrain: it does not create any space. What happens if something falls through a hole without geometry underneath is not measured; design as if there were no ground. Without triggers, it does not darken inside.

Terrain holes

Formato

Among readable vanilla maps in 1.30.164014, only Livonia has holes (Chernarus does not; Sakhal is encrypted): seven cells in two groups, next to the two entrances of the Dambog bunker. The 1.29 config of the same map does not have them.

// [EXACT][CLAIM-UG-HOLES-SCHEMA-130] Addons\worlds_enoch.pbo > config.bin > CfgWorlds > Enoch (1.30.164014, pasado a texto con CfgConvert)
class Holes
{
	class Dambog            // one group = one subclass; the name is arbitrary
	{
		tiles[]=
		{
			{118,195},{118,196},{118,197},
			{94,180},{95,180},{94,181},{95,181}
		};
	};
};
  • Each entry in tiles[] is {x, z}: heightmap cell indices, not meters.
  • The engine validates the range: code reading tiles uses the messages x (%d) out of range <0, %d) and y (%d) … (strings from DayZDiag_x64.exe 1.30; details in references/terrain-holes-evidence.md).
  • Each group is a subclass, so a mod could add its own without overriding Bohemia's. Unverified: that a mod config patch on CfgWorlds >> ChernarusPlus opens holes is the first hypothesis that must be measured.

Unit: heightmap cell

In Livonia the grid is 2048 cells of 6.25 m (12,800 m). With that size, both groups fall over the vanilla underground triggers of Dambog; with 5 m or 10 m neither falls within range (calculations in the reference):

  • {118, 195–197} → X 737.5–743.75, Z 1218.75–1237.5: main entrance.
  • {94–95, 180–181} → 12.5 m square at X 587.5–600, Z 1125–1137.5: second entrance.

It is cross_checked by that fit: the cell size was not read in the header of the .wrp (OPRW v32) and the other maps are not measured. Always calculate celda = floor(coordenada / tamaño_de_celda) with the size of your terrain.

Script API

// [EXACT][CLAIM-UG-SURFACEISHOLE-130] exp\scripts\scripts\3_Game\Global\Game.c:1203-1204
//! Returns whether tile at provided world coordinates is a hole.
proto native bool		SurfaceIsHole(float x, float z);
  • It is the only new holes API and is read-only: there is no way to open or close holes from script at runtime.
  • No vanilla 1.30 script calls it.
  • Useful to avoid placing anything where there is no terrain: custom loot, spawn points, custom holograms.

Where data lives

  • enoch.wrp and chernarusplus.wrp go from OPRW v29 to v32 in 1.30 and both grow by 5%; Chernarus has no Holes. That change is format-related, not hole-related: holes reside in the world config (cross_checked).
  • exp\scripts\scripts\4_World\Classes\Hologram.c is identical in 1.29 and 1.30: no kit placement check is aware of holes.

Authoring workflow

  • Buldozer 1.30 brings four new inputs: UABuldLinkCamToTerrain, UABuldCopyTileCoord, UABuldMarkUnderground, and UABuldRemoveUnderground (exp\bin\bin\constants.xml:282-285, cited in enforce-script-reference; the last two also appear in DayZDiag_x64.exe 1.30).
  • Changelog 1.30, Terrain Builder section: the Buldozer camera can be unlinked from terrain height to edit below the surface (key 8 by default), and each object has an "underground" flag preventing a static object below terrain from being hidden by occlusion when it should be visible.
  • That flag belongs to Terrain Builder. There is no script equivalent for objects created by Object Spawner or CreateObject, and whether those objects are occluded under terrain is unmeasured.
  • A stable DayZ Tools from April 2026 contains no hole strings or flag strings (measured 2026-09-24): a later Terrain Builder is required.
  • Third-party tool: Flynn's Terrain Tools (FTT, released 2026-09-19).
    • Marks cells and writes holes.cfg next to layers.cfg, where according to its guide Terrain Builder and Buldozer read it.
    • Adds the #include to the terrain's config.cpp.
    • Buldozer re-reads it on each alt-tab.
    • Matches the \holes.cfg string that the engine uses in its world-loading function, but the exact path and reload behavior are not verified here.

Underground triggers

  • File: $mission:cfgundergroundtriggers.json; if not present, dz/worlds/<mundo>/ce/cfgundergroundtriggers.json (exp\scripts\scripts\3_Game\UndergroundAreaLoader.c:105-125).
  • Server creates boxes (UndergroundTriggerCarrier) on mission startup (5_Mission\mission\missionServer.c:91) and sends the entire JSON to each client upon connecting (UndergroundAreaLoader.c:174-177; missionServer.c:342,363). A custom mission JSON works without the client having the file.
  • Trigger type (4_World\Entities\ScriptedEntities\Triggers\UndergroundTrigger.c:97-116):
    • with Breadcrumbs it is TRANSITIONING (maximum 32);
    • without them, EyeAccommodation == 1.0 yields OUTER;
    • any other value yields INNER.
  • [EXACT][CLAIM-UG-TRIGGER-LIMIT-130] Cap of 4096 triggers per JSON: m_TriggerIndex is synchronized in -1..4095 (UndergroundTrigger.c:10); in 1.29 it was -1..255.
  • Triggers bound to an object (CustomSpawn): via ParentNetworkId for map objects, or via Tag.
    • Vanilla pattern for a structure placed by Object Spawner: its spawner entry contains "customString": "undergroundTriggerTag=TAG".
    • The class, in OnSpawnByObjectSpawner, creates triggers whose Tag matches (4_World\Entities\Building\Underground\Land_WarheadStorage_Bunker_Facility.c:62-94; 3_Game\ObjectSpawner.c:63,107).
    • That logic lives in Sakhal classes, not in a common base: a mod class must implement it.
  • In-game editor, new in 1.30: LCTRL+/, only in DayZDiag and in local game.
    • Double-click creates a trigger; edits boxes and breadcrumbs.
    • Exports to $mission:cfgundergroundtriggers.json and leaves a backup copy …json.backup-<date>.
    • Citations: 4_World\Plugins\PluginBase\PluginUndergroundTriggerManager.c:1,360,821,922; PluginKeyBinding.c:55. More details in dayz-mod-workflow.
  • Full JSON schema and trigger recipe with Tag: references/underground-triggers.md.

Presencia bajo tierra

  • EUndergroundPresence: NONE, OUTER, TRANSITIONING, FULL (4_World\Classes\UndergroundHandlerClient.c:1-7). Calculated by the client based on the trigger it is in (:470-475).
  • [EXACT][CLAIM-UG-PRESENCE-SYNC-130] In 1.30 the client sends it to the server.
    • SetUnderground sends INPUT_UDT_UNDERGROUND_SYNC (4_World\Entities\ManBase\PlayerBase.c:2853-2865).
    • The server accepts it in OnInputUserDataProcess with only a range check (:6531, :6557-6563).
    • In 1.29 the value only existed on the client.
  • Consequence: the server now knows presence. Previously, any server-side check reading it saw NONE.
  • One such check is CanPlaceItem (PlayerBase.c:2834-2846, called from Hologram.c:438): inside a trigger it blocks types from disallowedTypesInUnderground.
    • By default: FenceKit, TerritoryFlagKit, and WatchtowerKit (3_Game\CfgGameplayDataJson.c:229-232).
    • Configured in cfggameplay.json > BaseBuildingData > HologramData.
  • The value is decided by the client: the server does not recalculate it.

Badlands in 1.30 scripts

  • Radio-announced bunkers.
    • Classes Land_Bunker_Basement_* and Land_Bunker_Shelter_* (4_World\Entities\Building\Bunker.c:289-294), with code lock.
    • The radio broadcasts coordinates and code in Morse.
    • Configured in cfgbunkerbroadcast.json, in $mission: or in dz/worlds/<mundo>/ce/ (3_Game\CfgBunkerBroadcastHandler.c:5,23-27), plus bunkerBroadcastEnabled in cfggameplay.json (CfgGameplayDataJson.c:193).
    • State file is covered by dayz-persistence.
  • Irrigation tunnel. Land_IrrigationTunnel_Entrance_01 is in 4_World\Entities\Building\Rebuildable\ (IrrigationTunnel_Entrance.c:1-11): the entrance is rebuildable, and its debug spawn populates it with sticks and rope. Rebuilding is covered by dayz-basebuilding.
  • Nasdara configs and models are not included in 1.30 Exp: only its scripts (measured 2026-09-24 on unencrypted PBOs).
  • Bohemia (Dev Blog Recap 2, Steam, 2026-09-22): Badlands underground facilities use the terrain holes system, which will be available for other maps and for the modding community.

Verification status

ClaimLevel
Format Holes/tiles[], SurfaceIsHole, presence synchronization, trigger cap, JSON schemasource_verified
One entry in tiles[] is a heightmap cell; 6.25 m in Livoniacross_checked (fit with triggers)
Holes reside in config, not in .wrpcross_checked (.wrp grows identically with and without holes)
How a hole renders and collides, what happens when falling through it, AI and navmeshunverified
A config-only mod opens holes in a vanilla mapunverified (hypothesis)
holes.cfg next to layers.cfg and reload on alt-tabunverified (third parties: FTT)
Effect of ECE_OBJECT_SPAWNERunverified

Before designing with holes

Each test advances one row of §Verification status. Together they fit in a single session of DayZDiag 1.30 (dayz-test-ingame, dayz-mcp-verify):

  1. Livonia vanilla. g_Game.SurfaceIsHole(740, 1225) must return true (cell {118,196}) and g_Game.SurfaceIsHole(1000, 1000) false. One screenshot from outside and another from inside the hole.
  2. Config-only mod. Add a custom group in CfgWorlds >> ChernarusPlus >> Holes and repeat the check on its cell.
  3. Mod geometry. Place an object with Object Spawner under that hole and verify that it is visible from inside and outside, and that it collides.
  4. Falling. Drop an object and enter with a character into a hole without geometry.

Delegaciones

TopicSkill
Base building parts, reconstruction, locksdayz-basebuilding
Bunker broadcast state filedayz-persistence
Trigger editor within general mod workflowdayz-mod-workflow
Buldozer inputs and Enforce 1.30 APIenforce-script-reference
Launch game and verify with screenshotsdayz-test-ingame + dayz-mcp-verify
Sandstorm and heat of Nasdaradayz-environment-hazards

Referencias

  • references/terrain-holes-evidence.md: new engine strings and their references in code, Livonia config diff, cell size calculations, .wrp v29→v32, and official and third-party sources.
  • references/underground-triggers.md: full schema of cfgundergroundtriggers.json, trigger recipe with Tag and underground presence.

WHAT THIS SKILL COULD NOT VERIFY

  • Any in-game behavior: rendering, collision, occlusion, falling, AI, and navmesh.
  • Cell size of any map other than Livonia, and Livonia's read from the header of .wrp.
  • Sakhal: its world is stored in an encrypted .ebo and could not be read.
  • Exactly where the engine looks for holes.cfg and whether a config-only mod opens holes.
  • What the engine does with ECE_OBJECT_SPAWNER.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.