Valheim
You are viewing a potentially older version of this package. View Latest Version
Install with App

Details

Date Uploaded
2 weeks ago
Downloads
67.1K
Size
33KB
ADDatHost Valheim hosting
€1

Unshamed

Valheim 1.0 will not give you achievements if you run mods. Not cheat mods, any mods. BepInEx sets a flag the game reads as "cheated", so a game with nothing but a font fix installed is disqualified the same as one with a cheat menu.

Unshamed stops the achievement system reading those flags. It never clears one. Vanilla still records everything it always recorded, so a spawned item is still a spawned item and a server still sees it that way. It can also hand back what you already earned while the game was refusing to count it.

Client side only. Nothing syncs, nothing is needed on the server.

TL;DR

  1. Drop it in and launch. Achievements work again. That is the whole mod, nothing to configure.
  2. Been playing modded since 1.0 dropped? Open the console with F5 and type unshamed retro. It lists the achievements you already earned but were never given.
  3. unshamed retro apply takes all of them, or unshamed retro apply 2 5 9 takes only the ones you point at. Nothing is granted until you ask.
  4. unshamed status if you just want to check it is working.

Why you were locked out

1.0 decides with Achievements.IsCheatedAtAll():

m_cheatCheckCache = (usedCheats | anyCheatedItem | worldCheated) != 0 || Game.isModded;

Four things, ORed. The last one is Game.isModded, which the BepInEx Valheim pack sets itself through a method called SetIsModdedTrue, for every install, whether or not a single mod asked for it. That is why nobody running mods earns anything. The other three are permanent in their own way: m_usedCheats sticks to your character forever after one debugmode, and the world mark lives in the world file.

So Unshamed makes that method answer false and leaves all four flags on disk untouched. Your character is never finished. Type debugmode, spawn a wolf, whatever, achievements keep working, and the flags are still there for anything else that wants to read them.

What it will not do for you

This is a client mod, so I want to be blunt about where the line is. Unshamed changes one method's answer. It never writes a cheat flag, in either direction.

  • PlayerProfile.s_bypassCheatChecks is never touched. That static is the real switch. Vanilla checks it before it stamps m_cheated on a spawned item, on smelter output, on default container loot, on location spawns, on damage from a cheated weapon. Flip it and none of that gets marked. It stays false.
  • m_usedCheats is never cleared. unshamed audit will still show it true.
  • The Cheats counter is never zeroed.
  • Spawned items still carry m_cheated, and it still travels with the item through ZDO, stacking, containers and cooking. Nothing about spawning on a server changes with this installed.

The one thing that behaves differently is what Achievements.IsCheatedAtAll() returns, and only outside the console. Uninstall the mod and vanilla reads the same flags it always would have, so nothing has been laundered.

confirmcheats

debugmode and friends want confirmcheats first. That prompt reads IsCheatedAtAll() too, so a mod that always answers "clean" makes vanilla ask you to confirm on every command and never accept the answer. That is the loop people hit in 1.0.0.

The mask steps aside for the duration of any console command, mine excepted. So the terminal sees the honest flags and behaves like an unmodded game: it asks once, confirmcheats sets m_usedCheats for real, and it stops asking. setkey works the same way. Achievements go on ignoring the flag afterwards, which is the whole point.

The other half of the damage

Losing the unlocks is not all of it, which is why I bothered with the retroactive part. Your stats live in ten buckets:

this.m_playerStats[0].m_stats.IncrementOrSet(stat, amount);   // always counts
if (!Achievements.CanGetAchievements(cheated)) return;
this.m_playerStats[1].m_stats.IncrementOrSet(stat, amount);   // only if you count as clean

Bucket 0 is everything you ever did. Bucket 1 is what the game was willing to credit, and Achievement.CheckUnlocked() reads that one. So every hour you played modded went into bucket 0 and nowhere else. You were missing the unlocks and building no eligible history at all.

Getting back what you earned

Opt in, look first, pick what you want. Nothing happens on its own unless you deliberately turn it on.

unshamed retro shows you the list:

7 achievement(s) your character already earned:
   1 KillAllCreatures            Hunter
   2 FindAllTrophies             Collector
   3 AllFoodEaten                Gourmand
  ...
'unshamed retro apply' takes all of them.
'unshamed retro apply 1 3 4' or 'unshamed retro apply <id>' takes only those.

I am not guessing at that list. It copies the stats in, asks vanilla's own CheckUnlocked(), then puts your profile back exactly as it was. Iron Gate's criteria decide what you earned, and I would rather it stayed that way than have me writing my own rules about what counts.

Picking is not cosmetic. unshamed retro apply 1 3 copies forward only the stats and entries those two achievements read, gathered the same way Achievements.ResetAchievement gathers them in reverse. The ones you skipped stay genuinely locked, because the numbers behind them never moved.

Only the Any difficulty bucket gets filled. I am not filling the Hard or Hardcore tiers for you, that would be claiming a run you cannot prove you did, and Any is what most achievements ask for anyway.

If you would rather not think about it, the Enable Retroactive config toggle grants everything once on your next load. It is off by default, and you do not need it for the console command to work.

Commands

Press F5 for the console.

Command What it does
unshamed status Are you eligible, and why. Start here
unshamed retro List the achievements you already earned, numbered. Changes nothing
unshamed retro apply Grant all of them
unshamed retro apply 1 3 4 Grant only those, by number off the list
unshamed retro apply <id> Grant one by id, e.g. unshamed retro apply KillAllCreatures
unshamed list [filter] Every achievement, its id and lock state. unshamed list troph filters
unshamed audit The ten stat buckets, and everything a cheat check could read off your character
unshamed recon Dump the achievement system to BepInEx/config/Unshamed_recon.txt

If retro says you are still cheated

With Ignore Cheat Flags on it will not. Turn that off and you get vanilla's answer, and unshamed status names which of the four tripped: Game.isModded, m_usedCheats, a spawned item in your inventory, or a world whose m_startingGlobalKeys hold something you could not have set through the World Modifiers menu.

Config

Azumatt.Unshamed.cfg

  • Enabled: master switch. Off means the mod touches nothing.
  • Ignore Cheat Flags: the actual fix. On by default. Achievements stop reading Game.isModded, m_usedCheats, cheated items and cheated worlds. Nothing gets cleared. Turn it off and you are back to vanilla, disqualified for having BepInEx.
  • Show Popups: play the vanilla unlock popup for each retroactive grant. Off, because a big backlog is a lot of popups at once.
  • Enable Retroactive: off by default. On means grant everything automatically on next load, without showing you the list. Leave it off and use the console if you want to choose.
  • Force True Methods / Force False Methods: comma separated Type::Method whose bool return gets forced. A hatch for when a game patch moves something and the mod stops working. Point it at the wrong method and you have built yourself a cheat, so keep it empty unless I have told you what to put in it.

Caveats

Achievements are not free. If your character genuinely never did the thing, nothing unlocks, because vanilla is the one checking.

Retroactive only fills the Any bucket, so difficulty-gated achievements still want a real run at that difficulty.

The only thing this mod writes into your .fch is the stats you asked it to copy forward. If you ran 1.0.0, that build did zero out m_usedCheats and the Cheats counter on your character. Nothing brings those back, and 1.0.1 will not do it again.

Retro copies bucket 0 forward, and bucket 0 counts everything, including a pickup off a spawned item. Vanilla keeps no marker on those rows, so I cannot tell them apart and neither can you. If that bothers you, do not run retro on a character you spawned things for.

Granting an achievement has no undo in the public build. Preview first, that is what it is for.



Feel free to reach out to me on discord if you need manual help. AzumattDev on Discord.

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