Start here
Your first data pack
In this tutorial you make a small pack called Pub Legends: two county-circuit players who are each other’s rival, a pub that sponsors players on the bottom tiers, and a sharper finisher at the top of the game. You need a text editor and about ten minutes.
The finished pack is a download on the example packs page if you would rather start from it.
1. Make the folder#
On Windows, start the game and open Mods → Open mods folder. Make a folder in it called pub-legends. By the end it will hold five files:
Folder and file names matter: the game reads each kind of content from its own place. data/players/ is a folder, so any .json file in it is read; data/sponsors.json is a single file. The content types page lists every place.
2. Say who the pack is: mod.json#
Every pack has a mod.json at the top of its folder:
{
"id": "acme.pub-legends",
"name": "Pub Legends",
"version": "1.0.0",
"gameVersion": ">=0.50.15",
"authors": ["Acme"],
"description": "Two pub legends for the county circuit, a sponsor of their own, and a sharper Dani Okafor."
}idis the pack’s id: lower-case letters, digits, dashes and dots. Start it with a name of your own (acmehere) so it cannot clash with someone else’s.versionis yours to raise when you change the pack (1.0.0,1.1.0, …).gameVersionsays which versions of the game the pack is for.>=0.50.15means this one and later.
Every field is in the mod.json reference.
3. Add two players#
Create data/players/legends.json. A content file is a JSON list of records:
[
{
"id": "acme.pub-legends.player.big-dave",
"firstName": "Dave",
"lastName": "Hollins",
"nickname": "Big Dave",
"nationality": "ENG",
"born": "1979-03-14",
"gender": "m",
"hand": "R",
"tier": 5,
"colour": "#c0392b",
"attributes": {
"scoring": 64, "finishing": 58, "checkoutKnowledge": 70, "consistency": 55,
"tempoControl": 60, "bullAccuracy": 52, "composure": 66, "resilience": 72,
"crowdHandling": 80, "concentration": 57, "stamina": 50, "fitness": 45, "eyesight": 61
},
"hidden": { "potential": 68, "ambition": 55, "professionalism": 48 },
"personality": { "media": "showman", "temperament": "steady" },
"rivalIds": ["acme.pub-legends.player.shona-reid"],
"bio": "Thirty years at the Red Lion. Still the man to beat on a Thursday."
},
{
"id": "acme.pub-legends.player.shona-reid",
"firstName": "Shona",
"lastName": "Reid",
"nickname": "The Lighthouse",
"nationality": "SCO",
"born": "1996-08-02",
"gender": "f",
"hand": "L",
"tier": 5,
"colour": "#2e86c1",
"attributes": {
"scoring": 61, "finishing": 66, "checkoutKnowledge": 63, "consistency": 64,
"tempoControl": 58, "bullAccuracy": 60, "composure": 62, "resilience": 59,
"crowdHandling": 55, "concentration": 67, "stamina": 63, "fitness": 70, "eyesight": 72
},
"hidden": { "potential": 82, "ambition": 78, "professionalism": 74 },
"personality": { "media": "humble", "temperament": "volatile" },
"rivalIds": ["acme.pub-legends.player.big-dave"],
"bio": "Came south from Fraserburgh with a left arm nobody could read."
}
]- Every new record’s id starts with your pack’s id and a dot:
acme.pub-legends.player.big-dave. The part after that is up to you;player.just keeps things tidy. tieris the level a player plays at, from1(the World Series) to5(the county circuit).- Attributes run from 0 to 100. A county player sits in the 50s and 60s; the best in the world are in the 90s.
rivalIdsnames other players by their ids. Here each names the other.nationalityis a three-letter nation code:ENG,SCO,WAL,NEDand the rest are in nations.
The players reference has every field: portraits, walk-on music, a favourite double, the season their Tour Card runs to, and more.
4. Add a sponsor with a logo#
Put a square picture at assets/sponsors/red-lion.png (256 by 256 pixels is plenty), then create data/sponsors.json:
[
{
"id": "acme.pub-legends.sponsor.red-lion",
"name": "The Red Lion",
"category": "local",
"tierMin": 4,
"tierMax": 5,
"baseValue": 1500,
"seasons": [1, 2],
"targets": [{ "kind": "seasonAverage", "value": 70 }],
"colour": "#a93226",
"logo": "assets/sponsors/red-lion.png"
}
]tierMinandtierMaxsay which players it will offer deals to: here, tiers 4 and 5.baseValueis what a deal is worth per season, in the game’s currency;seasonsis how long a deal runs, here one or two seasons.targetsare what the sponsor asks for: here, a season average of 70.logois a path inside your pack, with forward slashes. Pictures can be WebP, PNG or JPEG. See Images, sound and models.
5. Change a player of the base game#
You could copy a whole base game record into your pack with the same id, and your copy would replace it. When you only want to change a field or two, a patch is better: it keeps the rest of the record, so your pack keeps working when the base game updates that player. Create data/patches/core.patch.json:
[
{
"target": "player:core.player.dani-okafor",
"patch": { "nickname": "The Quicksilver Kid", "attributes": { "finishing": 95 } }
}
]targetis the kind of record (player), a colon and its id.patchholds only what changes. Objects merge field by field, soattributeshere changesfinishingand keeps every other attribute. A list in a patch replaces the whole list, andnullremoves a field.
To find ids, open the base game’s own pack: on Windows it is the DartsPlayerSimulator_Data\StreamingAssets\core folder where the game is installed. It is the best reference there is. Read it, but do not change it: your pack does that.
6. Load it#
- In the game, open Mods and press Reload mods.
- Pub Legends appears with its contents: 2 players, 1 sponsor, 1 patch. If something is wrong, the pack shows Not loaded and its details list each problem with the file, the line and the field.
- Start a new career. Packs reach new careers; a career already under way keeps the data it began with.
- Look up Big Dave and Shona Reid in the rankings, and the new nickname on Dani Okafor’s profile. With a career on the bottom tiers, The Red Lion is among the sponsors who may make you an offer.
When it does not load#
An error in any file stops the whole pack from loading, so a pack is never half there. A warning (a picture that cannot be read, a record that replaces someone else’s) lets it load. The commonest mistakes:
| The Mods screen says | What to do |
|---|---|
| New id … must start with “acme.pub-legends.” | Put your pack’s id and a dot at the front of the id, or use an existing id on purpose to replace that record. |
| Invalid option: expected one of … | The field takes one of a fixed list of words. The list is in the message and in the field reference. |
| Unknown field | A spelling mistake in a field name, or a field that belongs somewhere else. Field names are case-sensitive. |
| Expected an array | The file must be a list: wrap the record in [ … ]. |
| Asset not found | The picture is not where the path says. Paths are relative to the folder that holds mod.json. |
If the pack loads but your records are not there, check the folder and file names against the content types page: a file in the wrong place, such as data/player/ for data/players/, is not read at all.
For autocomplete and checking while you type, set up your editor with the game’s schemas: see Editor set-up.
7. Share it#
Zip the pub-legends folder. Anyone can install it from Mods → Import a mod on Windows, or Data packs → Import a data pack on a phone. See Install, test and share.
Where next#
- How data packs work: ids, replacing and patching, load order, and what careers see.
- Calendar and entry rules to give your players events to play in, and Tours and the Tour Card for a tour of their own.
- Stories to give them a storyline.
- The field reference for everything else.