Valheim
Install with App

Details

Latest version
1.7.0
Last Updated
First Uploaded
Downloads
1.8K
Likes
3
Size
176KB
Dependants
ADDatHost Valheim hosting
€1

Changelog

Notable changes to Rist. Format follows Keep a Changelog, and the mod uses semantic versioning.

[1.7.0] - 2026-09-24

Fixed

  • Sprinting could be free. The game adds run-stamina discounts together and stops at zero. Tireless, Long wind and Long stride at rank 5 came to -51%, Eikthyr's power is -60%, and the two together hit zero. MinRunStaminaCost puts a floor under it: at the default of 0.2, sprinting always costs at least a fifth of its normal rate. Either source on its own stays above the floor and is unchanged. Reported by AllHailPidgey.

Changed

  • No capstone touches running any more. All three movement stones finished on run stamina, which is how the stack got that deep.
    • Tireless: stamina starts coming back 0.6s sooner after you stop spending it, out of the game's 1 second pause.
    • Long wind: +10% stamina regen on top of the +8% a rank, the same shape as Brimming.
    • Long stride: you jump 15% higher. The landing is measured from the height a normal jump would have reached, so your own jumps never hurt more than they did before. Jumping off a ledge still hurts for the drop below where you left the ground.
  • A full hand of all three now takes 25% off running rather than 51%.
  • Steady footing takes 5% off stagger a rank instead of 6%, 25% at rank 5.
  • Ox-backed's last rank no longer touches stagger. Walking while over your carry limit costs half the stamina instead, 5 a second rather than 10, so you can shuffle twice as far before you have to drop something. You are still slow and still cannot run or recover stamina.
  • Together with Fader's power, which is -50% stagger on its own, the old Steady footing and Ox-backed made each hit fill the stagger bar at a twentieth of its rate. It is a quarter now.

Added

  • Three specials for cards.txt: *staminadelay, *jumpheight and *overloaded. *jumpheight is a share of how high you jump, not of jump force; 15% more height takes about 7% more push. The delay never drops below 0.25s, because at zero stamina would refill during a sprint.
  • rist show prints the run-stamina multiplier the game is actually charging, the stamina delay and the jump height, which is what the new scenarios check.

[1.6.0] - 2026-09-22

Added

  • A rist console command, for singleplayer and for whoever is hosting. rist show prints this character's level, xp, ranks and the armour the game is actually using; rist rank <card> <n> forces a card to that rank. It needs devcommands, and the game's own cheat gate is ZNet.IsServer(), so a client cannot point it at a dedicated server's records. Ranks were otherwise only reachable by clicking the panel, which put five ranks nine skill levels away from anyone balancing a stone.

Changed

  • Thick-hided is a percentage now: +3% armour a rank instead of a flat +2, and another 5% at rank 5 in place of the stagger capstone, so a fully carved stone is +20% armour. The game takes dmg * dmg / (4 * armour) once your armour is at least half the hit, so damage taken is inversely proportional to armour and the old flat +10 cut about a third of a hit at 20 armour and under a tenth of it at 100. It stopped mattering around the Plains, which is where Rattennest raised it on the ideas board. A character with ranks in Thick-hided keeps them and those ranks buy the percentage.
  • Steady footing's capstone is +5% armour instead of +2. Its capstone has always been a dose of whatever Thick-hided gives per rank, so it follows the change above, and no card grants flat armour now. The one place a flat number was better is the other branch of the curve, a hit bigger than twice your armour, where the game subtracts rather than divides: +2 saves 2 damage there and +5% saves 5% of your armour, so the old value only won below 40 armour.

[1.5.1] - 2026-09-20

Fixed

  • The runestones sometimes showed plain letters instead of runes. Logging out to the main menu unloads the part of the game that holds the rune font, and the panel kept drawing with the font that was gone until the game was restarted. Rist now uses the game's permanent copy of its fonts, which is never unloaded, and rebuilds the panel if a font it uses disappears anyway.
  • Long capstone text was cut off on the right. The lines beside a stone (now, next and capstone) wrap onto a second line instead.

[1.5.0] - 2026-09-15

Added

  • Quick chant, in Combat: staffs cast 3% faster a rank, both Elemental and Blood magic. Its capstone means a hit cannot stagger you out of a cast until the spell has left the staff, every projectile of it for a staff that fires several. Staffs that fire several projectiles per cast fire all of them at the faster speed. A looping staff that pays its eitr once per hold is not sped up, since that would be free projectiles rather than a faster cast.
  • Answering blow, in Combat: a perfect dodge with an enemy nearby arms your next hit on an enemy for 4 seconds, 10% more damage a rank. At rank 5 that hit has a 30% chance to stagger anything a parry would, never a boss.
  • Low draw, in Stealth: drawing a bow from a crouch still counts as sneaking for the first second of the draw a rank, along with the shot itself. The game stands you up to draw and used to stop counting you as sneaking; the character still rises. At rank 5 arrows loosed from a crouch make no noise where they land, so a miss does not alert the animals around it.
  • Unseen blow, in Stealth: sneak attacks hit 10% harder a rank, with weapons that have a sneak attack. At rank 5 a sneak attack staggers the creature, once per creature every five minutes.
  • Deep draught, in Endurance: buff meads last 10% longer a rank. At rank 5 each buff mead has a 25% chance not to be used up when you drink it. It covers Fire Resistance Barley Wine, Frost and Poison Resistance Mead, Berserkir Mead, Mead of Troll Endurance, Draught of Vananidir, Brew of Animal Whispers, Tasty Mead, Anti-Sting Concoction, Love Potion, the Lingering Healing, Stamina and Eitr Meads, Tonic of Ratatosk and Lightfoot Mead. It does not cover the Minor, Medium and Major Healing Meads, the Minor and Medium Stamina Meads or the Minor Eitr Mead, which restore. A longer Lingering mead also keeps its matching potions locked out for longer.
  • Oath-bound, in Utility: the forsaken power's cooldown is 5% shorter a rank. At rank 5 the blessing lasts a minute longer for everyone it reaches when you cast it, for every power. Cast by someone without it, it lasts the normal time for everyone.
  • Soft step's tile reads "detection" and Tireless's reads "move stamina", and the panel's cells and towers sit a little closer. The longest value line was widening every cell, which on a 1920x1080 screen pushed five towers off their full-size layout onto small lying stones.

Changed

  • Quick draw now reloads a crossbow faster too, at the same 3% a rank it draws a bow. The crossbow's reload is most of its firing cycle, and the card used to leave it alone.
  • Quick draw's capstone is bow and crossbow damage. It was 5% damage to every weapon, the same as Keen edge. A fully carved Quick draw no longer adds 5% to melee.
  • AttackSpeedMax now also caps how much Quick draw shortens a crossbow's reload and how fast Quick chant runs a cast, and its description in the cfg says so.

[1.4.1] - 2026-09-14

Changed

  • The rists panel sits at the top of the screen instead of in the middle, so a short field no longer floats with empty space above it.

[1.4.0] - 2026-09-14

Six runestones did not do what their tile said. Tireless, Long wind, Long stride and Quick draw each had a part that did nothing, and Soft step and Quiet wake made you easier to see. Your ranks are kept and now take effect.

Fixed

  • Soft step made you easier to see. Stealth in Valheim is a multiplier on how far away a creature spots you while you crouch, so lower is better, and Soft step added to it. A fully carved Soft step could have you seen from up to 40% further away while crouching in the dark or at a higher Sneak skill, and it never helped. It now takes 8% off that distance per rank, as the tile always claimed. Quiet wake's capstone had the same mistake and is fixed the same way. The tile now reads "sneak visibility", since "-40% stealth" would read as a loss.
  • Three running discounts did nothing. Tireless's per-rank running discount, Long wind's capstone and Long stride's capstone all changed a stat the game never reads. Sprinting is charged through a different one, and all three now use it. Tireless's capstone was already on the right stat, so it now stacks with a working 5% a rank.
  • Quick draw did not speed up drawing a bow. It sped up the release, because swing speed is the animation and a bow's draw is a timer the animation never touches. A bow now reaches full draw 3% faster per rank, and damage, arrow speed, the reticle and the bow's bend all follow. On a crossbow it still speeds up firing, not reloading.

Changed

  • The rists panel stands the runestones in ættir. Combat, Survival, Endurance, Stealth and Utility: towers two stones wide under a heading and a carved count, side by side. It fits the screen it is on instead of being a fixed width, so it no longer runs off the bottom of a short window, and a new ætt adds a tower to the right instead of a row. On smaller screens it tries smaller stones, then lays the ættir down, and only then drops the value line from the tiles; it never scrolls. The stone the column beside is describing now has its name in gold, and that column names its ætt.
  • PanelColumns is gone, since the panel works out its own layout. PanelBottomInset is new: set it if a taskbar covers the bottom of the game window. It stays your own setting on a server. An old cfg keeps the PanelColumns line, which does nothing.
  • The labels in the column beside the stones are 12px, up from 11.
  • cards.txt is regrouped under ætt headings, so client and server need the same build. No runestone's id changed, so every rank is kept.
  • Weatherly's tile reads "-6% dead zone" rather than "+6% sailing into the wind", naming the black arc on the wind ring that it actually narrows.

Added

  • Rist warns at load if a runestone names a stat the game never reads, or gives a stat where lower is better a positive value. Both mistakes load cleanly and show a believable number on the tile, which is how these shipped.
  • AttackSpeedMax now also caps how much Quick draw shortens a bow's draw, and its description in the cfg says so.

[1.3.1] - 2026-09-12

Far sight and Weatherly did nothing in 1.3.0. They work now. Update if you carved either one; your ranks are kept and take effect.

Changed

  • Weatherly now makes you faster to windward. Each rank narrows the dead zone and points the sail's push toward the bow inside the arc it opens, so a fully carved card moves your best upwind heading from 52 degrees off the wind to about 36, roughly 71% faster. Dead upwind still stalls, so tacking is shallower rather than gone. It used to only narrow the zone, which did nothing you could feel: the game aims the sail's force sideways near the wind, so every heading the card opened was slower to windward than vanilla's own best.
  • Weatherly's capstone makes you row faster rather than tack faster. Rowing is a separate force from the sail, and it is what you are left doing when you still cannot point high enough. It applies forward and back.
  • Weatherly and its rowing capstone apply only to a ship you are steering, read from the helm itself, so a passenger cannot sail someone else's boat on their own runestones.
  • With Weatherly carved, the wind ring's black dead zone narrows to match. It used to keep showing vanilla's, so the boat sailed with the wind pointer sitting in the black. The black now ends where the sail is half drawn, on both sides of the bow. Without the card the ring is untouched.

Fixed

  • Far sight and Weatherly did nothing in 1.3.0. Their patches were written but never registered, so no map widened, no dead zone narrowed and no boat rowed faster, and a fully carved Weatherly sailed exactly like none. Nothing failed and nothing was logged. Both work now, and Rist checks at startup for any patch that was written but never applied, and logs an error naming it. If you spent picks on either in 1.3.0, those ranks are kept and now take effect.
  • Several runestone values showed as raw numbers. Far sight and Weatherly read "+0.1 map sight" where they meant +5%, and Tireless's capstone read "-0.2 m_runStaminaDrainModifier", with no name and the value rounded to the wrong number. They read as percentages now, and Rist warns at load if a card's value would be shown as a raw fraction, so the next one is caught before it ships.

[1.3.0] - 2026-09-12

Added

  • Far sight and Weatherly, two runestones that widen what the world gives back rather than what you do to it. Far sight multiplies Minimap.m_exploreRadius by 5% a rank, so the map uncovers further as you walk, with the capstone worth another 10%. Weatherly is the sailing one: Ship.GetWindAngleFactor kills the sail inside a hard cone around dead upwind, and that cone is the only reason tacking exists, so the card puts a floor under it and lets you point nearer the wind before the sail dies. Its capstone is 20% more speed while beating upwind.

    Deliberately not more move speed. That card is capped at 10% from a single source because a permanent speed buff is always on, never noticed while you have it, and a player told us Rist had made his unmodded playthroughs feel worse. Neither of these follows you home: a bigger map radius is felt only on ground you have not walked, and the wind cone only at sea with a sail up. Weatherly leaves the across-the-wind term alone and is clamped so upwind can never beat a beam reach, since raising that term would just be a flat speed bonus in a hat.

  • A Rist line above other players' heads - level, total XP, and days since their last death - written into the game's own nameplate rather than drawn beside it, so it inherits the plate's font, fade and distance rules. ShowPlate turns it off, PlateFormat is the whole of the presentation: fields, order, colours, and whether it wraps to a second line.

    The HUD half was one postfix. The data half is why this is more than that: nothing about another player's Rist state is on the wire, since the server pushes a record to the peer it belongs to and to nobody else. Each client now publishes its own level, XP and last-death day onto its own character's network object, which every client in range already replicates. The server cannot publish them instead - a write to a network object you do not own is discarded in silence - so a modded client can lie about its own plate. Accepted knowingly: the plate is decoration and the server's ledger still decides every pick.

    Days alive counts from the day the plate first saw a character, not from its creation. The game keeps no birthday, so every existing character reads 0 on the day this ships.

[1.2.2] - 2026-09-10

Fixed

  • Quick study's capstone read "+2 m_skillLevelModifier at rank 5". The panel builds each card's green line from a table of readable names and falls back to the game's own field name when there is no entry, and m_skillLevelModifier had none. It is "skill levels" now, and correctly not a percentage - the game adds it to the skill's level rather than scaling it.

    The card itself was always working. This was the label only.

    Checked against the whole catalogue rather than the one card that was reported: 25 effects are in use and this was the only one missing a name.

Changed

  • An effect with no readable name now says so at load, naming the card. The fallback to the raw field name is right - a card with an unnamed effect still works and still says how much it gives - but it was silent, so this sat on a player's screen for a release and was found by somebody sending a screenshot. Cards.Load cross-checks every card's effect and capstone against the label table and warns once.

[1.2.1] - 2026-09-10

Fixed

  • The experience bar disappeared and never came back. It went the first time it was hidden - which on a dedicated server was immediately, before anyone saw it, and in singleplayer was the first time you died or pressed the hide-HUD key.

    The bar is a clone of the eitr panel, and the eitr panel spends its life switched off for a character with no eitr: vanilla's hide clip does not fade it, it deactivates its parts by name through AnimationObjectToggle. Everything the clone showed - frame, track, both fills, text - came from one SetBool("Visible", true) written once when it was built. The bar was then hidden and shown with SetActive, and disabling a GameObject disables its Animator; Unity's keepAnimatorStateOnDisable defaults to false, so re-enabling rebinds it and resets every parameter to its authored default. Visible went back to false, the show clip never played again, the parts stayed inactive, and nothing re-asserted it.

    It is hidden by a CanvasGroup alpha now, so nothing is ever disabled and nothing rebinds. The clone is also detached from the borrowed animator entirely at build time and brought up by hand instead - handing a permanently visible bar's visibility to a controller whose whole job is hiding the eitr panel was the mistake underneath. The flash on a waiting pick is driven here now rather than through the donor's trigger.

    Both GuiBar components are destroyed at build time as well, with what they point at cached first. That was the next failure waiting: this file already drives both fills by hand because GuiBar caches m_barImage in Awake and re-reads m_width on the first SetValue, and its comment noted that LateUpdate "never runs, because the donor's parts are inactive". Activating those parts made it run, and it would have squashed every width to m_width * value with an m_width captured from a donor whose fills are zero wide.

    Reported from the live server by a player and reproduced on two machines.

  • The "rist waiting" note is above the bar, and follows it. It was drawn at BarPosX and BarPosY, which are only where the bar is when BarFollowStamina is off - and that has defaulted to on since the bar started following the stamina bar, so the note sat at a point the bar had long since left. It is measured off the bar's real top edge now, taken from the union of its child rects rather than the root's own, which is a thin strip that runs through the middle of what you can see.

  • The bar no longer re-pins itself during a cutscene, when Hud has parked its whole root off screen at x=10000.

Changed

  • Every position in the [Bar] block is now measured against your HUD's canvas scale instead of in raw screen pixels. The bar's placement is a server setting - the host decides where it sits so that everyone on a server sees the same layout - and a raw pixel offset could not deliver that: 70 pixels below the stamina bar is a different place on a 1080p screen, a 1440p screen, and for a player running the HUD at 1.4. Multiplying by the scale factor Valheim's own CanvasScaler applies turns one imposed number into the same visual position on every screen. The IMGUI text scales with it too, with 12px as a floor rather than a fixed size.

    BarSize is deliberately untouched: it is set in canvas units and the scaler is already applying the same factor to it.

    On a screen at scale 0.93 this moves the bar about five pixels; the defaults are kept as round numbers rather than retuned to cancel that out on one particular monitor.

Added

  • BarNoteGap, the gap between the top of the bar and the note above it.

[1.2.0] - 2026-09-09

Rebuilt for Valheim 1.0. This version does not run on pre-1.0 Valheim, and the previous one does not run on 1.0.

Changed

  • Which stat fields count from 1 is now read off the game rather than from a list in the mod. A fresh SE_Stats carries its declared defaults, and a = 1f initialiser is exactly what "the neutral value is one" means, so the set can be asked for instead of remembered. It reproduces the same four fields today; the difference is a balance pass that makes another modifier multiplicative, which would otherwise have this writing 0.03 into a damage multiplier and cutting damage to 3% instead of raising it by 3%. Any disagreement with the four it was written against is logged.

[1.1.1] - 2026-08-29

Fixed

  • The plugin announced the wrong version of itself. 1.1.0 moved the csproj, the manifest and the toml and missed the BepInPlugin constant, which is the version the plugin actually reports and half of what Core's gate compares - so the package read 1.1.0 on Thunderstore and introduced itself as 1.0.1 on every connection. Harmless while everyone runs identical builds, and not harmless the moment they do not.

[1.1.0] - 2026-08-18

XP is now weighted by which skill it came from, not only by how far that skill got.

Why

The live server's ledger asked for this rather than a hunch. A character sitting at Rist level 12 held 1346 XP, of which WoodCutting alone was 666 - half the character was felled trees, and everything earned in a fight came to 293, under a quarter of the whole. The level had stopped describing the character and started describing how long they had stood in the Meadows with an axe.

The existing weighting compounded the wrong way. XP being the level reached is right on its own, but the safest repeatable activity in the game is also the one that climbs highest, so it was collecting the most level-ups and the most XP per level-up.

Raising LevelBaseXp or LevelExponent cannot fix that, and it is the obvious reach, so it is worth saying why not: both scale the whole curve, so the ratio survives untouched and the late game pays for a problem that lives in the first hour. That is exactly what happened when the pair was 60 and 1.5, and it had to be walked back.

Added

  • SkillWeights - a multiplier per skill, as Skill=multiplier pairs. The default table is built on risk: full price for a skill raised by something that can kill you, half for one that is situational, a quarter for repetition that cannot hurt you. Synced from the host, so a server sets it for everyone on it.
  • DefaultSkillWeight - what a skill not named in the table is worth. 1, so a skill added by a game update or another mod is paid normally rather than silently going unpaid.
  • WeightGeneration - bump it to any different text and every character is re-priced once, on its next login, from the skill levels this server watched it reach.

Changed

  • Existing characters are re-priced on their next login. The bundled generation is 1 and no existing ledger line carries a stamp, so this happens once, automatically. The character above goes from level 12 to level 6, with 53% of it now earned fighting.
  • Runestones already taken are kept. A character re-priced from 12 to 6 holds all twelve and earns no new pick until it passes twelve again. Refunding them would turn a re-pricing into a free rebuild of the whole character.
  • The join-time credit is weighted by the same function as the re-pricing, deliberately shared so the two can never drift apart.

Ledger format

The ledger is now v4, carrying the generation each record was last re-priced at. v1-v3 are still read and come back as never re-priced, which is what they are.

This is a one-way door. A v4 line does not parse on 1.0.1 or earlier, which drops the record rather than erroring, so copy rist-ledger.txt aside before updating a server you care about.

[1.0.1] - 2026-08-18

Documentation and the text players read, with no change to what the mod does.

Threshold is Dyrr

The companion mod that decides who may join a world was renamed, and Rist pointed at the old name in two places that matter: the config descriptions, which are read by anyone who opens rist.cfg, and the notes on what Rist deliberately does not do. Both now say Dyrr.

The README is shorter

The design argument and the technical notes moved to DESIGN.md, leaving the README as what someone reads before installing. The reasoning is all still there, one link away, rather than in front of a reader who only wanted to know what the mod is.

Its two links are absolute now. Thunderstore builds the package page from the README alone, so a sibling-folder path pointed at nothing there and DESIGN.md is not in the zip at all - both would have rendered as dead links on the store page and nowhere else, which is the kind of fault you only see after publishing.

Em-dashes are gone from the docs throughout.

[1.0.0] - 2026-08-16

First release. There is no 0.1.0 entry below it because 0.1.0 was never published. It was this same work under a version that had not yet been judged ready, and folding it in beats inventing a release nobody could have installed.

The line this sits on

It adds a level beside the skills. It never reads, writes, rescales or reskins a vanilla skill.

Valheim has skills but no character level. Rist adds one that runs alongside them. Vanilla skills are read and never written.

Levels and picks

  • Every character level earns one pick, spent on any runestone in the catalogue to raise it a rank, up to five.
  • Picks bank. Nothing expires and the panel waits.
  • No drawbacks. A runestone is a reward or it is nothing. A cost attached to a reward makes a pick something you can regret, and regretting a permanent choice is a reason to stop playing rather than a reason to think harder.

Free choice, not a dealt hand

An earlier version dealt three runestones per level, seeded so that quitting on a bad offer and returning re-offered the same three, since otherwise the pick is theatre, since anyone can reroll until they get what they want.

Choosing freely deletes that problem rather than defending against it: no roll to reroll, no offer to store in the ledger or on the wire, no second window with its own visibility rules. What it costs is the tension of a hand you are dealt. A free choice means the strongest runestone is always available, so balance now lives in the runestones themselves and in MaxRank.

The panel carries the weight for this: choosing between nineteen runestones is only a real choice if each stone says both what it is worth now and what the pick would make it.

Every fifth rank is a capstone

Taking a runestone the whole way grants something the earlier ranks did not hint at, rather than one more slice of the same number. It is what makes depth a decision against breadth instead of a rounding error: five ranks of the same small bonus is the same reward as five different small bonuses, so without this there was no reason to ever finish anything.

Capacity is a capstone, not a runestone of its own

This began as an inventory problem: late-biome kit eats the grid and leaves nothing for what you went out to fetch. The cheap fix is more rows, and that is exactly what Hoard argues against.

It was a runestone once, called Deep pack, and it was the strongest thing in the catalogue: taken first, every time, which is not a choice. A row now sits at the bottom of Ox-backed and of Sure hand, so capacity is the reward for taking a hauling runestone all the way rather than a purchase anyone makes on their first pick.

The panel

A fifth tab on the compendium bar, beside the raven and the trophy, opens a full screen of runestones, one per rist, each with its own outline, rock and marks, all seeded off the card id so a rist looks the same in every session and on every machine. A rank cuts one more mark into the rim, and the mark holds the level that bought it.

Three designs came before it: a draft window dealing three at random, a board of tiles, and that same board dressed in the game's own wooden sprites. The last is why this one exists. Borrowing a window frame is imitation, and it read as a different game no matter how close the sprites got. A runestone imitates nothing.

The bar

A fifth bar under stamina, cloned from one of the game's own so it carries the same frame, fill and trailing fill. It follows the stamina bar rather than sitting at fixed pixels, so "below stamina" stays true at any resolution and HUD scale, and it flashes while a pick is waiting.

Verdigris, because the HUD already spends red, yellow, blue and orange between its four bars and a fifth in any of those reads as one of them.

What the server decides

The ledger is held by the server and keyed to the platform identity plus the character, never to the character file. A character file sits on the player's own disk, so nothing that decides rewards may live there. The client reports only that a skill went up; every number is derived server-side.

Three ceilings bound what a report can be worth, because skills live on the client and a report is therefore a claim that cannot be verified, only bounded:

  • Reports per minute, which caps how many claims are accepted.
  • A one-level step, which caps how much a single claim may say. Skills level one at a time and fire one callback each, so a report naming a level far above the baseline this server watched that skill reach did not come from playing. This also protects the baseline, which would otherwise adopt the forged level and give every later claim an alibi.
  • XP per minute of connected time, which is the only cap that does not depend on believing the client at all. It banks three minutes so an honest burst, clearing a crypt levels four skills at once, is paid in full.

Nobody is disconnected and nothing is ever taken away. Rist used to refuse the connection, and a levelling mod deciding who may play means a bug in an XP system locks people out of a server. Refusing at the door moved to Dyrr, where it is the whole job and is done openly.

Cloning vanilla UI, and what it does not hand over

Both the bar and the compendium tab are clones of things the game already draws, which is what makes them match. What a clone does not bring is its own lifecycle: it has never run Awake, OnEnable or LateUpdate, because the donors sit inactive.

GuiBar puts something essential in each of those, so the bar failed three times over - the tint reached nothing, the width was discarded and re-derived from the donor's, and setting a value stored a number without drawing it. All three are ways of not reaching one line. The fill is written directly now, and the trailing bar lagged by hand.

The tab had the same shape of problem read from the other end: its gold is not in any sprite or any Image.color but in the Button's normalColor, applied to whichever graphic is its targetGraphic. Building a layer alongside it could never match; swapping the sprite on the graphic already being tinted inherits size, shadow, gold, hover and press at once.

The rule both arrive at: clone for geometry and sprites, drive the state yourself.

Core is optional

Rist installs and runs on its own. Core is a soft dependency; installing Rist no longer installs Core with it, and manifest.json no longer lists it.

Solo, nothing is given up, including the extra inventory rows, which now have a Rist-owned implementation used only when Core is absent. On a server, three things are lost, and the README section "Core is optional, and here is exactly what that costs" sets them out: the cards.txt hash check, the host-authoritative curve, and the arbitration of Inventory.m_height between mods. Rist logs a warning at startup naming all three.

The row fallback deliberately copies Core's Player.Load widening rather than simplifying it. That is not a nicety: without it every item in a granted row is destroyed by loading the game, silently, because AddItem drops any saved position outside the current grid and the rows are not applied until after the load. It is patched in only when Core is absent, so the two owners can never both write the field or both widen the grid.

Mechanically, as elsewhere in the suite: every Ezomic.Core call now sits in its own [MethodImpl(MethodImplOptions.NoInlining)] method behind a Chainloader.PluginInfos check, because the JIT resolves a method's assemblies when it first compiles that method, and an inline call would drag Core in before the check could prevent it. Verified by decompiling the built DLL: Suite.* and InventoryRows.* appear only inside those isolated methods.

A character arrives worth what its skills are worth

CreditExistingSkills, on by default, pays a joining character for the skills it already holds: turn up carrying skills worth twenty levels and you arrive at twenty levels with the picks to spend. XP is the skill level reached, so a skill at N has already produced N(N+1)/2; summing that over every skill is exactly what the character would hold had all of it happened here, which also makes it safe to re-run on every login and impossible to double-pay.

Off, only XP gained on this server counts and every character starts at level 0. Config syncs from the host, so a server picks one rule for everyone on it.

There is no untrusted state. A character above the baseline was briefly marked untrusted and paid nothing "until they line up again", which it could never do, because the withholding returned before the baseline was updated, and the login check only adopted a new baseline when it had found nothing wrong, so the baseline froze while the player's real skills climbed away from it.

Keeping a well-travelled character out of a world altogether is a door policy, and the door is Dyrr's.

Known limits

  • Never played at the shipping curve. The pick path was exercised against a deliberately cheapened one so it could be reached without grinding. LevelBaseXp and LevelExponent are back at 60 and 1.5, and how often a stone lights up at those numbers is still a guess.
  • Runestone balance is untested by definition. With free choice the strongest runestone is always available, and nothing has been played hard enough to find out which one that is.
  • Multiplayer has never had a second player. The version gate, config sync and catalogue hash all work host-side and against a dev server, but no remote client has connected.
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro