0.3.4 2026-05-31
more BepInEx log cleanup, picking up where 0.3.3 left off. console at default should be near-silent during normal play now. Also, making some changes and preparing to start testing against the PTB.
Bug Fixes
- Paladin pal_cap2 axe (Cleaving Light) chain VFX was throwing a NullReferenceException for the last 1-3 frames of each chain attack, visible as repeated console errors during fast axe combat. The chain visual handed off to its impact + after-trail effects cleanly, but the parent object kept ticking against the already-destroyed line references until its own destroy timer caught up. Cosmetic only (no gameplay impact); the parent now stops updating the moment the handoff completes.
- Player ability state wasn't fully cleared on death. Headline symptoms: dying with Envenom prepped left the weapon glow stuck on respawn and a fresh cast could stack a second one on top; Chain Lightning's blue weapon glow stayed visible to other players after you died toggled on; other toggles and channels (Whirlwind, Ice Block, Tempest, Spell Barrier, Divine Shield, etc.) didn't tear down cleanly either. Death now runs the full ability-state clear, with two intentional carve-outs: cooldowns still tick through respawn (not reset, this is balance-intended), and your view of allies' VFX (their envenom glow, ice blocks, paladin auras hitting you) stays intact through your own death. Paladin slot-passive auras (Seal of Light / Ward of Faith / Sanctuary) keep emitting through the caster's death since the slot itself stays valid.
- On-hit procs were rolling on every damage event routed through Character.Damage, not just real hits. That meant weapon affix procs (Burn/Freeze/Shock/Poison/Stun/Slow, Lifesteal, Vampiric, HealOnKill, SoulHarvest) plus a long list of talent procs (Hunter Thunderstrike, Rogue Venomous Strikes / Toxic Precision / Nerve Toxin / Assassin's Mark, Mage Firestarter / Arc Conductor, Paladin Burning Conviction / Wrathful Strikes / Soul Chill, Divine Arsenal, Zealot's Conviction) were firing on DoT ticks (Bleed/Burn/Poison), on Chain Lightning chain links, on Arc Conductor chains, on Paladin Cleaving Light axe chains, and on proc-spawned secondary damage. Storm Weaver's Thunderstrike was the worst offender, its own AoE hitting 10 nearby mobs rolled the proc 10 more times. Procs now fire only on real attack hits: direct weapon swings or attack-flagged abilities (each Multishot arrow, each Piercing Shot pierced target, each Tempest Ascent strike). Chain links and DoT ticks no longer roll procs. Felt change: chain-heavy builds (Chain Lightning toggle, Arc Conductor talent, Paladin axe Cleaving Light) deal less incidental affix-proc damage from chain links. That was always a bug being exploited; if a chain build feels weaker, that's the fix landing, not a regression.
- Stack overflow crash when standing near a mob with an active Bleed/Burn/Poison DoT and specced into Hunter's Gathering Storm. The talent's "every 5th consecutive ranged hit triggers a lightning AoE" counter advanced on every Character.Damage event you caused, including DoT ticks, a single Bleed ticking on an idle mob filled the counter to 5 in five seconds. Worse, the AoE payoff hitting nearby mobs re-advanced the counter on each one and re-fired the AoE recursively until the stack overflowed and the game crashed. Counter now only advances on real arrow hits + attack abilities, and the AoE burst is wrapped so it can't feed itself. The same crash shape was latent on Mage Spellblade's elemental burst (every Nth melee hit triggers an AoE), never reported because no one tested it with Bleed on the target, but it would have crashed identically. Fixed in the same pass.
- Hunter 1H+crossbow loadout was broken in four ways, all from the bow-combo logic treating crossbows the same as bows even though crossbows use a different loaded-state model. (a) Every RMB press reloaded the crossbow, the State A↔B swap called SetupEquipment which nulls Player.m_weaponLoaded each time, and nothing preserved the loaded state across the swap. (b) Releasing RMB mid-reload left you stuck in the reload animation with an unloaded crossbow on your back, the vanilla reload action kept ticking against a stowed weapon, completed against nothing, and the crossbow never loaded. (c) Holding RMB pulled the crossbow into the block pose (crossbows have no aim animation; RMB-hold should be a visual no-op, not a block). (d) The crossbow incorrectly spun the bow-draw sweet-spot HUD even though crossbows don't draw. Fixed: loaded state now latches onto the crossbow's item data across the stow/unstow cycle and persists across logout; mid-reload RMB-release cancels the reload cleanly so the anim lock releases instantly and you can swap to the sword the moment you release; block input is suppressed when wielding a crossbow so RMB just brings the weapon up; the sweet-spot draw model is bow-only with crossbows routed through the inert path. Siege Engine works correctly with all four, magazine count persists across A↔B swaps, mid-reload cancel clears Siege state without touching the magazine (early-reload-hotkey bolts already paid at press-time are still forfeit on cancel by design, matching Valheim's pay-at-queue pattern). RMB now does what you expect: hold to bring the crossbow up (LMB fires while held), release to swap back to the sword (LMB swings while released), no animation thrash or stuck states in between.
Refinements
- Six more tranches of console cleanup beyond the 0.3.3 pass: total active log surface down from 443 lines to 283 (about a 36% reduction). Per-tick, per-hit, per-spawn, per-equip narration is gone from the default log level. If you used to see logs scrolling during normal play, that's silent now unless you opt in.
- New: [Debug] VerboseLogging cfg toggle. Off by default. When you do want to dig into RPC traces, ability VFX setup, drop table walks, and the other deep diagnostic streams, flip BepInEx to Debug AND set this on. Two-gated on purpose so users investigating one issue don't get drowned by every verbose channel at once.
- The 15 SE_VA_X status-effect registration lines that fired at every ObjectDB load are now a single aggregate line. Repeated CopyOtherDB loads with no new SEs to register stay silent entirely.
- [VisChange] enemy nameplate visibility transitions (was firing per mob, every time a nameplate flipped, even during normal play) moved to the new verbose stream. Was the loudest survivor of the first pass.
- Harmony patches now apply one-class-at-a-time with per-class error handling instead of a single all-or-nothing PatchAll call. Previously, if a single patch class in the mod targeted a Valheim method whose signature changed (the exact scenario that lands on us every major Valheim update), the whole patch pass aborted and the entire mod failed to load, every feature dead, not just the broken one. Now a broken patch disables only its own feature, logs the failing class name + full exception, and the rest of the mod keeps working. Boot log gets a summary line on every launch: "[VA] Patches: 93 applied, 0 skipped." on a healthy version, or a red "[VA] Patches: 91 applied, 2 skipped: <class names>" when something's broken, so on Valheim update day you can see at a glance which patches need fixing without having to bisect.