Confirm with your password

FireFront

Fire that actually spreads: structure to structure, into the trees, across open ground. Wind-driven, rain-damped, stopped by water. Charred trees, burn scars, real drops, tree regrowth, fires that survive restarts and remember who lit them.

· Website · 💗 Donate

Stars
2
Downloads
549
Version
1.0.3
Updated
Author
RavenIronStudios
Virus scan
✓ Scan successful
Runs on
Client & Server
Required by
6 mods

Description

FireFront

A Valheim mod that makes fire spread. Torch a wall and it can take the whole build with it, jump to the treeline, and crawl across open ground to get there — an actual moving front with a windward edge and a burnt-out middle, not one flagged object.

Fire is wind-driven, doused by rain, stopped by water (and by dirt paths in a hosted game), survives server restarts, and remembers who lit it.

Requirements

Valheim 1.0.16 (built and checked against it; last tested in game on 1.0.15; builds older than 1.0.15 are not supported)
BepInEx BepInExPack Valheim 5.4.2350 or newer

Installation

Drop FireFront.dll into BepInEx/plugins/ and launch. Nothing needs configuring to play.

On a dedicated server, the server needs the dll too — it runs the simulation and your client only draws it. Update server and client together. Since 0.24 a mismatch is not silent: at connect the two compare versions, and if they do not work together the player sees it on screen and both logs say which versions met. A client or server older than 0.24 is detected too.

Features

Spread

  • Structures, standing trees and felled logs all burn. Buildings leave their drops; trees and logs burn to charcoal (see below).
  • Fire climbs a tree by the tree's health. A burning tree takes unseen fire damage — no floating numbers — and the fire front starts at the foot and climbs the trunk as the tree weakens, the bark blackening and glowing with embers below it. Flames in the crown mean a tree about to go.
  • Fire spreads by contact — structure to structure, tree to tree, structure to tree — and across open ground between things too far apart to light each other directly.
  • Spread follows the game's real wind, both direction and strength. A gale drives a long narrow tongue; a calm day burns in a lazy circle.
  • Fire spreads at the pace of its fuel. A tree must be properly alight, roughly a minute, before it torches its neighbours. Fires start small and build over about ten minutes rather than instantly raging.
  • Burnt ground is spent for about 90 seconds, so the front advances instead of churning in place.
  • FireFront starts no fire in the Ashlands by default. The Ashlands' own fire touches wood there all the time, and catching from every touch made the biome unplayable. A server that wants it back turns on FireInAshlands (fireset ashlands true). Either way the Ashlands' own fire works as it does without FireFront.

Consequences

  • Standing in fire hurts, through vanilla's own burn effect. Players burn on every kind of server; creatures burn in a hosted game only, because a dedicated server has no physical world where they stand.
  • Standing near fire keeps you warm — it holds off Cold and Freezing exactly as a campfire does, so you cannot freeze to death inside a burning forest.
  • A tree the fire kills is charred in place: a black, bare, ash-dusted husk of the same species — real char plates split by fissures, built from that species' own bark — with a few scattered pockets of embers that glow in the splits and fade over a couple of minutes, and thin smoke off the trunk for a while after. Three seconds later it either collapses — the charred trunk falls with the game's own felling crash, drops a little coal, smokes where it lies and crumbles to ash — or stays standing as a snag you can chop later for the same coal. Charred wood never drops wood or seeds and never catches fire again. fireset treedestruction <0-100> is the collapse chance; charredember, charredembercover and charredsmokeseconds are the look.
  • Join a server mid-blaze and you see the blaze: burning buildings and trees are sent to a connecting player as a snapshot, with how long each has burned.
  • Burnt ground leaves a dark scorch mark that disappears after about five minutes. For a lasting mark, fireset dirtpaint true also lays real bare dirt where a player is near the fire; that dirt is saved with the world and never goes away, which is why it is off by default. Collapsed trees regrow after about fifteen minutes if the spot is still clear.
  • Fires remember who lit them, one fire at a time. The player whose hit sets an object alight is recorded on it, and fire that spreads, to other objects or to the ground around them, keeps the igniter of the fire it came from — so two fires burning at once on the same server are attributed separately. A fire that lightning or a creature starts, or one lit with the admin commands, records nobody. That id is saved to disk with the rest of the fire state, in firefront_fires_<world id>.txt in the server's worlds_local folder, so it survives a restart; a save from an older version restores with the igniter unknown, and with persistfires off nothing is written. Nothing surfaces in game yet: a companion mod can read it for its reputation system, fire by fire rather than one player for the whole server.
  • Fires survive a server restart. Burning things come back burning with their remaining time, spent ground stays spent, and trees still waiting to regrow still do.

Fighting a fire

A large fire is meant to be fightable rather than something you stand beside and hope.

  • Water is a real firebreak, and so are dirt paths and cultivated ground in a hosted game. Where that applies it protects a base more than you would expect: the levelled, pathed ground most bases sit on counts as fuel-free, so ground fire crawling in from outside stalls at the edge of the yard. It stops only fire moving over the ground. A burning tree or building still lights a wall within about 8 m of it (spreadradius), and burning ground lights anything within about 4 m (groundradius), so keep trees and grass that far back from walls you want to keep. On a dedicated server that only holds near the world's centre, in the few zones the server itself keeps loaded; everywhere else the server cannot see the ground, so only water counts for now. That is a known gap, not a setting.
  • Rain douses fire, buildings included. A burner caught in the rain stops passing fire on immediately and burns out in about a third of its normal time. Rain stops spread, not ignition — a torch, a fire arrow or lightning still lights something in a downpour.
  • Press G to extinguish what you are looking at plus the fire around you, ground fire and burning structures alike.
  • The Dousing Bomb puts out everything within about 6 m of where it lands. Hand-craftable anywhere and cheap on purpose: 3 Resin + 2 Leather scraps makes 3.
  • Anything extinguished stays soaked for about 90 seconds and cannot relight, so a line of bombs cuts a real break ahead of the front instead of the fire refilling the hole behind you.
  • Ground fire will not wander more than about 40 m from where the fire started.

Dedicated servers

Fire is simulated entirely on the server. Several things that worked when hosting from your own game did not work on a dedicated server, silently, for a long time. If you tried FireFront on a server before and it felt tame, inert or oddly patchy, that was this — all of it is fixed:

Symptom Cause
Forest fires barely spread The server could not see trees at all
Standing in fire never hurt The server has no physical world where players stand
Burnt trees never came back Regrowth never planted anything
Visible fire did not match the real fire Ground fire was drawn from a running list of changes that was never reconciled

Anti-grief: fireset burnbuildings false (or BurnPlayerBuildings in the config) means fire never ignites anything a player placed — not by spread, not by fire arrows, not by anything — while ruins and world structures still burn.

Presets

fireset burntheworld true — fire catches instantly, dirt paths and even water stop stopping it, rain does not put it out, burnt ground relights, fires start at full strength, nothing grows back, and the caps go to maximum per fire, so several blazes can rage at once. Visual settings are left alone deliberately: those are what cost frames, so you still choose how much your machine draws.

fireset lowspec true — the first thing to reach for if big fires cost you frames. Fewer things burning at once, fewer visuals, no scorch decals, a slower spread tick. Fire still spreads and still burns your base down; there is simply less happening at once. Also available as LowSpecPreset in the config file.

Both leave your own settings intact — anything you have already set lower is kept, and turning a preset off restores what you had. firestatus shows exactly what is in force. If both are on, lowspec wins.

Console commands

Press ` to open the console.

Command Does
firestatus What is burning right now, plus every current setting
ignite Ignite whatever is under your crosshair
startfire [radius] Ignite everything burnable within radius of you
stopfire Extinguish whatever is under your crosshair
clearfires Every active fire out, instantly
firedebug Toggle verbose logging
fireset <key> <value> Live-tune any setting, no restart; a change to the server needs you on its admin list

ignite, startfire and clearfires run on the server no matter where you type them, only for players on the server's own admin list, and the reply comes back to your console prefixed [server]. fireset changes the copy on your own machine and asks the server, which applies it only for its admins, whether typed or moved from a config manager; its answer comes back the same way. firestatus asks the server too and needs no admin. stopfire puts out only the one thing under your crosshair, unlike G, which also clears the fire around you. It checks the admin flag your own game holds, which can say no even to a real admin on a dedicated server; G needs no admin. firedebug turns verbose logging on or off on your own machine; on a client connected to a server it also sends the new value to the server like fireset debug, which the server applies only for its admins.

Test commands that change the world, run on the server for its admins only, like startfire: firegroundignite [radius] starts real ground fire around you, and firetreeregrow makes every pending tree regrowth try now.

Diagnostic commands that change nothing: firetreeregrowlist lists the server's pending tree regrowth (admins only); fireweather shows the weather FireFront uses at your position as your game sees it, and as the server sees it if you are one of its admins; firelistprefabs, firecheckprefab and fireinspecteffectarea read prefab and effect details on your own machine; firedumptex writes the charred-wood textures your game generated as PNG under BepInEx/config/FireFront-textures/. firepurgevfx is an old emergency cleanup: it deletes every vanilla fire object in your own game's scene, real Ashlands fires included, so leave it alone unless you are asked to use it.

To test rain on a dedicated server, fireweather force Rain and then fireweather reset (admins only). Vanilla's env changes the weather on your own game only, so the server's fire never sees it.

Configuration

Everything is in BepInEx/config/com.raveniron.firefront.cfg. Every setting except ExtinguishKey can be changed live with fireset, no restart required. Settings the server reads change there only for its admins. Visual settings are read by each player's own game, so fireset changes them for whoever types it and nobody else, admin or not; the server does not send its values to players. ExtinguishKey (default G) is each player's own keybind, set in their own file. The config file migrates itself between versions: when a default changes, a value you never touched follows it, and a value you chose is kept and named in the log.

Every key is written to both the server's file and each client's, but most are read on one side only, and two presets (lowspec, burntheworld) silently override keys that still read true. docs/CONFIG-KEY-MAP.md says, for all 82 keys, which side reads it and what overrides it.

fireset keys:

Area Keys
Core enabled, burnduration, firematurity, spreadradius, maxburning, queuesize, spreadinterval, trees, burnbuildings, ashlands, maxkills
Ground fire groundenabled, groundcellsize, groundradius, groundburnduration, groundmax, groundvfxmax, grounddamagemax, groundleashenabled, groundleashdistance
Damage and warmth firehurts, firehurtsplayeronly, firehurtsradius, firedamage, firetickinterval, firewarmth, firewarmthradius
Putting it out extinguishradius, dousingradius, douseimmunity, rainsuppress, rainmultiplier, rainobjects, rainobjectmultiplier, firebreaks, waterblocks
Wind windbias, windupwindchance, windinfluence
Aftermath scorchmarks, scorchlifetime, dirtpaint, dirtpaintradius, exhaustionenabled, fuelregrow, treeregrowth, treeregrowthseconds, persistfires
Tree fire and charring treefire, treetick, treekillfraction, treedestruction, charreddelay, charredcoalmin, charredcoalmax, charredhealth, charredcrumble, charredglow, charredember, charredembercover, charredsmoke, charredsmokeseconds
Ramp rampenabled, rampduration, rampstart
Visuals vfx, procedural, firesmoke, maxflameheight, treeflames, crownsparks, tallfiremax, fireshadows, heathaze, barkchar
Smouldering smouldering, smoulderafter
Presets and debug lowspec, burntheworld, debug

Worth playing with: fireset windinfluence 0 ignores wind entirely for old-style even spread; 1 is full effect and the default. firestatus reports the live wind strength the fire is currently feeling.

Building from source

Requires the .NET SDK. The mod targets net472.

.\tools\fetch-libs.ps1     # populate libs\ from your local Valheim install, once per machine
dotnet build FireFront.csproj -c Release

libs\ is gitignored deliberately — the game assemblies are not ours to redistribute. fetch-libs.ps1 auto-detects Steam; pass -ValheimPath to override.

Script Does
tools\fetch-libs.ps1 Populates libs\ from a local Valheim install
tools\run-tests.ps1 Runs the off-game test harness under tests\
tools\package.ps1 Builds the release zip into dist\. Refuses if the version in Plugin.cs, FireFront.csproj and manifest.json disagree
tools\start-test-server.ps1 / stop-test-server.ps1 Drive a local dedicated test server

A note for contributors: the mod compiles against a publicized copy of the game assembly, so any vanilla member compiles regardless of its real accessibility and fails only at runtime. When checking whether something is public, decompile the shipping assembly from a real install, never the publicized copy in libs\.

Reporting problems

Send LogOutput.log from the BepInEx folder, especially if you see a wall of repeating red.

Screenshots of odd spread are genuinely useful — "this jumped further than it should have" is far easier to diagnose from a picture. For wind specifically, a shot of the burn scar plus the wind direction is exactly the evidence needed. Frametime graphs are gold; more than one stutter has been found and fixed from a tester's clip.

Known limits:

  • The fire visual is assembled in code from the game's own fire materials and particle recipes (flipbook flames, ember motes, lit smoke, heat shimmer, a soft-shadowed light), so it should sit next to a campfire without looking like another game — but it is not an authored asset. The charred bark is generated the same way, from each species' own bark texture, on your machine the first time a tree of that species chars.
  • Ray-traced lighting is not something any mod can add to Valheim: the game runs the built-in render pipeline with no ray-tracing support compiled in. Shadow-casting fire lights, HDR bloom, normal-mapped char, lit smoke and heat haze are the ceiling, and all of them are used.
  • Defaults are tuned aggressive. Expect fire to spread fast and hungrily unless you dial it down.
  • Changing groundcellsize on the server (or in your own game, in single player or when hosting) while ground fire burns moves the burning cells to scaled positions (doubling the size puts them twice as far from the world centre), and a fire save written then keeps the mixed cells. Change it only while no ground fire burns, and with persistfires on (the default) not across a restart that saved ground fire either: the saved cells load onto the new grid the same way.

Licence

MIT; see LICENSE. Use it, fork it, repackage it, ship it in a modpack; keep the copyright notice with it.

Credits

Wu'barrk — visual effects, and the config-migration machinery FireFront's own is built on, by way of Wings of the Valkyrie and Valkyrie's Cargo.


Support Raven Iron

Every Raven Iron mod is free, and stays free — all of it, always. Nothing is held back for patrons, and nothing ever will be.

If you'd like to help cover server hosting and test hardware:

Changelog

100000.0

(4945,-31): 5000 m from where the server last saw the player, limit 200 m. Found in play and fixed the same evening: the firesetwording (the entry above). Retested on the fixed build: as admin the console readburntheworld = True on this machine, the sent-to-the-server line, then [server] FireFront: fireset burntheworld = True on the server.; as non-admin the [server]line readrefused — you are not in the server's adminlist. The server's value is unchanged; the copy on your machine keeps what you set.` Zero exceptions either side.

1.0.3 Latest

Updated due to 1.0.16 Patch.

1.0.2

Fixes from a code review of 1.0.1. The wire protocol stays 1, so 1.0.1 and 1.0.2 play together.

  • Changing worlds no longer carries fire into the next one. In single player or when hosting, logging out of a world with fire burning and loading another (or the same one again) kept the old world's fire running in the new one. Its burning objects pointed at unrelated objects in the new world, so pieces there could be destroyed, the old ground fire burned at its old coordinates, trees waiting to regrow were planted into the new world, and the new world's fire save was overwritten. Now the fire is saved to its own world when that world closes and then forgotten, and the next world loads its own. Dedicated servers were not affected.
  • A new fire's first trees no longer char almost at once. The tree-fire clock stood still while nothing burned, so the first tick of the next fire charged the whole quiet spell as burn time: after a few quiet minutes a tree lit by a fire arrow went to its last health in one tick and charred before it was old enough to spread. The clock now stops with the fire, so a new fire's trees burn at the configured pace from the first tick.
  • The server checks what a client asks it to light or put out. An ignite or extinguish request names an object, and the server used to build that object and take it over whatever it was, however far away. A modified client could name any object, another player's character included, and the server would take it over. The server now lights only trees, logs and burnable pieces, refuses a request for something more than 320 m from where the player's game last reported being, and puts out only an object that is already burning, without building anything. Pressing the extinguish key while aiming at a piece that is not burning no longer takes that piece from the player standing next to it.
  • Ground fire is drawn where it burns, whatever each player's GroundCellSize. The server now sends its own cell size with the ground fire, and each client places the flames, the warmth and the scorch marks with it. A player who had set a different size saw the whole fire at scaled coordinates, far from where it really burned, and was not warmed by it. Against a server older than 1.0.2 a client uses its own size, as before.
  • Soaked trees are left alone. Spread skipped a doused tree (a Dousing Bomb line) or a tree past the Ashlands edge only after building it and taking it from the nearby player, every 0.75 s. It now skips them before building anything.
  • Each fire remembers who lit it. Until now the igniter FireFront saved and offered to companion mods was one for the whole map, so Ragnarok's Wrath, for one, could only blame whoever lit the first fire since the map was last clear of fire, even after that fire had gone out. Now every burning object and ground cell records the player who lit it, fire that spreads keeps the igniter of the fire it came from, and the igniter is saved and restored with the fire. A save from an older version loads with the igniter unknown. The old map-wide value is unchanged, so older companion builds keep working. Newer ones can ask for each fire's igniter through FireManager.CollectActiveFiresWithIgniters and FireManager.FireIgniterNear. Nothing new goes over the network for it (a client's ignite request already carried the attacker's id), so it changes nothing for 1.0.1 clients.
  • Rain no longer puts out every fire at once after a pause. Turning fire back on with fireset enabled true charged the whole pause as rain time, so every fire in the rain went out on resume. Rain now ages fire by at most two spread cycles at a time.
  • The store page's website link now goes to the Raven Iron website.

This DLL was built from the commit tagged v1.0.2; the GitHub release names that commit and gives the DLL's md5.

Rig evidence (2026-09-24, on the dedicated test rig, from a build of e720f2b — on the same code as this release, since only documents and the store page's website link changed after it). A dedicated server on Valheim 1.0.15 (crossplay), plus single-player worlds on the same build; one client throughout. A fire stayed in its own world across a world change in single player: the next world loaded with nothing burning and no fire lines, and re-entering the first world restored its one burning tree. The same held joining the dedicated server: no local fire carried over, and no restore or burn lines appeared at join. Five arrow hits on the dedicated server all carried the same igniter id, and the fire save file's meta line and its ground lines, read while the fire burned, matched it; a second fire was also lit by arrow (the plan was startfire), so it carried the same id and a fire with no igniter was not shown there — the only such fire seen was the rain check's startfire fire below, whose fire event logged igniter 0 (its per-fire igniter was not read back). A client running a different GroundCellSize than the server (2 against the server's 1) drew scorch marks sized and placed for the server's cells once it joined, not its own. Extinguish by id put a fire out with no forced re-creation and no re-light, and after clearfires, pressing the extinguish key (G) at an unlit tree built nothing. After about two minutes with nothing burning, a tree lit by a fire arrow took a first tick of under 1 % of its health and burned at the configured pace from there (1.0.1 would have charged the whole two minutes in that first tick, more than half the tree's health), and was still burning two minutes later. With rain forced on (fireweather force Rain), one tree lit with startfire, and fire paused for 40 s with fireset enabled false, the tree kept burning after the resume and went out 15–18 s later on its rain-shortened timer, not at the resume itself — one tree and a 40 s pause is a smaller check than the planned two to four trees and 60 s. BurnPlayerBuildings false held throughout: ignite aimed at a player's wall answered Not burnable, and the only piece that caught was part of an unowned world ruin. Settings were confirmed back to their pre-test values afterward. Zero exceptions on either side.

Not tried in game: soaked or Ashlands-barred trees being skipped rather than re-created mid-spread (no burning neighbour was near the doused tree in this run); the late-ZDO ignite retry (every request in this run resolved directly, so the retry path was never used); the tree tick under a slower spread cycle (spreadinterval 10); being warmed by ground fire under a mismatched GroundCellSize (only where the flames and scorch marks sat was checked); a 1.0.1 client against a 1.0.2 server and the reverse (checked by code review, not restaged here); a queued fire keeping its igniter; a fire started by lightning or a creature recording no igniter; a save from before 1.0.2 restoring with the igniter unknown (covered off-game); a companion build that still reads the old map-wide igniter; a dedicated-server restart with fire still burning; a world change while hosting with another player connected; the server ignoring an ignite request for something that cannot burn, which any fire hit on a stone wall sends; the server refusing a request for a target out of reach (320 m to light, 200 m to put out), which only a modified client would send; and a second player: two players lighting separate fires at once, which would test igniter attribution between two real attackers, and the extinguish key pressed at an unlit piece beside another player. Off-game: 1815 checks, 0 failed.

63 older entries, full version history & downloads →

Manual installation instructions
1

Install BepInExPack Valheim

BepInExPack Valheim is required to run mods in Valheim.

Download BepInExPack Valheim 5.4.2351 · View mod page

Check out the mod page for detailed installation instructions.

2

Install FireFront

This mod must be installed on both the client and the server.

Download FireFront 1.0.3

Extract the ZIP and place the file(s) into the BepInEx/plugins/ folder inside your Valheim game folder.