Varkour
Build parkour courses, run them, and compete on server-side leaderboards.Varkour (Valheim parkour mod)
Build parkour courses with the Parkour Pole, run them, and compete on server-side time leaderboards.
Built for Valheim 1.0 (Unity 6) on BepInEx 5 with Jotunn 2.30.
What you need
- BepInExPack_Valheim 5.4.2350 or newer
- Jotunn 2.30.1 or newer (ValheimModding-Jotunn). Varkour needs it and won't load without it.
- Everyone in a multiplayer game needs Varkour, and the server needs it too (a dedicated server or the hosting player). Jotunn blocks the connection if the versions don't match.
Install with Gale
- In Gale, create a new profile for testing (for example "Varkour test").
- In that profile, install Jotunn from the Thunderstore browser. BepInExPack gets installed with it.
- Import this zip as a local mod: use Gale's Import menu, choose Local mod, and pick
the Varkour zip. The zip is in the usual Thunderstore format (manifest.json, icon.png, plugins/Varkour.dll).- If the import fails, open the profile folder instead (profile menu, "Open profile folder") and copy
plugins/Varkour.dlltoBepInEx/plugins/Varkour/Varkour.dll.
- If the import fails, open the profile folder instead (profile menu, "Open profile folder") and copy
- Launch Valheim from Gale. In
BepInEx/LogOutput.log(or the console) you should see:Varkour <version> loaded (client). - The config file is
BepInEx/config/dillon.varkour.cfg. It's created on first launch, and you can edit it in Gale's config editor.
Controls (defaults, change them in the config)
| Key | What it does |
|---|---|
| F8 | Opens/closes the Varkour window (pole equipped, not mid-run) |
| Left Alt | While the window is open: switch between clicking the window and controlling the game. When the window is dimmed the game has the mouse, so you can look around, open the zone menu and place zones with the window still up. You can walk in both modes |
| F9 | Restart: teleports you into the Start Zone of your current or last course and cancels the run |
| F10 | Cancels the current run or countdown |
| F6 | Practice mode only: teleports you back to the last zone you hit |
| Right-click (in editor) | Opens the zone menu (Start / Checkpoint N / End) |
| M1 (in editor) | Places the selected zone |
| Shift + scroll (in editor) | Changes the size of the next zone (0.5 to 5 m in 0.5 m steps, starts at 1 m). The ghost ring shows the size and the HUD shows the number |
| Middle mouse (vanilla Remove key, in editor) | Removes the zone under your crosshair |
Quick start
- Craft the Parkour Pole at a workbench (5 Wood) and equip it.
- Press F8, type a name, and click New course. The editor opens.
- Close the window. Right-click and place a Start Zone, a few Checkpoints, and an End Zone.
- Press F8 and click Close editor.
- Stand still in your Start Zone: READY while the countdown runs, SET when it's done, GO as you leave the zone. The timer starts when you leave the Start Zone.
- Finish without cheats or practice mode, and the course is published with your run as its first leaderboard entry. Buffs are fine: holding the pole gives you Parkour Time (no fall damage, bonuses capped at vanilla, vanilla fall speed, and a stamina pool from the best three foods you carry, checked once when you equip it).
Where data is saved
- Server (single player, the host, or a dedicated server):
BepInEx/config/Varkour/<world>/server.json - Your drafts:
BepInEx/config/Varkour/<world>/drafts.json(only on your own PC)
Manual test checklist
Single player
Parkour Time (the pole's effect)
- [ ] Equipping the pole shows "Parkour Time" among your status effects; unequipping removes it.
- [ ] Sprint a fixed distance (for example between two workbenches) with the pole equipped. Time it at Run skill 0, then raise the skill with the console (
devcommands, thenraiseskill run 100) and time it again. The times should match. If you have gear or a mead with a positive movement speed bonus, it should make no difference either. - [ ] Put on heavy armor (iron or padded). With the pole equipped you're still slower than with no armor.
- [ ] Get overweight. Encumbrance behaves exactly as in vanilla (you walk slowly), with or without the pole.
- [ ] Jump off something tall with the pole equipped: no damage. With a feather cape you fall at vanilla speed.
- [ ] Carry three foods and equip the pole: your max stamina becomes base + their three stamina values (never below 150) and the bar fills. With no food it is 150.
- [ ] Unequip the pole. Speed buffs, fall damage and your eaten-food stamina come back.
Pole modes
- [ ] Outside the editor, holding the pole shows no placement ghost, and M1 does nothing (no swing, no punch).
- [ ] In the editor, right-click shows only Start Zone, Checkpoint N and End Zone.
- [ ] With 0 checkpoints, the entry reads "Checkpoint 1". After placing one, it reads "Checkpoint 2". After removing one, the number goes back down.
- [ ] M1 places zones and nothing is spawned in the world. Placing costs no resources or stamina.
- [ ] Placing a second Start or End moves the existing one.
- [ ] Placing works inside someone else's ward.
- [ ] Middle mouse on a ring removes it, and the remaining checkpoints renumber.
- [ ] Shift + scroll changes the ghost ring size and the "Zone size" HUD line (0.5 to 5.0 m in 0.5 m steps). The placed zone has that size.
- [ ] In the zone list:
- The up/down buttons move a checkpoint one place; the first cannot go up and the last cannot go down.
- -/+ change the size.
- "Move spot to player" moves the zone to you.
- Delete removes it.
- Start always stays first and End always stays last.
- [ ] With the window open you can walk with WASD. Clicking buttons doesn't place zones. Typing a course name doesn't move you.
- [ ] Left Alt dims the window and gives the mouse back to the game: you can look around, right-click for the zone menu and place zones while the window stays up. Left Alt again makes it clickable.
- [ ] Gold sparkles drift along the path between zones in the editor and during your own run (no solid line). With the pole out and no run going, only the Start ring and name of each course are drawn.
- [ ] In the editor, checkpoint rings are labelled "Spot N", matching the zone list.
- [ ] The Info tab lists every key and the how-it-works steps.
- [ ] Hide on a course (My Courses or Leaderboards) removes its rings, sparkles, labels and map pin for you only. Show brings them back, and the setting survives a restart.
- [ ] Quit to desktop, relaunch, load the world, then F8. Your drafts AND published courses are still listed, with their times.
- [ ]
BepInEx/config/Varkour/<world>/server.jsonholds the published courses, anddrafts.jsonyour drafts. Both are readable JSON. - [ ] Unequip the pole while editing. The editor closes and the build HUD goes away.
Run start
- [ ] Standing still in a Start Zone shows the course name, your best time, and "Stand still to start", then READY with a tick each second, then SET.
- [ ] Walking or jumping during the countdown resets it. Only turning the camera does not.
- [ ] At SET the timer has not started; stepping out of the Start Zone flashes GO on screen and starts it.
- [ ] A finished run slower than your best shows your time and the course record, e.g. "00:45.120 (Record: 00:40.000)".
- [ ] Leaderboard rows show rank, name and time only (no date).
- [ ] The window's footer has a "Focus Game" button with the key hint next to it; clicking it (or the key) hands the mouse to the game, hides the button and switches the hint to "focus Varkour window".
- [ ] Standing in your Start Zone while the editor is open does nothing.
Runs
- [ ] Entering zones out of order does nothing. During the run checkpoints are blue orbs above their zones (the next one bright and lit, passed ones dim) and the End is a big pulsing red orb. No rings are drawn during a run.
- [ ] The HUD shows "Runs N" next to the course record, and N goes up by one per finished run, even a slow one.
- [ ] Each zone you hit gives a sound or effect. At the finish, the right side shows your splits (green/red once you have a best time).
- [ ] Unequipping, dying, using a portal, pressing F10, or reaching the time limit cancels the run.
- [ ] F9 teleports you into the Start Zone and cancels the run, and you have to stand still again to start.
- [ ] Turning on Practice mode (in the Varkour window) shows "Unranked: practice mode", and F6 takes you back to the last zone you hit.
- [ ] Turning on god mode, debug fly or no-cost shows "Unranked: ...". Unranked runs are never submitted. A stamina mead, a jump mead or the feather cape does not make a run unranked.
Publishing
- [ ] A clean finish on your own draft shows "Publishing..." and then "... is now published". The course moves from Draft to Published in the Varkour window, and the Leaderboards tab shows your time as #1.
- [ ] Editing a published course asks for confirmation, turns it back into a draft, and clears its leaderboard.
- [ ] Map pins show at each course's Start Zone (you can turn them off with ShowMapPins in the config). In Leaderboards, "Show on map" jumps the map there.
Host and a second client
- [ ] The host publishes a course. Without reconnecting, the client sees it in Leaderboards and sees its map pin.
- [ ] The client runs it. The time shows on the host's leaderboard and the course's run total goes up for both. If it's the new #1, both players get a "New record" message.
- [ ] The host cannot see the client's checkpoint orbs, End orb or sparkles, only the Start ring.
- [ ] The client can't delete or edit the host's course (that fails with "Only the author or an admin..."). The host can delete it.
- [ ] The client publishes their own course. The host sees it right away.
- [ ] Both players restart the game. Courses and times are still there (they're in the host's
server.json). - [ ] A client whose Varkour version doesn't match is refused on connect (Jotunn version check).
Known issues and guesses to revisit
-
Saving was rewritten in 0.1.4. Unity's JsonUtility was dropped for a hand-written reader/writer, because JsonUtility drops data it doesn't like without an error. Old files still load. Every load and save is logged with its full path, so if a course goes missing the log says which file was read. The server also pushes the course list again when its store finishes loading, in case a client asked too early.
-
Hidden courses can't be started. You have to Show a course before its Start Zone counts.
-
Patches: 3 concerns, 13 target methods.
- Parkour Time (
HardcoreParkourin the code): 8 methods (below). - Zone placement:
Player.TryPlacePieceandPlayer.PlacePiece(the second only matters for build mods that spawn directly). - Window:
PlayerController.InInventoryEtc,Player.TakeInputandGameCamera.UpdateMouseCapture, so the window works like the inventory screen.
- Parkour Time (
-
Parkour Time caps per source because 1.0 applies each kind of bonus in its own place; every patch only acts while the effect is on you:
Player.GetJogSpeedFactor,Player.GetRunSpeedFactor,SEMan.ApplyStatusEffectSpeedMods(speed)SEMan.ApplyStatusEffectJumpMods(jump)SEMan.ModifyStaminaRegen(regen)SEMan.ModifyWalkVelocity(slow fall),SEMan.ModifyFallDamage(fall damage)Player.GetTotalFoodValue(the stamina pool, computed once at equip time)
Each one caps its own bonus at vanilla, so heavy armor stays slow even while a speed mead is active.
-
The stamina pool is decided when you equip the pole. Food you eat or pick up afterwards changes nothing until you re-equip it; that keeps the inventory scan to a single pass.
-
Right-click is untouched: outside the editor it still raises a block, in the editor it opens the zone menu.
-
Players are identified by character, read from the sender's character on the server the way vanilla does. That is not a platform account ID, so a modified client could still pretend to be someone else. Fine for a friends server, not for a public ladder.
-
Saves are atomic and an unreadable
server.jsonis copied aside and left alone: the server refuses Varkour requests until you fix or remove the file, rather than start empty and overwrite it. -
Placeholder art:
- Rings are colored LineRenderer circles (shader picked at runtime, starting with
Sprites/Default). If rings show pink, that shader lookup is the likely cause. - Icons are generated circles.
- Sounds and effects reuse the player's own effects (button click, perfect dodge, pickup, skill level-up).
- The pole uses the Club model.
- Rings are colored LineRenderer circles (shader picked at runtime, starting with
-
The zone ghost can turn red inside wards or no-build areas. Placing still works there.
-
Drafts are stored per world name. Two different servers with the same world name share one drafts file (drafts are still filtered by character).
-
Zone size settings were renamed to
ZoneSizeDefault,ZoneSizeMin,ZoneSizeMaxandZoneSizeStepso the new defaults (1, 0.5, 5, 0.5) apply. The oldDefaultRadius,MinRadiusandMaxRadiuslines in your config are now ignored. -
Opening the editor marks the three zone entries as known pieces on your character, so vanilla shows them without "new piece" pop-ups.
-
ValheimPlus: compatible. Its Advanced Building Mode moves the placement ghost and lets vanilla place, so zones land where the ABM ghost is (arrow keys move it, scroll rotates it; rotation is ignored, zones are always flat). Free Placement Rotation, Area Repair and Grid Alignment do not touch the placement calls Varkour intercepts, and ValheimPlus has no movement-speed patches, so the speed cap and ranked rules behave as without it.
Source
Source, build scripts and developer docs are in the repository. MIT licensed. Varkour ships only
Varkour.dll; BepInEx and Jotunn are installed as their own packages.
