SmeagsMods-SkyforgeFireworks icon

SkyforgeFireworks

Torch-lit firework shows with fan and scatter salvo racks, five premade vanilla shows, timed fuses and optional Viking bursts.

Last updated 11 hours ago
Total downloads 12
Total rating 0 
Categories Building Crafting AI Generated
Dependency string SmeagsMods-SkyforgeFireworks-0.6.0
Dependants 0 other packages depend on this package

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2351 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2351

README

Skyforge Fireworks 0.6.0

Torch-lit Viking firework shows for Valheim 1.0.21 and BepInExPack 5.4.2351. Test in a separate profile and backed-up world before adding the mod to your group server.

New: spread the salvo across the sky

Salvo racks now offer Straight, Fan, and Random scatter under Shift + Use. Fan sweeps five tube positions from left to right across 48 degrees, repeating for longer salvos. Scatter changes direction per shot within 25 degrees of upright. Rotate the rack to aim the fan. Existing racks remain Straight until changed. Both native rocket effects and Skyforge custom bursts follow the selected launch direction.

Five premade vanilla shows

Choose a show on the fuse board, Carve settings, load your preferred vanilla fireworks into nearby launchers on the same rune, then light the board with a torch. The selected show uses only native firework effects, even when a launcher normally uses Bifrost, World Tree, Mjolnir, or Rune cycle. Colors come from the ammunition you load; no custom ammunition is added.

Show Shots per loaded launcher Rhythm Rack direction
Hearthlight Welcome 6 Every 2s, staggered opening Fan
Fjord Echoes 8 Every 1.5s, alternating echoes Fan
Northern Rain 10 Every 1s, close stagger Random scatter
Viking Salute 12 Every 0.75s, paired timing Fan
Grand Thing Finale 24 Every 0.5s, rapid stagger Random scatter

The board orders launchers by distance, then stable identity for equal distances. These are timed choreographies, not automatic left/right placement detection. Stands remain upright. Each launcher consumes its normal native ammunition cost and stops early if underloaded. Use ascending colored firework rockets for sky fans; native ground effects such as Thunderstone retain their own effect behavior.

A premade show temporarily overrides burst, shot count, timing and rack direction. Your saved launcher arrangements remain intact. Choose Custom arrangement on the board to use those saved arrangements again. Spread and preset choices persist through reload; older remembered carvings remain readable. All clients and the server must use 0.6.0 together because the show RPC format changed.

See QUICKSTART.md for setup and TESTING.md for verified scope. Human controls, listening, and your own multiplayer environment still need player testing before upload.

Equipment and controls

The Hammer gains Launch stand, Salvo rack, and Show fuse board in Misc. Stands and boards cost 8 wood + 2 resin; racks cost 15 wood + 2 resin. Discover wood, resin and a workbench to learn the recipes. A nearby workbench is required to build them. Native recipe discovery, station range and exact material consumption have been validated in a disposable fixture.

  • Load a stand/rack: put away your torch and use the box normally. Place vanilla fireworks in its inventory. Other items are ignored.
  • Arrange: Shift + Use opens settings. Choose rune 1–8, shot count, launch delay, interval and fuse length. Select Carve settings to store the settings on the piece.
  • Fine-tune: use the minus/plus buttons for 0.1-second timing steps or whole rune/shot steps. Sliders remain available for larger changes. Buttons stop at the existing limits; Carve settings still applies the draft.
  • Choose a rhythm: Opening sets 4 shots every 2 seconds, Volley sets 8 every second, and Finale sets 12 every half-second. These change only shot count and interval; keep or adjust your rune, fuse, delay and burst. Scroll inside the panel for the lower controls.
  • Reuse a carving: Remember carving copies the current launcher preview, including its rune, fuse, delay, interval, count and burst. On another stand or rack, Recall carving previews that plan. Carve settings applies it; Leave unchanged discards that piece's pending changes. One remembered carving survives game restarts in this local mod profile. Remember replaces the previous carving. Applied settings remain saved on each piece. If saving is unavailable, the panel says the carving is remembered for this session only.
  • Choose a burst: each launcher offers Vanilla, Bifrost rainbow rings, a green-and-gold World Tree, a gold Mjolnir hammer with blue lightning, or Rune cycle. Rune cycle repeats Bifrost, World Tree, Mjolnir in that order, starting over each time you light the fuse. Custom bursts consume the loaded ingredient at its normal campfire cost; they do not introduce new craftable ammunition. The Vanilla option preserves that ingredient's original effect.
  • Review the show: the board lists matching accessible launchers, loaded shot counts, and first/last launch times after lighting. Empty, open, running and excess launchers are identified. A launcher panel compares its available ammunition with the requested shot count. The preview is an estimate; the owner checks eligibility again at ignition.
  • Light: equip a torch, aim at the equipment and press Use. The torch's hotbar item-use interaction also works while it is equipped.
  • Standalone: lighting a stand or rack runs only that piece.
  • Whole show: light the fuse board. It arms up to 16 loaded, idle launchers on the same rune within 40 metres. The board's fuse duration sets their shared start; each launcher's delay and interval then apply in Custom arrangement; premade shows use the table above.
  • Dismantle idle equipment: normal Hammer removal returns its wood and resin; loaded idle stands/racks drop their unused ammunition. Snuff a running show first.
  • Snuff: use a burning board or launcher again to stop its remaining shots. Stopping a board cancels its linked launchers. Already launched effects finish normally.

Inventory order is left to right, top to bottom. A stack is used until its next shot cannot be paid for, then the next eligible ingredient is used. Each shot consumes the same quantity as the native campfire. Empty launchers stop. Settings and unused inventory persist; a running show is never intentionally resumed from a save.

First show

Build three racks within 40 metres of one fuse board. Use rune 1 everywhere and a 6-second board fuse.

Rack Shots Delay Interval Burst
Left 4 0 s 1 s Bifrost
Right 4 0.5 s 1 s World tree
Centre 8 5 s 0.5 s Rune cycle

Load the boxes, equip a torch, light the board, and step back. Settings are retained for the next show; refill the ammunition and light it again.

Installation

Use a separate BepInEx profile and disposable world for your first test. Put SkyforgeFireworks.dll in BepInEx/plugins/SkyforgeFireworks/. Every client and server must have the same build; automatic compatibility negotiation is not implemented. The private test harness DLL is not part of the playable mod and must not be installed in a normal profile.

Do not open a world containing these pieces without the mod. Back up a world before adding or removing a mod that defines saved prefabs. No installer here edits the live Steam installation, existing mod-manager profiles, or real saves.

If a show will not start

  • Use opens settings: equip a torch, then use the fuse again. Shift + Use always opens arrangement while idle.
  • Use lights the launcher when you wanted to load it: put away the torch first, then open the ammunition box.
  • The board reports no ready launchers: match its rune, keep launchers within 40 metres, load native firework ingredients and close their inventories. Check the board preview for excluded pieces.
  • The show stopped after a restart or owner disconnect: this is intentional recovery. Check the remaining load and light the fuse again. Saved shows do not resume automatically.
  • A linked launcher's fuse slider seems ignored: the board supplies the shared fuse length; the launcher's own fuse is used only when lighting that launcher directly. Its delay and shot interval still apply to board shows.

Tested scope and limitations

The equipment uses geometry assembled from vanilla chest materials and simple timber/tube shapes. It is not finished custom art. A visual pass verified timber materials, the setup panel, a fuse countdown and visible native rocket trails/bursts. The fuse has procedural sparks, a light and generated sizzle audio; the sound mix and close-up particle quality still need review. The test session was muted.

The scheduling code uses shared game time, owner-only ammunition changes, network effect prefabs, authenticated interaction requests and idempotent arming. Separate local processes have exercised native TCP replication, remote ignition, split ownership, cancellation and a real socket disconnect followed by a fresh client reconnect. An official dedicated-server binary with two clients has also relayed shows and matching effect identities. An additional late-joining client received an already-running show without resetting its timing or replaying the expired first rocket. A separate save-and-restart test restored an actively burning show, cancelled it safely, preserved ammunition and allowed a fresh show. These private loopback tests do not establish Steam/crossplay authentication, real-world latency, interrupted-save/power-loss recovery or compatibility with other mods. See TESTING.md for exact evidence and qualifications.

For conservative recovery, ownership changes, controller loss, scene reloads and stale controller heartbeats cancel remaining shots. A shot more than 250 ms late is skipped without consuming ammunition. Large shows under load can therefore omit shots rather than unleash delayed bursts. Inventory is locked while a launcher runs. Shows do not execute in unloaded areas.

A forced private server crash after one unsaved shot restored the previous save: ammunition returned from three to four, and the interrupted show did not replay. Skyforge follows native world-save rollback; it does not guarantee exactly-once ammunition spending across an unsaved crash. Interrupted saves and power loss have not been tested.

The Bifrost, World Tree and Mjolnir effects are original procedural effects with one network object per rocket and local particles driven by a shared birth time. They ascend about 40 metres and expire automatically. They are visual effects with no added damage. Five premade vanilla shows are included, as described above. A full timeline editor, long fuse paths, polished equipment models and further effects remain future work. The current setup saves each piece's timing and burst choice; saving your own named whole-show files is not implemented.

Development

Run Build.ps1 with .NET SDK 9 and .NET Framework 4.8 reference assemblies installed. The project references locally installed game/BepInEx assemblies; adjust GameManaged and BepInExCore MSBuild properties on other machines. No game assemblies are included in the distributable.

Prepare-Private.ps1 copies the installed game into this project's runtime/game, disables cloud save support in that copy, fixes its save root to runtime/saves, disables game preference writes and redirects Unity's native preference namespace. Launch-Private.ps1 verifies isolation hashes and starts the native harness headlessly. Steam must be running and accessible to the test process. -Visual is for a desktop session explicitly available for testing; -Reload checks the saved test fixture. Never copy the patched private game assemblies into the real game.

The private visual fixture uses F6 to focus the next piece, F5 to invoke native alternate interaction, F8 to equip/unequip its test torch, F7 to view the sky from 60 metres back, F10 to refill idle fixture launchers, F11 to export a genuine game screenshot, F4 to arm an automatic Mjolnir burst capture, F12 to log current fixture settings/stock, and F9 to quit. Use -Visual -Night for the private clear-night preview. Windows automation reaches legacy Unity input but not this game's newer input system, so the fixture bridges synthetic E to Valheim's native hover dispatcher. These shortcuts and the bridge exist only in the excluded test DLL. They do not establish human keyboard or gamepad coverage.

Prepare-Private.ps1 -RuntimeName runtime-client prepares a second independent copy. Launch-Network.ps1 verifies both copies, refuses to launch alongside existing games, and starts the loopback host/client fixture. Its private native OpenServer patch blocks lobby registration. Both runtimes and their coordination files are excluded from delivery. Do not relocate a prepared runtime: its save root is embedded and hash-checked.

Launch-Network.ps1 -Reconnect adds an actual socket disconnect during a burning fuse, then launches a fresh client process and verifies safe recovery. For the dedicated fixture, obtain the official dedicated-server files separately, prepare them with Prepare-Private.ps1 -RuntimeName runtime-server -SourceGame <server-folder>, then run Launch-Dedicated.ps1. That fixture needs all three isolated runtimes. Its test-only patches suppress lobby registration and the Steam query listener; gameplay uses a loopback TCP socket. Steam can still open background API sockets. Use Launch-Dedicated.ps1 -LateJoin for the separate mid-show connection fixture. Use Launch-Private.ps1 -Placement for native recipe discovery, resource/range gates, construction, container interaction and idle dismantling in a separate disposable character/world. Use Launch-Private.ps1 -Stress for the bounded headless sixteen-launcher scheduling and cancellation fixture. These are development fixtures, not live-server launch scripts.

Changes in 0.5.2

  • Minus/plus controls adjust fuse, delay and interval by 0.1 seconds, and rune/shot counts by one. Existing limits remain enforced.
  • Fractional fuse values display to one decimal place, so a stored 9.1-second fuse is shown as 9.1 rather than 9.
  • Changes remain drafts until Carve settings. Timing rules, networking, inventory, effects and saved-carving format are unchanged.

Changes in 0.5.1

  • Remember carving stores one launcher plan in the current profile; Recall can reuse it after restarting the game. It still previews the plan until Carve settings is selected.
  • Invalid stored plans are ignored. If a save fails, the carving remains usable for the current session and the panel reports that limitation.
  • The local record is in BepInEx/config/SmeagsMods.SkyforgeFireworks.cfg. It is independent of world saves and is not sent to other players by the mod. This is one replaceable launcher plan, not a named whole-show library.

Changes in 0.5.0

  • Rune cycle alternates the three original custom bursts from one launcher, with normal native ammunition costs.
  • Opening, Volley and Finale rhythm carvings prepare shot count and interval without changing the rest of your arrangement.
  • Remember/Recall copies one launcher plan during the current game session; applying remains an explicit Carve settings action. This is not a named whole-show preset or a disk-based preset library.
  • Scrollable arrangement content with fixed apply/cancel controls accommodates the expanded controls.

Changes in 0.4.0

  • Mjolnir: an original 208-particle gold hammer silhouette flanked by blue lightning. It uses the same native ammunition, shared birth time and automatic expiry as the other custom bursts. Its flat silhouette faces the launcher's placement direction; view it from the front rather than edge-on.
  • Documented forced-crash behavior: no automatic show replay in the tested fixture, but unsaved ammunition spending rolls back with the world save.
  • Traced the socket-disposal warning to a caught native CustomSocket receive callback during disconnect. No production network patch or warning suppression was added.

Changes in 0.3.2

  • Launcher hover text shows its selected burst and how many shots are loaded.
  • With a torch equipped, the hover text explains how to open the ammunition box; putting it away restores the loading prompt.
  • Settings label the launcher's standalone fuse separately from the board's show fuse. A board always supplies the shared fuse duration for a linked show.
  • Private dedicated-server save/restart recovery tested with a burning show on disk, a fresh client process, preserved ammunition and a successful relight. This covers an orderly saved shutdown, not an unsaved crash.

Changes in 0.3.1

  • Fuse audio follows the native SFX mixer and reuses one generated clip across burning fuses.
  • Custom bursts preserve the launcher's orientation, including on remote clients.
  • Custom rockets play separate native launch and explosion sounds on their shared timeline, removing the inherited extra explosion delay. Stale sounds are skipped when a rocket arrives late.
  • Expanded private validation covers socket disconnect/reconnect and the official dedicated-server executable with two clients. Listening and external Steam/crossplay testing remain open.

Changes in 0.3.0

  • Original Bifrost rainbow rings and green-and-gold World Tree bursts, selected per launcher and stored with its settings.
  • A shared network birth time drives custom ascent/burst rendering; the launcher owner creates one rocket object and spends ammunition once.
  • Softer procedural fuse hiss and crackles, volume fades on ignition/snuff, and ember travel scaled to the selected fuse duration.
  • Private two-process loopback harness covering remote ignition, split ownership, replicated effect identities, cancellation and ownership transfer.

Changes in 0.2.0

  • Live rune readiness preview, including the ammunition-limited shot total and timing of each launcher.
  • Standalone ammunition/timing summary, including partial loads.
  • In-game feedback for empty runes, empty or open boxes, and nearby shows already using the rune. Feedback is accepted only from the piece's current network owner.

Changes in 0.1.1

  • Correct wood and fuse materials; the fuse board no longer restores the chest's wear/snow visuals.
  • Larger, opaque setup panel with readable text and working mouse sliders/save controls.
  • Empty or open launchers no longer occupy the controller's 16 eligible-launcher slots.
  • Private visual fixture places all three pieces through the native Hammer pipeline and supports inspecting a configured show.

https://discord.gg/bfbb4yY6pt