
ShieldGolf
Disc golf with round shields: real disc flight, tilt, wind, skips and baskets. Client-side; optional server plugin for tournament mode.ShieldGolf — disc golf with shields
Throw a round shield like a golf disc. The flight is physical: real disc
lift, drag and spin, so a hard throw turns right, a soft one fades left,
wind pushes it, and it skips, rolls or glances off trees when it lands.
Build a course from ordinary pieces (or put a basket down with
/discbasket) and count your own strokes, or play a scored round kept by a
dedicated server (see Two ways to play).
- Client-side for casual play. The server needs nothing unless you want scored rounds. Friends without the mod see the shield fly and land as an ordinary dropped item and can pick it up.
- Nothing new in the game. No prefabs, models or recipes; thrown shields are the game's own dropped items, baskets are vanilla building pieces.
- Vanilla stays vanilla. With a weapon in your right hand, or until you arm throw mode, every button does what it always did.
Full guide with the flight model, a throw calculator, basket plans and the
config reference: guide.html in the mod's folder (open it in a browser; in
Gale and r2modman: Open folder on the mod, or the profile's
BepInEx/plugins/ShieldGolf/ or BepInEx/plugins/z3n-ShieldGolf/). It always
matches the version you have installed. The latest one is online:
https://shieldgolf.planetdg.com/
Want to play the real thing? Find a disc golf course near you on Planet DiscGolf.
Install
- Gale, r2modman or Thunderstore Mod Manager: install ShieldGolf (https://thunderstore.io/c/valheim/p/z3nlabs/ShieldGolf/) into the Valheim profile you play with, or import the zip as a local mod (Gale: the profile's mod list; r2modman: Settings → Import local mod). BepInExPack_Valheim is the only dependency.
- Start the game from the mod manager. The profile's
BepInEx/LogOutput.logshowsShieldGolf <version>: 11 shields in 5 classes.
Linux and Steam Deck (the native build): the mod managers start the game through Steam, and BepInEx only loads when Valheim's launch option in Steam (right-click Valheim → Properties → General → Launch options) is
./start_game_bepinex.sh %command%
Set it once; without it the game starts without mods and the log above is never written. On a Steam Deck do this in Desktop Mode, where the mod manager runs.
Only players who want to throw need it, but give it to everyone in the round: when a long throw flies near another player, the game hands the shield to their client in mid-air, and only a client with the mod flies it on. Without it the shield just drops there. Players with the mod also see each other aim (the held shield's tilt and wind-up). Everyone should run the same version.
Built and measured on Valheim 1.0.20 (Linux shows it as l-1.0.20). On another version the log warns and the throws may be off.
Without a mod manager
The mod is one file, ShieldGolf.dll, loaded by BepInEx from the game
folder. Steam's game folder is C:\Program Files (x86)\Steam\steamapps\common\Valheim
on Windows and ~/.steam/steam/steamapps/common/Valheim (or
~/.local/share/Steam/steamapps/common/Valheim) on Linux.
- BepInEx, once: download BepInExPack_Valheim (denikson) from
Thunderstore, open the zip, and copy the contents of its
BepInExPack_Valheimfolder (BepInEx,doorstop_libs,winhttp.dll,doorstop_config.ini, the two.shscripts) into the game folder, next tovalheim.exe/valheim.x86_64. - The mod: open
z3n-ShieldGolf-<version>.zipand copyShieldGolf.dllto<game folder>/BepInEx/plugins/ShieldGolf/(make the folder; any name works, BepInEx loads every DLL underplugins). Updating is replacing that one file. - Windows: start the game from Steam as usual;
winhttp.dllin the game folder makes it load BepInEx. Linux, native build: in Steam, right-click Valheim → Properties → Launch options, enter./start_game_bepinex.sh %command%. If the log in step 4 never appears, make the script executable once:chmod +x "<game folder>/start_game_bepinex.sh". Linux with Proton (the Windows build forced in Compatibility): useWINEDLLOVERRIDES="winhttp=n,b" %command%as the launch option instead. - Check
<game folder>/BepInEx/LogOutput.logforShieldGolf <version>: 11 shields in 5 classes.
The config file then lives at <game folder>/BepInEx/config/z3n.shieldgolf.cfg.
r2modman, Gale and Thunderstore Mod Manager keep their own profiles and
ignore the game folder's BepInEx, so a manual install and a managed one
don't see each other; use one or the other.
Controls
Hold one of the listed shields with nothing in the right hand.
| Input | What it does |
|---|---|
| Secondary attack click (middle mouse unless you rebound it) | Arms throw mode, in backhand. Further clicks switch forehand and backhand; with a buckler or the Wood shield they step backhand, putt, forehand. Holding it half a second leaves throw mode. With a listed shield alone in your hands this button no longer kicks. |
| Block hold (right mouse) | The camera stops and the mouse tilts the shield: left dips the left edge (hyzer, bends left), right dips the right edge (anhyzer, bends right); up and down set the nose (±10°). Two lines at the top left read out the nose and tilt while you hold. Both stay where you leave them. A quick tap flattens both. |
| Attack hold, release (left mouse) | Wind up, then throw. Holding 1.2 s is a full throw: the bow's draw sound plays and the shield jolts. Let go right then for a clean throw with no release error; hold on and you overpower it: the shield trembles and the throw turns over to the turn side (right for a backhand, left for a forehand), more for an understable shield, less with skill. In putt mode it reaches the chains at 15–20 m. Aim with the camera: a level aim already throws about 10° upward, which is close to the best loft. Aim down a little for a low, fast line; aiming up stalls the disc. |
| Equip a weapon, unequip the shield, open a menu | Throw mode turns off; a menu opened mid wind-up cancels the throw. |
| Any movement key after a throw | Takes the camera back from the shield. |
Forehand spins the other way, so turn and fade swap sides.
Putt mode (bucklers and the Wood shield) is a push putt. Look at the chains and wind up: the putt goes toward the point under the crosshair, arcing up and dropping onto it.
| Wind-up | Reach |
|---|---|
| About half a second | 5 m |
| 0.8 s | 10 m |
| Full wind-up, Blocking 0 | the chains at 15 m |
| Full wind-up, Blocking 100 | the chains at 20 m |
The putt spins less than a normal throw, so it floats straight and fades a little at the end.
Aimed within 3.5 m, a putt is a tap-in: the shield leaves from above your head and lobs down where you look, so a shield parked under the basket still goes over the rim. Tap-ins need putt mode, so switch to a buckler or the Wood shield to finish a hole. A short throw with any other shield or stance is a normal throw.
Look into the basket (the funnel or the chains), not at the pole under it. Step by step, with diagrams.
To see the distances, set [debug] distance_rings = true. In throw mode,
rings at 3.5 m, 10 m and 20 m lie around the point you look at.
The discs
| Class | Shields | Flight numbers | Carry at Blocking 100 |
|---|---|---|---|
| Putter | Bronze, Iron, Carapace and Deep North (gold) bucklers | 2 / 3 / 0 / 1 | about 72 m |
| Mid-range | Wood shield, Banded shield | 5 / 4 / −1 / 1 | about 88 m |
| Fairway driver | Silver shield | 7 / 5 / 0 / 2 | about 102 m |
| Distance driver | Black metal, Flametal and Deep North (gold) round shields | 11 / 5 / −1 / 3 | about 141 m |
| Ultimate | Shield of Roots | 2 / 7 / −1 / 1 (27.3 cm) | about 61 m |
The Shield of Roots is the ultimate frisbee disc (a Discraft Ultra-Star): slow and floaty, it sinks slowest of all, hangs longest off a hill and lands flat. An easy throw floats straight; a full flat rip turns over right, so hyzer it. It does not putt.
Every shield flies a little differently:
- Blocking is the golf skill: a fresh character throws about two thirds as far with less spin, so the disc turns and fades more. A landed throw trains Blocking by its carry. Each throw costs 10 stamina.
- Quality sets stability: quality 1 is understable (turns right, fades little), max quality is overstable (holds, then fades hard).
- Wear: a landing costs 1 durability, a tree or rock 3. A worn shield is beat in and turns more; repairing it makes it stable again.
- Weight sets the disc's mass (150–180 g); heavier drifts less in wind.
- Landings: a fast, shallow landing skips; a disc that comes down on its edge rolls. One that stops where you would slide (steeper than 38°) slides down to a spot you can stand on.
Other shields (tower shields, the square iron shield) stay vanilla.
Baskets
With the hammer (1.8.0): the baskets are in the hammer's build menu, Misc tab, as "Disc basket: wood funnel", "wood ring", "small wood ring", "light wood ring", "lowered light wood ring", "iron funnel", "iron tray", "gallows" and "backboard". Place one like any other piece: you aim the basket's pole (the gallows: the post on your right as you face it) and the preview shows the whole basket around it. It handles exactly like that pole: snapping, rotation with the mouse wheel, red where it can't stand, a workbench nearby. The whole basket's materials are shown and taken as usual. What gets built is the same ordinary pieces as below, so players without the mod see a normal basket and the server needs nothing. Like any piece, a basket shows up once you have learned all its materials: the wood ones from the start, the iron ones after you have found iron.
With a command: /discbasket in chat (or discbasket in the F5 console) builds a basket
4 m ahead of you, facing you, out of ordinary building pieces: a blueprint
the command lays out for you. You bring the parts: it takes the
materials the hammer would charge for the pieces from your inventory, says
what is missing, and remove refunds them. In a world with the No build
cost modifier it costs nothing, as the hammer does there, and removing it
gives nothing back. Everyone sees the basket. With the mod, removing any
piece of it with the hammer takes down the whole basket and refunds it (1.9.0);
a player without the mod removes just that piece.
| Command | Builds |
|---|---|
/discbasket or /discbasket 5 |
The wood funnel: a log pole in a thatch funnel 4 m across, a crown of wood beams with twelve hanging 2 m wood poles as chains. No iron. |
/discbasket 6 |
The wood ring: a round basket of 1 m beams 4.8 m across on a tray sloping to the pole, a spoked top, sixteen 4 m log chains leaning in past the pole. No iron. The easy target. |
/discbasket 7 |
The small wood ring: 3.6 m across, its top set low, sixteen 2 m log chains ending at the rim. No iron. The hard target. |
/discbasket 8 |
The light wood ring: an hourglass of eight Log beam 67° crossing under the tray, opening up to a wide band like chains. No iron. |
/discbasket 9 |
The lowered light wood ring: the same a metre deep in the ground, its tray at knee height. No iron. |
/discbasket 1 |
The same funnel with iron beams and iron poles. |
/discbasket 2 |
A flat iron tray 4 m across with a rim. |
/discbasket 3 |
The gallows: a tray hanging from a curtain of iron poles between two log posts. Throw at the curtain. |
/discbasket 4 |
The backboard: the funnel with a wooden wall behind it. Bank the shot off the wall. The forgiving one, and wood only. |
/discbasket 2 8 |
Design 2, 8 m ahead (3–20 m). |
/discbasket remove |
Takes the whole nearest basket (within 8 m) down and refunds it. Use it: the crown and chains hold each other up when the pole goes. |
/discbasket help |
The usage. |
Someone else's ward and no-build zones refuse them. In casual play the game decides nothing: a shield that stays in the basket is in, by the players' word. In a scored round the server decides "in" (every design).
Two ways to play
Casual: the mod on its own. Throw, pick your own rules, count your own
strokes. Nothing runs on the server. discfind rings your last thrown
shield at 10, 20 and 50 m for half a minute.
Scored round: strict rules and a scoreboard, kept by the dedicated
server running the same ShieldGolf.dll (BepInEx, the plugins folder). The
server and every player need exactly the same version: when you update the
mod, update the server's copy too.
round create [name]makes one (a random name like ColdPlainHare if you give none) and puts you in;round listnumbers the open ones;round join <name or number>joins. One at a time; nobody joins once everyone in it has played hole 1.round leavedrops you out.- Your card is holes 1..N in order, from your first throw at tee 1; the next tee is outlined in green. Every later stroke from where your shield lies: a ring on the ground shows the spot (open to the sides and the back, cut half a metre toward the basket); a status line at the top of the screen shows hole, stroke and total. A throw from elsewhere is a fault: not counted, throw again from the lie.
- Water +1 from the last dry point; lost +1 from the same lie (
round find, thenround lost); a shield on or under the basket but not in it is played from beside the basket. - The server reads everything from the synced positions. A shield moved without a throw, dying or a portal during a hole void the card. While your card is in play your hits leave trees, logs and bushes alone, and you cannot pick up another player's thrown shield; no thrown shield is ever picked up automatically, on anyone's game.
- Each hole goes to chat in your name and to the middle of your screen with
your total; when everyone is done the winner is announced and the scored
round ends.
round scoresprints a scoreboard;round closeends one early after a confirmation code. - The limit: a removed mod or a faked lie is caught; an altered flight model is not.
- Course (admins):
disctee Non the tee's floor pieces,dischole N [par]looking at the basket (par 3 unless given; every design is calibrated for "in").round void <player>voids a card.
Cheats, achievements and the cheated mark
By default the mod marks nothing and flags nobody: baskets are paid for,
and there is no way to get a shield but to craft or find one. Two things
are cheats, and they only work where the game runs its own cheat commands
(devcommands in a world you host):
discshieldsin the console (or/discshieldsin chat) puts one shield of each class into your inventory, marked as a cheated item the wayspawnmarks what it creates. Carrying one blocks achievements until it is dropped or put in a chest; it is a mark on the shield, not on you.[basket] free = truemakes baskets cost nothing. Their pieces carry the game's cheated mark likenocostpieces, and refund nothing.
Neither sets the character's own cheat flag (the one confirmcheats
warns about), and neither touches the world. Note that any BepInEx mod,
this one included, makes the game count the session as modded, which by
itself blocks Steam achievements while the mod is loaded; the game's own
opt-in, yesiuseddevcommandsbutiwantmyachievementsanyway 1 in the console,
lifts that per character.
One more thing the mod does for you: in a modded session the game normally
skips its confirmcheats warning, so devcommands and then god,
tod, spawn… flags the character for good without a word. ShieldGolf
puts the warning back ([safety] confirm_cheats, on by default): a cheat
command is refused with the game's own message until you run
confirmcheats, exactly as in an unmodded game.
Config
BepInEx/config/z3n.shieldgolf.cfg in the profile (or the game folder for
a manual install), written on the first start; every setting explains itself
there. Since 1.10.0 everything that changes a throw or a basket is fixed
in the mod: the disc classes, flight constants and wind, skill, wear, the
basket designs and the controls that shape a throw. Every game flies its own
throws, so this keeps everyone throwing the same shields. The config keeps
how the controls feel (mouse sensitivity for tilt and nose, tap and exit
timings), the chase camera and visuals, the debug aids (tuning_log,
distance_rings), confirm_cheats, and the /discbasket defaults.
[testrun] is a developer check and stays off. Lines of the fixed settings
from older versions are removed from the file on the first start.
Known limits
- The mid-air handoff to another player's client was played with two players on 2026-10-23 and the flight continued; if a long throw past a friend ever stops short, report it.
- Gamepad is untested: arming follows the game's secondary-attack binding, but tilt and nose were built for the mouse.
- Mods that change blocking or attacking on
Playermay conflict. - Scored rounds were played by two players on a local dedicated server.
Feedback
Open an issue. For a long throw that crosses a friend, include:
- both clients' mod version
- whether the shield kept flying
- whether you both saw the same landing spot
- the
[shieldgolf]lines fromBepInEx/LogOutput.logwith[debug] tuning_log = true:handed over,resumed,ownership lost,reclaimed, and the line withcarryandrest
Those lines are written only while tuning log is on.
MIT license.