Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
ScorchedVoxels
Stages convert to voxel terrain at load. Explosions and melee swings carve real craters that last until the stage ends, and the whole lobby sees the same holes. The wait has player cards and a three-game arcade, with card cosmetics to unlock.
By Nyn
| Date uploaded | a day ago |
| Version | 0.20.71 |
| Download link | Nyn-ScorchedVoxels-0.20.71.zip |
| Downloads | 179 |
| Dependency string | Nyn-ScorchedVoxels-0.20.71 |
This mod requires the following mods to function
bbepis-BepInExPack
Unified BepInEx all-in-one modding pack - plugin framework, detour library
Preferred version: 5.4.2121RiskofThunder-R2API_Networking
Networking API around the Unity UNet Low Level API (LLAPI)
Preferred version: 1.0.4Rune580-Risk_Of_Options
A convenient API for adding BepInEx ConfigEntry's to a option menu
Preferred version: 2.8.5README

ScorchedVoxels
Space-Engineers-style destructible terrain for Risk of Rain 2. Every explosion carves the world for real: at stage load the static terrain converts into voxel density fields, and from then on craters and tunnels are real geometry, permanent until the stage ends. Blasts throw up a rim of displaced rock, and blades cut: a melee swing slices out the rock it sweeps through, and thrown blades like Chef's cleaver carve along their flight. Dig wide, dig deep. Deep rock materializes as you reach it. Works in multiplayer: the whole lobby sees the same holes.
Current release: 0.20.71 "Insert Coin".
What it costs
Real geometry is not free. Know the price before you install:
- RAM, a fair amount of it. Expect the game to use 5 to 8 GB with converted terrain loaded, depending on the map. It was worse; 0.20.69 cut it roughly in half.
- A second loading screen, every stage. The voxels are built when a level loads, and on big maps that takes a while. This is the mod's real downside, and it's why the loading screen grew player cards and then a whole arcade: something worth looking at, and now something to play, while the terrain builds.
Destruction
- Craters are carved from the terrain itself, not drawn on top. The cost per blast is constant: the 100th rocket deforms as cheaply as the first.
- Blades cut the ground. A melee swing carves out the slice its arc sweeps through rock, for every survivor and monster with a sword, club or claw. Thrown blades count too: Chef's cleaver slices along its whole flight.
- Materials have hardness. Metal and concrete resist, crystal and ice shatter into slightly smaller craters, dirt and snow blow out wide. The hardness table is built in, tuned against every stage's material list (base game plus DLC), and identical on every machine.
- Debris is the rock you broke. What flies out of a crater matches the volume removed, textured with the ground it broke from. Sword cuts drop a slab shaped like the cut, and big chunks shatter into smaller pieces when they land. All of it is visual-only and close to free.
- Colliders never cheat. Distant terrain renders at reduced detail to save frames, but what you stand on and shoot is always exact.
The loading screen
While a stage converts, the mod replaces the wait with a player-card wall:
- An arcade. A PLAY button opens three minigames while you wait: an endless runner, a Worms-style artillery duel on destructible pixel terrain, and a multi-level circuit race with a grappling hook. Solo or lobby-wide, and the stage never waits for the game (unless the host locks loading on purpose).
- One card per player: portrait, live loading progress, and run stats (kills, damage, gold, and carved ground in m³).
- Crowns for the stage's top three, ranked by kills, then damage, then rock carved.
- Your portrait rim tracks lifetime digging through five tiers: wood, bronze (1M m³), silver (10M), gold (100M), and platinum (1B), saved per user profile.
- Rotating tips explain how the mod works while you wait.
Titles & calling cards
- Every cleared stage rolls a chance at a cosmetic title and, separately, a card background pattern. Wins play out as a slot-machine reel under the winner's card while everyone loads.
- Your first cleared stage on a fresh profile always unlocks something.
- All 199 country flags and every pride flag are free from the start. Only the patterns come from the lottery.
- Pick what your card wears under Settings > Mod Options > ScorchedVoxels, with the Choose Title and Choose Card Background buttons.
- Cosmetics show only on the loading screen. Nothing follows you into the run.
Multiplayer
- Everyone needs the mod, on the same version. A mismatched player stays on vanilla terrain with a chat warning instead of desyncing.
- Host-authoritative: the host's terrain settings apply to the whole lobby, and everyone sees the same craters.
- The host waits for the slowest loader as long as their game keeps reporting progress. Leavers and players without the mod never hold the lobby hostage.
- Risk of Options installs automatically as a dependency. It provides the settings menu and the cosmetic pickers.
Installation
Install with a mod manager (r2modman, Thunderstore Mod Manager, or Gale) and the dependencies come along automatically.
Manual install: drop ScorchedVoxels.dll into BepInEx/plugins and install the
dependencies listed on this page.
Configuration
BepInEx/config/com.Xerdi.ScorchedVoxels.cfg, or Settings > Mod Options in-game.
Highlights:
| Setting | What it does |
|---|---|
VoxelSize (0.5 m) |
Crater fidelity vs. memory and conversion time. Maps too large auto-coarsen. |
RadiusMultiplier / MaxCarveRadius |
How big blasts carve. |
LodDistance (90 m) |
Distant terrain renders at reduced detail. Colliders never LOD. |
ExcludedNames |
Name fragments that keep specific meshes vanilla. |
Effects section |
Rock debris toggle and cap. |
Titles section |
Lottery toggle, reveal sounds. |
In multiplayer, all geometry-affecting settings are the host's.
Lifetime stats and cosmetic unlocks persist in
BepInEx/config/com.Xerdi.ScorchedVoxels.UserStats.cfg per user profile.
Known limits
- Four maps ship their terrain meshes without CPU-readable data (Siphoned Forest, Sulfur Pools, Sundered Grove, Void Locus). A built-in whitelist reads those meshes from the game's own asset files instead, so every current map converts. If a future game update ships new unreadable meshes, they stay vanilla with a log line until they get whitelisted.
- Converted terrain loses baked lightmaps in carved areas. Ground pathfinding follows craters a few meters down and routes around deeper pits, but monsters may still path oddly around extreme tunnels.
- Half-open decorative meshes voxelize as thin hollow shells (they have no defined "inside").
- A few spots grow phantom rock where a mesh converted imperfectly (bleedout). Sorry about that. Screenshot anything you find and report it; these get hunted down one by one.
Credits
Made by Nyn.
Rock and Stone!
CHANGELOG
Changelog
0.20.71 "Insert Coin"
Network protocol changed. All players must update. A mismatched player stays on vanilla terrain with a chat warning.
- THE LOADING SCREEN HAS AN ARCADE. While a stage converts, a PLAY button appears under your player card (G works too): an endless runner where your Commando sprints past the creatures from the game's own loading-screen pixel art — Lemurians, Golems, Children on the ground, Drones at head height. Jump with Space or a click, duck with S or Ctrl, score is distance. If someone won an unlock, its reel plays out first; the arcade opens a few seconds after. The game ends the instant the stage is ready — the arcade never delays loading.
- GAME TWO: WORMS. A turn-based artillery duel on its own destructible pixel terrain — five kinds of battlefield plus ancient ruins, painted to match the stage you're headed to. Nine weapons wearing the game's own item art: bazooka, grenade, cluster bomb, meteor strike, molotov, thunderbolt, drill, gravity cube and bunker. Play solo, or the lobby takes turns; every crater you blast stays for the rest of the match.
- GAME THREE: THE CIRCUIT RACE. A seeded grand-prix loop stacked several levels tall — climbs, dives, forks, a summit — painted in the palette of the stage you're about to land on. Tap to jump, hold RIGHT CLICK to throw a grappling hook and swing from anywhere. Solo hunts a best lap; multiplayer runs elimination rounds on a freshly rolled track each round, where falling off the leader's screen puts you out.
- PICK YOUR COMMANDO'S COLORS. Settings > Mod Options > ScorchedVoxels > Choose Arcade Colors opens a grid of your runner in 16 team colors, walking in place. Click up to three in order of preference — your favorite is the one that runs.
- HOSTS CAN LOCK THE LOADING SCREEN. A LOCK LOADING button sits in the bottom-left corner of the loading screen (host only). Locking keeps the stage from starting so the lobby can finish an arcade round; unlocking releases it instantly. Loading is never held unless the host asks.
- DEBRIS IS NOW THE ROCK YOU BROKE. What flies out of a crater adds up to the volume that was actually removed — graze a wall and pebbles skitter, bury a rocket and boulders come out. Sword cuts drop a slab shaped like the cut itself. And big pieces break apart when they land, shattering into smaller chunks that scatter and tumble. All of it stays visual-only, so it costs about as much as the old debris did.
- MORE OF THE WORLD BREAKS. Sundered Grove converts for real now (its whitelist never matched the map's actual mesh names — the terrain, walls, giant roots and shrooms all carve). Void Locus turned out to have been running mostly vanilla too: its terrain, cavern roofs, platforms and walkways now convert. Siphoned Forest's fallen logs, boulders, tree trunks and firepit floors join the list, and so do Sulfur Pools' walkable spheres.
- THE WHOLE MOD GOT A PERFORMANCE PASS. Stages convert faster, sustained rocket volleys rebuild craters with less hitching, the loading screen costs less CPU while your machine is busy converting, and the cosmetics wardrobe opens without a stutter.
- The mod's options menu slimmed down from seventeen entries to nine, same capabilities.
0.20.70 "Cutting Edge"
Network protocol changed. All players must update. A mismatched player stays on vanilla terrain with a chat warning.
- MELEE WEAPONS NOW CUT THE GROUND. A swing carves out the slice its arc actually sweeps through rock, so the cut matches what you see the blade do. This applies to every melee attack in the game: any survivor or monster with a sword, gauntlet, club or claw leaves a mark when a swing lands in rock. Thrown blades count too: Chef's cleaver slices rock along its whole flight. Swings through open air do nothing, and a level swing over flat ground floats above it, so you only cut where the weapon really enters the terrain.
- EXPLOSIONS THROW UP A RIM. Craters now raise a lip of displaced rock around their edge instead of leaving a clean bowl, so a blast looks like ground blown outward rather than scooped away. The lip grows with the rock the blast actually threw out, so a glancing hit that removes almost nothing no longer raises a full ridge.
- LESS MEMORY AND SMOOTHER FRAMES. The previous stage's terrain meshes are now freed the moment the next stage starts instead of lingering through it, and the conversion caches release their memory once their work is done. The terrain level-of-detail pass no longer checks every chunk on the map every few frames, big blasts spend far less time finding what to rebuild, and each blast rebuilds fewer chunks for the same result.
- REFORMED ALTAR FIXED. Several problems stacked on this map. Its main terrain is a cavern shell that encloses the whole playable area, and to the mesh interior test a correct cavern is indistinguishable from an inside-out solid, so the automatic orientation correction flipped it: phantom rock filled the cavern, spawn floors turned inside-out, and players fell straight through on arrival. Orientation is now judged by the map's own AI ground nodes instead of the mesh alone. Nodes sit exactly where things walk, so a mesh only counts as inside-out when the nodes standing on it stand on its back faces; a correct cavern passes untouched and a genuinely inverted mesh is still caught. Separately, overlapping meshes could delete each other's surface in spots where the winning mesh had nothing to draw there, leaving genuine holes in ground and collision; a mesh now only claims a surface it actually renders. The kilometer-scale distant scenery also stays vanilla so the map converts at full resolution, and the map's godray light shafts are no longer treated as terrain (the first entry in a new baked per-map rules table for meshes the general rules cannot judge).
- EFFECT MESHES ARE NO LONGER TERRAIN. Several maps park visual-effect meshes on the world layer with colliders: the Simulacrum stages plant whole-terrain void boundary copies right on their spawn platforms, void areas scatter foam blobs, and arenas raise cloud walls. Converting one turned an effect into phantom rock, which on the Simulacrum variants of Aphelian Sanctuary and Sky Meadow buried the spawn area. Meshes drawn with effect shaders now always stay vanilla. A skipped mesh behaves exactly as it does without the mod, so this can only remove phantom rock, never create new problems.
- COMMENCEMENT SPAWN FIXED, MAP SHARPENED. The moon's island body and temple base are single kilometer-scale meshes that both cover the arrival zone. Their fill bled rock over the spawn, and their sheer surface area forced the whole map to convert at more than double the normal voxel size. Both stay vanilla now; the rest of the moon converts at full detail.
- SULFUR POOLS AND SUNDERED GROVE NOW CONVERT. Both maps ship their terrain meshes without CPU-readable data, so nearly everything stayed vanilla (Sulfur Pools converted nothing at all). Their terrain is now read directly from the game's own bundle files, the same recovery Siphoned Forest already uses.
- EVERY MAP TESTED. Every stage was played on this version, base game and DLC. Everything should be playable. What remains is light incorrectness here and there: a patch of rock sitting slightly proud of the original surface, or a decorative mesh that converted imperfectly. Screenshot and report anything worse than that.
0.20.69 "Lite Rock"
As with every version, the whole lobby must run the same one. A mismatched player stays on vanilla terrain with a chat warning.
- MEMORY OVERHAUL: RAM use on large maps dropped by roughly half. A stage that used to push the game past 10 GB now sits around 6 GB. Terrain conversion no longer floods the managed heap, render meshes stop keeping a spare CPU-side copy, and undisturbed terrain rests on far fewer, lighter physics colliders.
- Collision detail is unchanged where it matters. Floors and slopes collide exactly where they render, craters keep full-resolution collision (the first blast in a region restores it there), and thin walkways and walls keep it automatically. Undisturbed decorative rock is a few centimeters smoother to walk on than it looks; that is the whole trade.
- ENEMIES FOLLOW YOU INTO CRATERS: after a dig, ground pathfinding nodes drop onto the new surface (up to 4 m down). Deeper pits are marked unwalkable so enemies route around them instead of pacing at the rim.
- Stage loading finishes a little quicker: the collider bake phase has far fewer meshes to cook. The "uploading to GPU" progress phase merged into "building meshes".
0.20.67 "Glory(ious) Holes"
First Thunderstore release.
As with every version, the whole lobby must run the same one. A mismatched player stays on vanilla terrain with a chat warning.
- LOADING TEXT PASS: the rotating tips now explain how the mod actually works. They cover how terrain, syncing and the loading wait behave, how titles and card backgrounds unlock (including the first-clear guarantee), and where to adjust your player card (Settings > Mod Options, with Risk of Options installed).
- The bottom status label no longer wears fake percentages while waiting. "waiting for host 0%" looked stuck, and clients parked on "waiting for players 100%" made no sense. The host's wait now shows a live headcount instead: "waiting for players (1/3)".
- SIPHONED FOREST NOW CONVERTS. Its large terrain meshes ship without CPU-readable data, which used to leave them vanilla. A built-in whitelist now reads specific meshes from the game's own asset files instead: the floor, cave, walls, aqueduct, giant trees, tree stumps and the frozen lake all convert.
- Clearer conversion phase names: "building meshes", "uploading to GPU", "revealing unlocks".
- 8 new lottery titles. Players on older versions see a blank title line for the new ones instead of an error.
0.17.0
Network protocol changed. All players must update.
- PHANTOM DEEP ROCK BOUNDED: terrain whose underside was never modeled (Sky Meadow plateaus, several Titanic Plains pieces) used to fill solid rock endlessly far below the world. Deep fill is now sanity-checked against the actual shape of the source mesh (its winding number): clearly-outside regions stay air, honest interiors and big ground sheets keep their full digging depth, and walkable ground can never come out thinner than before. The near-surface fill is untouched. Verified offline across four maps (Titanic Plains, Scorched Acres, Sky Meadow, Verdant Falls): every floating plateau's endless under-fill is gone, closed terrain byte-identical.
- INSIDE-OUT SAFETY NET: a collider mesh wound fully inside-out would put all the fill on the wrong side of its surfaces (physics ignores winding, so maps can ship one). Every mesh now gets an orientation vote at conversion and is flipped when clearly inverted. No shipped map triggers it today; this guards the ones we haven't met yet.
- The
OpenMeshShellRatioconfig option is gone: measured across four maps, real ground sheets sit at 0-8% open edges and honest open decks at 9-22%, so the 8% threshold is baked in (the new shape check also catches anything near the line). One less thing to sync in multiplayer. - ONE LOADING BAR: the loading screen used to fill a bar per conversion phase (voxelize, mesh, upload, bake), four bars back to back, which read as the load being stuck in a loop. It's now a single 0-100% bar for the whole conversion with the phase text changing along the way. The percent on everyone's player cards follows the same scale, so remote progress no longer jumps backwards mid-load.
0.16.0
Network protocol changed. All players must update.
- MATERIALS NOW HAVE BUILT-IN HARDNESS: what a surface is made of decides how big the crater gets. Metal, pipes and concrete resist blasts (roughly half radius), crystal and ice are brittle-hard, stonework and bare rock take modestly smaller craters, while dirt, sand and snow blow out wider than before. The table is baked into the mod, tuned against the complete material list of every stage (base game plus DLC), and is identical on every machine, so multiplayer craters keep matching with nothing to sync or misconfigure.
- The
MaterialHardnessconfig option is gone (this replaces it). - SCORCH DARKENING REMOVED: craters no longer render with darkened clones of the
terrain material; carved surfaces keep the stage's normal look. The whole scorch
system is gone (per-voxel burn tracking, darkness bands, material swaps), which also
makes carves slightly cheaper. The
ScorchedSurfacesconfig option is gone with it. - FIX: the Scorched Acres bridge spillout. Three compounding causes, found by pulling
the actual scene meshes from the game files and voxelizing them offline:
- Triangles longer than 96m on any axis were silently DROPPED from voxelization (a guard against skybox-scale backdrop sheets). The great stone arch bridges are low-poly: a fifth of their triangles, including whole 157m deck faces, never reached the voxelizer, tearing holes in closed meshes and letting the interior fill bleed out as phantom rock. The guard now measures what it actually protects against (the chunk count a triangle would bin into), so long thin structural triangles are kept and true backdrop sheets are still skipped. Bridges now voxelize to their exact shape, and their insides are genuinely solid, so they carve properly too. Big ground meshes also got fuller interiors out of this (their longest triangles were being dropped as well).
- The inside/outside decision now uses the closest FEATURE's normal (angle-weighted pseudonormals) instead of the nearest triangle's infinite plane, which misclassified whole regions around huge low-poly triangles.
- The two longest elevated walkway sections (122m/124m) crossed the "meshes over
100m are never hollow-shelled" rule, so their 11.7%-open decks were voxelized
solid and filled phantom rock up to 58m below. That size exemption is removed;
honestly-open meshes shell at any size (real ground can't read as open: openness
is perimeter-over-area, and the vertex weld already prevents false positives).
The
OpenMeshShellMaxSizeconfig option is gone with it.
- FIX: thin walkways also no longer sprout voxel fins when viewed from afar. Distant (LOD) terrain meshes hide seams by extending 10m "skirts" down into the ground, and on a thin shell those punched straight through and hung in the open air. Shell meshes now use skirts no deeper than one LOD cell.
- SHALLOW GROUND FIX: huge walkable surfaces that map authors ship as OPEN, underside-less meshes (Verdant Falls' giant leaves, dunes and track pieces, optimized low-poly geometry) voxelized as a paper-thin crust: half a meter of world, where one shot opened a hole into the void. Open meshes are now reconstructed as BOUNDED SOLIDS: like a cube with deleted faces, the remaining surface plus the mesh's own bounding volume define the full solid, and that volume is filled with diggable material (with a 4m minimum slab for perfectly flat pieces). The mesh's own box is the digging budget, so nothing can ever fill beyond the size of the thing itself: dunes fill to their own bottom, floating decks stay deck-thin, and runaway phantom rock stays geometrically impossible. Verified offline against the real Verdant Falls and Scorched Acres meshes: 8-10x more diggable material on walkable ground, zero fill below any mesh's bounds, edge lips capped at slab thickness. Thick real ground digs forever, as before.
- FIX: the HOST's own lottery reveal now reliably shows on everyone's loading screen. It was broadcast only once, at the host's stage start, while the other players were usually still loading the scene, so the message was lost. Queued reels now re-send with the once-per-second loading sync (harmless repeats; other players' reveals already dodged the race by reporting later).
0.15.2
- LOADING: the host now waits for slow-loading players as long as their machine keeps sending progress heartbeats (every 2s while converting). A big stage on a slow PC is no longer cut off by the old flat 30-second limit: everyone spawns in together, and the loading cards show whose bar is crawling. The 30s timeout still exists, but it now measures silence. Only a machine that stops heartbeating entirely (game hung, dead connection) is started without.
- Waiting clients follow the same rule: the host's once-per-second roster broadcast is their "host is alive" signal, so a fast loader no longer bails out of the loading screen while the host is legitimately still waiting on a third, slower machine. A client only releases itself if the host goes silent for 35 seconds.
0.15.1
Network protocol changed. All players must update.
- MULTIPLAYER ROBUSTNESS PASS:
- A player who disconnects during the loading screen no longer stalls the lobby into the 30s timeout; the host recounts who it is waiting on live, every frame.
- Players without the mod can no longer hold the stage hostage every stage: the host waits only for machines that have shown mod traffic (with a 15s first-stage grace window for slow loaders).
- Remote players' cards now show a real loading percentage (clients report progress every 2 seconds) instead of an indeterminate sweep.
- The "player X runs an old version" chat warning fires once per run instead of once per stage.
- A lottery win reported by a fast-loading client before the host finished loading is no longer lost; reveals are stage-tagged and survive the stage handover.
- Fixed a stale host-config edge case across runs, and vanilla-staying machines no longer queue up carve messages they will never use.
- OPEN-MESH FIX: half-open decorative meshes (non-watertight, the "giant solid cube"
family of bugs) are now detected at conversion and voxelized as thin hollow shells
instead of guessing an interior that isn't there. Seam-split vertices are welded
before the openness check, and meshes above
OpenMeshShellMaxSize(default 100 m) are never shelled; large ground always keeps its solid fill below, so tunnels keep digging into rock. Tunable viaOpenMeshShellRatio/OpenMeshShellMaxSize(host-synced; 0 disables). - New icon. Internal slimming: dead code removed, three unused assembly references dropped.
0.14.0
- LOOT REVEAL REWORKED: the prize reel spins DURING loading under each winner's card (up to one per player, all in sync), so the show costs no extra time. Only if loading finishes mid-spin does the release wait for the landing.
- Reel sound effects from the game's own UI soundbank, one shared sound source, so
four simultaneous winners are exactly as loud as one. Toggle:
RevealSounds. - Reel polish: anticipation beat, fade-in, breathing gold payline, landing flash, scale punch, prize name in gold.
- No more spoilers: the card's "NEW!" title line and freshly won background stay hidden until the reel lands.
- Carve dust puff removed (rocks plus crater are feedback enough).
0.13.0
- LOOT REVEAL: lottery wins play a CS:GO-style reel on the loading screen for everyone; the host scripts the identical reel for every machine.
- FIRST TREASURE GUARANTEED: a profile with zero unlocks wins exactly one prize on its first cleared level.
0.12.0
- All 199 country flags in the card-background picker, painted procedurally.
- Pickers render inside the Risk of Options description panel; RoR2-themed UI (game font, chamfered panels); card layout fixes.
0.11.0
- CARD BACKGROUNDS: country flags and pride flags always available; pattern backgrounds unlock via the level lottery.
0.10.0
- Portrait rims tiered by LIFETIME carved m³ (wood through platinum), persisted per profile.
- TITLE LOTTERY: 5% per cleared level to unlock one of 52 cosmetic titles, shown only on the loading-screen cards.
- Default
VoxelSizeis now 0.5 m.
0.8.x
- Scorched surfaces as darkened material clones (three darkness bands).
- Dedicated carve worker thread; the main thread only uploads meshes.
- Multiplayer version handshake plus host config sync.
MaterialHardnessconfig; ScorchedEarth conflict self-disable; Risk of Options integration.
0.5.0 - 0.7.0
- Loading-screen player cards with run stats and carved-m³ tracking.
- Visual rock debris with one-bounce physics.
- Three-tier render LOD with seam-free junctions; big performance pass.
0.1.0 - 0.4.x
- Core prototype: per-mesh voxel volumes, Surface Nets meshing, deterministic carves, multiplayer carve broadcast, teleporter/prop exclusion rules.