HappyPeak
Tired of a plain old climb? Spice up every PEAK run with a bunch of toggleable chaos events โ random tornadoes, banana rain, lit dynamite, chests that hatch zombies or summon the Scoutmaster, and more.
By Ninex
| Date uploaded | 4 months ago |
| Version | 0.12.0 |
| Download link | Ninex-HappyPeak-0.12.0.zip |
| Downloads | 2305 |
| Dependency string | Ninex-HappyPeak-0.12.0 |
This mod requires the following mods to function
BepInEx-BepInExPack_PEAK
BepInEx pack for PEAK. Preconfigured and ready to use.
Preferred version: 5.4.2403README
HappyPeak
Tired of a plain old climb? Spice up every PEAK run with a bunch of toggleable chaos events.
A host-side PEAK mod that randomizes chest loot, scales loot by a configurable multiplier, and adds a handful of independently-toggleable chaos events designed to make co-op runs more unpredictable.
Every event has its own on/off switch and tuning knobs. Don't like banana rain? Turn it off. Want zombies to come out of every chest? Crank ZombieTrapChance. The defaults aim for "noticeable but not run-ruining"; tweak as you like.
Only the host needs to install this mod. Clients see all the effects without installing anything โ every spawn / replacement happens host-side and propagates over Photon.
๐ฅ Strongly recommended companion: ModConfig
Install PEAKModding's ModConfig alongside HappyPeak. It opens an in-game GUI where you can flip any config value live โ no need to alt-tab, edit text files, or restart the game. Boolean toggles, sliders, etc. all work out of the box with HappyPeak's settings.
It's a separate mod (one-click install from Thunderstore). Without it, you have to edit BepInEx/config/HappyPeak.cfg by hand and BepInEx hot-reloads it.
โ ๏ธ Upgrading from an older HappyPeak version?
If you had HappyPeak installed and are updating to a newer version that added/removed/renamed config entries, delete BepInEx/config/HappyPeak.cfg before launching. BepInEx never rewrites descriptions or new entries into an existing cfg, so you'll lose new toggles otherwise. Your custom values get reset โ back them up first if you'd tuned anything.
If you're unsure whether the version you're updating to changed configs, just delete the cfg. It costs you a 5-second restart and avoids weirdness. (As of 0.12.0 the safe zone, invincibility, chest trap, and tumbleweed sections are recent additions; 0.11.x doesn't have them.)
Features
| Section | What it does |
|---|---|
[Randomizer] |
Every chest you open returns a random item from PEAK's full item database (minus a small blacklist of cheat / quest / cosmetic-only items). Bushes, vines, ground spawners and other scenery are not affected. |
[LootScaling] |
Multiply chest loot quantity by a flat integer. 1 = vanilla, 2 = double, 3 = triple, etc. |
[Tornado] |
Periodically spawns tornadoes targeting a random player on any biome (vanilla PEAK only spawns them on Mesa). Disabled at the Kiln by default. |
[BananaPeel] |
Banana rain: drops 2โ5 banana peels (random color) from above each player every wave. |
[Tumbleweed] |
Tumbleweed rain: same pattern as banana rain but with PEAK's native tumbleweed prefab. |
[Dynamite] |
Drops a stick of dynamite right in front of each player's face (head height, 1m forward). Default is unlit so the player can pick it up and use it; flip LightDynamiteOnSpawn to true for explosive surprises. |
[MarkerSpawn] |
Middle-click ping โ spawns a Mesa pickaxe (้นคๅด้) on the exact surface you aimed at. Up to 2 unclaimed pickaxes per player; a new ping past that destroys the one farthest from you (never yanking one out of your hand). Auto-cleanup at 60s. |
[Eruption] |
Triggers PEAK's native "floor erupts in flames" effect near a random player. Requires the game's EruptionSpawner to exist in the current scene. |
[ChestTraps] |
Each chest opening rolls a small chance to spawn a Mushroom Zombie (default 10%) or teleport the Scoutmaster to hunt the opener (default 5%). |
[SafeZones] |
Standing near a campfire makes you immune to tornadoes / eruptions / banana rain / tumbleweed rain / dynamite drops โ and (optional) immune to all status damage (injury, cold, hunger, etc.). Healing still works. |
Events never fire while you're at the airport / lobby โ they only run inside an actual mountain run.
Install
Install via the Thunderstore Mod Manager or r2modman, or drop HappyPeak.dll into <PEAK install>/BepInEx/plugins/ manually.
Requires the BepInExPack for PEAK.
Also recommended: PEAKModding/ModConfig for in-game live configuration.
Configuration
After running the game once with the mod installed, BepInEx generates BepInEx/config/HappyPeak.cfg. Edit it with any text editor โ every entry has a bilingual description (English line + Chinese line) right above it.
Or use ModConfig for in-game live editing (see top of this page).
Full config reference
[Randomizer]
| Key | Default | Description |
|---|---|---|
EnableItemRandomization |
true |
Master switch for chest randomization. |
AdditionalBlacklist |
"" |
Comma-separated extra item names to exclude (e.g. Dynamite, Scorpion, CactusBall). |
[LootScaling]
| Key | Default | Description |
|---|---|---|
EnableLootScaling |
true |
Toggle for the chest loot multiplier. |
LootMultiplier |
3.0 |
Flat multiplier. 1 = vanilla, 2 = double, 3 = triple. Rounded to integer internally. |
[Tornado]
| Key | Default | Description |
|---|---|---|
EnableRandomTornadoes |
true |
Toggle. |
TornadoIntervalMin |
90 |
Min seconds between waves. |
TornadoIntervalMax |
120 |
Max seconds between waves. |
TornadoesPerWave |
1 |
How many tornadoes per wave. |
TornadoLifetime |
30 |
Seconds before each tornado is removed. |
EnableTornadoAtKiln |
false |
Allow tornadoes at the Kiln (off because they tend to wreck endgame). |
[BananaPeel]
| Key | Default | Description |
|---|---|---|
EnableRandomBananaPeels |
true |
Toggle. |
BananaPeelIntervalMin |
60 |
Min seconds between waves. |
BananaPeelIntervalMax |
90 |
Max seconds. |
BananaPeelsPerPlayerMin |
1 |
Min peels rained per player. |
BananaPeelsPerPlayerMax |
5 |
Max peels rained per player. |
BananaPeelLifetime |
30 |
Seconds before each peel is removed. |
BananaPeelDropHeight |
15 |
Meters above each player to spawn peels (gravity drops them). |
[Tumbleweed]
| Key | Default | Description |
|---|---|---|
EnableRandomTumbleweeds |
true |
Toggle. |
TumbleweedIntervalMin |
60 |
Min seconds between waves. |
TumbleweedIntervalMax |
90 |
Max seconds. |
TumbleweedsPerPlayerMin |
1 |
Min tumbleweeds rained per player. |
TumbleweedsPerPlayerMax |
3 |
Max per player. |
TumbleweedLifetime |
15 |
Seconds before each tumbleweed is removed. |
TumbleweedDropHeight |
15 |
Meters above each player to spawn from. |
[Dynamite]
| Key | Default | Description |
|---|---|---|
EnableRandomDynamite |
true |
Toggle. |
DynamiteIntervalMin |
60 |
Min seconds between drops. |
DynamiteIntervalMax |
90 |
Max seconds. |
DynamiteCountPerWave |
1 |
Sticks per wave. |
DynamiteForwardDistance |
1 |
Meters in front of the player's head where the stick spawns. |
DynamiteDropHeight |
0 |
Extra meters above the player's head. 0 = level with head. |
DynamiteSidewaysJitter |
0.5 |
Random sideways scatter (meters) so it's not always dead-center. |
DynamiteLifetime |
30 |
Hard cleanup if the fuse fizzles. |
LightDynamiteOnSpawn |
false |
If true, the stick is lit on spawn and explodes after its fuse. Default false = drops unlit so the player can pick it up. |
[MarkerSpawn]
| Key | Default | Description |
|---|---|---|
EnableMarkerSpawn |
true |
Toggle. |
Behavior is hardcoded (no extra knobs): up to 2 pickaxes per player, auto-cleanup at 60 seconds. New pings past the cap evict the pickaxe farthest from you so a pickaxe in your hand is never destroyed.
[Eruption]
| Key | Default | Description |
|---|---|---|
EnableRandomEruptions |
true |
Toggle. Silently skipped on biomes without an EruptionSpawner. |
EruptionIntervalMin |
60 |
Min seconds between eruptions. |
EruptionIntervalMax |
90 |
Max seconds. |
EruptionOffsetMin |
0 |
Min meters from chosen player (0 = directly under their feet). |
EruptionOffsetMax |
5 |
Max meters. |
[ChestTraps]
| Key | Default | Description |
|---|---|---|
EnableScoutmasterTrap |
true |
Toggle for the "open chest โ Scoutmaster teleports in" trap. |
ScoutmasterTrapChance |
5 |
Percent chance per chest opened. Keep it low โ the Scoutmaster is brutal. |
ScoutmasterChaseTime |
30 |
Seconds the Scoutmaster is forced to hunt the opener. |
EnableZombieTrap |
true |
Toggle for the "open chest โ mushroom zombies appear" trap. |
ZombieTrapChance |
10 |
Percent chance per chest opened. |
ZombieCountMin |
1 |
Min zombies per trigger. |
ZombieCountMax |
2 |
Max zombies per trigger. |
ZombieLifetime |
60 |
Seconds before each spawned zombie is removed. |
[SafeZones]
| Key | Default | Description |
|---|---|---|
CampfireSafeRadius |
30 |
Radius in meters around any campfire (biome rest + player-lit) that counts as a safe zone. 0 = disable safe zones. |
EnableCampfireInvincibility |
true |
When true, players inside the safe radius take no status damage at all (injury, cold, hot, hunger, poison, etc.). Healing still works. |
Affected events: Tornado, Eruption, BananaPeel, Tumbleweed, Dynamite. Players standing inside the safe radius are skipped by those events.
Tuning recipes
- Default (balanced): leave everything alone. Events fire roughly every 1โ2 minutes per type, loot is tripled, traps are rare.
- Chill mode: bump every
IntervalMin/IntervalMaxto 180โ300s, setLootMultiplier = 1, traps at 1โ2%. - Party chaos: drop intervals back to 10โ30s across the board.
- Pure loot mode: set every
EnableXxx(exceptEnableItemRandomizationandEnableLootScaling) tofalse. - All-traps, no events: disable Tornado/BananaPeel/Tumbleweed/Dynamite/Eruption, leave ChestTraps + Randomizer + LootScaling on.
- Demolition mode:
LightDynamiteOnSpawn = true,DynamiteForwardDistance = 0,DynamiteDropHeight = 0โ bombs detonate exactly where the player is standing.
Compatibility
- Targets BepInExPack PEAK 5.4.2403.
- Should coexist with most cosmetic / QoL mods.
- Likely conflicts with mods that also patch
Spawner.SpawnItems(e.g.ItemMultiplier) โ Harmony will let one of them win on each call. DisableLootScalingif you wantItemMultiplierto be authoritative. - Coexists fine with
PeakRandomizedChaosif you turn off the overlapping events on either side.
Build from source
Requires:
- .NET SDK 8 or newer (
brew install dotneton macOS,winget install Microsoft.DotNet.SDK.8on Windows). - A local PEAK install โ the build pulls game DLLs from
<PeakGameRootDir>/PEAK_Data/Managed/. If your install isn't at the default Steam path, you can either copy theManaged/folder into the project root (auto-detected) or set<PeakGameRootDir>inConfig.Build.user.props.
dotnet restore
dotnet build -c Release
DLL ends up at artifacts/bin/HappyPeak/release/HappyPeak.dll.
To produce a Thunderstore package:
dotnet tool restore
dotnet build -c Release -target:PackTS
Recent changes
Full history in CHANGELOG.md. Top-level summary:
-
0.12.0 โ Big quality-of-life release.
- MarkerSpawn now drops a real Mesa pickaxe (้นคๅด้) instead of a piton, captured instantly via Harmony Postfix, attached precisely to whatever surface the ping crosshair landed on. Spawned pickaxes don't crack. Up to 2 per player, evicts the one farthest from you so the held / freshly-spawned ones are always safe.
- Dynamite redesigned as a "face-drop": spawns in front of the player's head from head height, default unlit (so the player can pick it up and use it).
- New events: Tumbleweed rain, Chest traps (Scoutmaster summon + Mushroom Zombies).
- New SafeZones section: standing near a campfire makes you immune to all hazardous events and (optionally) to all status damage.
- Fix: bushes no longer get randomized items (was a side effect of patching
LootDatainstead ofSpawner.SpawnItems). - Fix: held items no longer accidentally destroyed by marker eviction.
- All networked spawns now properly replicate destroy to clients (no ghost objects).
- README + cfg descriptions fully bilingual (English + Chinese).
-
0.11.5 โ First public Thunderstore release: chest randomization, loot multiplier, Tornado, BananaPeel (trail-style), Dynamite (lit), MarkerSpawn (piton), Eruption.
Credits
Implementation patterns adapted from:
PeakRandomizedChaosby DoggyDentures โ Tornado, BananaPeel, Eruption event templates.ItemMultiplierby IceMods โSpawner.SpawnItemspatching shape.HazardChaosby Bananegame โDynamite.LightFlareinsight.TrappedLuggageby tony4twenty โ chest trap pattern (Scoutmaster + Zombie spawning, RPC names).PeakStrandingby lnkr โ verified0_Items/ClimbingSpikeHammeredprefab name for embedded pitons.BetterPreplacedPitonsby Gabriel โ confirmedShittyPitonis PEAK's internal name for the wooden Mesa pickaxe.RandomEventsby Wesmania โ verified0_Items/PickAxeHammered_Shittyprefab name for spawning the Mesa pickaxe.ItemBrowserby cherrycove โ project structure / build setup template.
CHANGELOG
Changelog
[Unreleased]
- Default tuning pass for the public release. Events fire much less often than the previous test-mode defaults, loot is tripled instead of doubled, and small counts trimmed for balance.
LootMultiplier: 2 โ 3 (triple loot)- Tornado interval: 10โ30s โ 90โ120s; lifetime 60s โ 30s
- BananaPeel interval: 10โ30s โ 60โ90s; min per player 2 โ 1
- Tumbleweed interval: 10โ30s โ 60โ90s; per-player range 2โ5 โ 1โ3
- Dynamite interval: 15โ30s โ 60โ90s
- Eruption interval: 15โ30s โ 60โ90s
- Scoutmaster chase time: 60s โ 30s
- Fixed
EnableRandomDynamitedescription that still said "lit on spawn by default" โ it's actuallyfalse(unlit) since 0.12.0. - README config tables + tuning recipes updated to reflect the new defaults.
[0.12.0]
Big quality-of-life release. Major redesigns to MarkerSpawn, Dynamite, BananaPeel; new Tumbleweed, ChestTraps, and SafeZones sections; lots of bug fixes.
MarkerSpawn (middle-click pickaxe drop)
- Now drops a real Mesa pickaxe (้นคๅด้) instead of a piton. Photon prefab name (
0_Items/PickAxeHammered_Shitty) verified againstWesmania/RandomEventsPingGrabber. - Reads
PointPing.hitNormaldirectly for accurate surface attachment on walls / overhangs / slopes. Old approach raycast in 5 world directions and often picked up the floor beneath a wall. - Caught instantly via a Harmony Postfix on
PointPing.Start(no more 200 ms polling that missed rapid pings). - Spawned pickaxes don't crack/break. Mesa's preplaced pickaxes still behave normally โ we tag our spawns via
InstantiationDatasoPickaxePermanencePatchonly affects ours. - Up to 2 unclaimed pickaxes per player (hardcoded). New ping past the cap removes the one farthest from the player so the freshly-spawned and held ones are always preserved.
- Auto-cleanup at 60s hardcoded โ no more
MarkerSpawnLifetimeconfig. - Spawn position offset 0.3 m out from the surface along the normal so the model doesn't z-fight inside the wall.
- Used
Quaternion.LookRotation(-normal, Vector3.up)(matching the game's ownHammerClimbingSpike) so the spike pokes properly into the wall.
Dynamite (face-drop)
- Redesigned from "drop near random player on the ground" โ "drop right in front of the player's face from head height."
- Default
LightDynamiteOnSpawn = falseโ drops an unlit stick the player can pick up and use, instead of bombing them. - New configs:
DynamiteForwardDistance(default 1 m in front of head),DynamiteDropHeight(default 0 m above head),DynamiteSidewaysJitter(default ยฑ0.5 m). - Old
DynamiteOffsetMin/Maxrepurposed as horizontal scatter โ defaults changed from 20/100 โ 0/5. Item.SetState(ItemState.Ground)called on spawn so the rigidbody actually falls under gravity (PEAK items default to kinematic until the game's own drop logic activates them).- Respects campfire safe zone.
Tumbleweed (new section)
- Tumbleweeds rain from above each player (same pattern as banana rain) using PEAK's native
TumbleWeedprefab. - Default 15 s lifetime per tumbleweed.
- Respects campfire safe zone.
BananaPeel (rain)
- Peels spawn high above each player and fall via gravity instead of materializing at foot level.
- Each peel is independent (random rotation, no more cumulative trail offset).
- Respects campfire safe zone.
SafeZones (new section)
CampfireSafeRadius(default 30 m) โ bubble around every campfire (biome rest + player-lit) where Tornado / Eruption / BananaPeel / Tumbleweed / Dynamite events skip the player.EnableCampfireInvincibility(default on) โ patchesCharacterAfflictions.AddStatusso any positive status (injury, cold, hot, hunger, poison, โฆ) is blocked while a player stands inside the safe radius. Healing still works.
ChestTraps (new section)
- Each chest opening rolls per-trap chances:
- Scoutmaster trap (default 5% chance) โ teleports the existing Scoutmaster to the chest and forces him to hunt the opener for
ScoutmasterChaseTimeseconds. Uses the networkedRPCA_SetCurrentTargetRPC so the AI on every client receives the assignment. - Mushroom Zombie trap (default 10%) โ spawns 1โ2 zombies at the chest, sets their wake-up time to 0, locks them onto the opener.
- Scoutmaster trap (default 5% chance) โ teleports the existing Scoutmaster to the chest and forces him to hunt the opener for
Other events
- Tornado: Kiln detection now compares against the
Segment.TheKilnenum (was a magic int>= 4that sometimes leaked tornadoes to the summit). - Eruption: respects campfire safe zone.
- All events gated on
Plugin.IsInGameRun()โ nothing fires in the airport / lobby.
Bug fixes
- Bushes no longer get randomized items. Removed
LootTablePatch(which patchedLootData.GetRandomItem(s), hit by every spawner not just chests). Randomization is now handled inSpawnerPatchalong with the multiplier; that patch filters byChestSpawnerTypeNames(Luggage, RespawnChest) so non-chest spawners pass through to vanilla logic. - Marker pickaxe no longer destroys items the player is holding. Eviction checks
Item.holderCharacterAND walks the GameObject's parent chain to detect "in a Character's hand/inventory" โ both signals are checked; either one passing skips destroy. As of 0.12.0 the dominant safeguard is the "evict farthest from pinger" rule (anything held is 0โ1 m away vs walls being further). - Bombs no longer hover in mid-air. Items spawned via
PhotonNetwork.InstantiateItemRoomdefault to kinematic; we now callItem.SetState(ItemState.Ground)to enable gravity. - All networked spawns now use
PhotonNetwork.Destroyvia the sharedPlugin.DelayedNetworkDestroyhelper instead ofObject.Destroy, so despawns replicate to every client (no more ghost objects on clients). - Marker pitons no longer bury themselves inside walls. Switched the rotation calc from
Quaternion.FromToRotation(Vector3.up, normal)toQuaternion.LookRotation(-normal, Vector3.up)to match the game's own placement.
Configuration
- New configs across sections (see README's full reference):
DynamiteForwardDistance,DynamiteDropHeight,DynamiteSidewaysJitter,TumbleweedIntervalMin/Max/sPerPlayerMin/Max/Lifetime/DropHeight,BananaPeelDropHeight,CampfireSafeRadius,EnableCampfireInvincibility,EnableScoutmasterTrap,ScoutmasterTrapChance,ScoutmasterChaseTime,EnableZombieTrap,ZombieTrapChance,ZombieCountMin/Max,ZombieLifetime. - Removed configs:
MarkerSpawnItemName,MarkerSpawnLifetime,MarkerSpawnMaxActive,DynamiteOffsetMin/Max(the old "distance from player" pair). - All descriptions are bilingual (English line + Chinese line) so the cfg file is readable in either language.
LootMultipliernow rounded to nearest integer at read time (no fractional item counts).
Docs
- README rewritten for the public Thunderstore page.
- Recommends installing PEAKModding/ModConfig for in-game live config editing.
- Adds "Upgrading from an older version" notice โ delete
HappyPeak.cfgwhen updating, since BepInEx doesn't backfill new entries into an existing cfg. - "Recent changes" section.
- Renamed mod's tagline + general polish.
[0.11.5]
- Initial public Thunderstore release.
- Chest randomization with custom blacklist + loot multiplier.
- Tornado, BananaPeel (trail), Dynamite (lit), MarkerSpawn (piton), Eruption events.
- Bilingual config descriptions.