# traderx-tools Command-line tools for administering the **TraderX** DayZ trader mod () without hand-editing hundreds of JSON files. | Tool | What it does | |---|---| | `traderx_build.py` | Maintain your whole trader setup in **one human-readable YAML/JSON file** (class names, words instead of bitfields, reusable attachment groups, presets) and compile it into the mod's `Products/`, `Categories/`, `TraderXPresets/` files and trader assignments. Imports **TraderPlus**, **Expansion Market** and **plain class-list** exports. | | `traderx_check.py` | Validate (and optionally fix) an existing TraderX config in place: invalid file names the mod silently skips, dangling references, wrong types, license ids, trader assignments, stale compiled files. | | `docs/` | A configuration guide for TraderX written from the mod's source code – file formats, bitfields, pricing formula, load order and gotchas. | Pure Python 3.8+, standard library only. `pyyaml` is optional (enables `.yaml` sources; `.json` sources work without it). --- ## Quick start ```bash git clone traderx-tools && cd traderx-tools pip install -r requirements.txt # optional, for YAML # 1. Health-check what you have now (changes nothing) python3 traderx_check.py ~/serverprofile/TraderX # 2. Turn the existing config into one editable source file python3 traderx_build.py import-traderx ~/serverprofile/TraderX -o traderx.yaml # 3. Add a mod's export as a new category, assigned to a trader python3 traderx_build.py import-expansion Terje_Tools.json --trader Eve --into traderx.yaml python3 traderx_build.py import-traderplus SnafuTraderPlus.json --trader Boris --into traderx.yaml python3 traderx_build.py import-plain cans.txt --price 100 --trader Eve --into traderx.yaml # 4. Edit traderx.yaml, then preview and write (server stopped) python3 traderx_build.py build traderx.yaml --out ~/serverprofile/TraderX --dry-run python3 traderx_build.py build traderx.yaml --out ~/serverprofile/TraderX ``` Every `build` takes a timestamped backup, only touches files that actually changed, lists stale files (deleted only with `--clean`), refuses to write when there are errors, and warns if a `Compiled/` folder would shadow your files. --- ## Why TraderX's native format has three properties that make it painful to manage by hand: 1. **References by opaque product id** (`prod_snafu_ak12a_001`) instead of class name – attachments, variants, presets and categories all point at ids, and a typo silently drops the reference. 2. **Bitfields** – `tradeQuantity: 78644644` and `stockSettings: 138` encode several settings each. 3. **No reuse** – "every AK gets these 12 optics" means editing 40 files. `traderx_build.py` treats the mod's files as a *build output*. You edit this instead: ```yaml groups: ak_optics: [SNAFU_AKAimpoint_M5, SNAFU_AKKahles, SNAFU_AKTrijicon] categories: - name: Assault Rifles traders: [Boris] licenses: [Weapons License] price: 1200 items: - SNAFU_AK12A: attachments: [ak_optics, "@compat_mags"] variants: [SNAFU_AK12A_Tan] presets: "CQB*": [SNAFU_AKAimpoint_M5] - SNAFU_AK103A: {stock: 5, coefficient: 0.95, restart: reset} - name: Ammo traders: [Boris] price: 60 buy: static 30 sell: any items: [Ammo_762x39, Ammo_545x39] ``` See [docs/source-format.md](docs/source-format.md) for the full schema. --- ## Documentation | Document | Contents | |---|---| | [docs/source-format.md](docs/source-format.md) | The YAML/JSON source schema for `traderx_build.py` – every key, defaults cascade, groups, variants, presets, quantity words | | [docs/importing.md](docs/importing.md) | How TraderPlus / Expansion / plain exports and an existing TraderX config are mapped into the source | | [docs/compat.md](docs/compat.md) | Using weapon compatibility files (`@compat`, `@compat_mags`) and the `compat` lookup command | | [docs/checking.md](docs/checking.md) | `traderx_check.py`: what it detects, what `--fix` changes, exit codes | | [docs/traderx-configuration-guide.md](docs/traderx-configuration-guide.md) | Reference for TraderX itself: directory layout, load order, product/category/settings files, bitfield layouts, pricing formula, licenses, vehicles, safe zone, troubleshooting | | [examples/](examples/) | Sample source files and one sample of each import format | --- ## Command overview ``` traderx_build.py import-traderx [-o FILE] traderx_build.py import-traderplus [--category NAME] [--trader T]... (-o FILE | --into FILE) traderx_build.py import-expansion [--category NAME] [--trader T]... (-o FILE | --into FILE) traderx_build.py import-plain --price N [--category NAME] [--trader T]... (-o FILE | --into FILE) traderx_build.py build --out [--dry-run] [--clean] [--strict] [--compat FILE]... [--no-backup] traderx_build.py check [--strict] [--compat FILE]... traderx_build.py compat ... traderx_check.py [--fix] [--fix-settings] [--no-backup] [--decode] [--ignore TEXT]... [--no-group] [--quiet-info] ``` `--trader` accepts a trader's `givenName` or `npcId` from `TraderXGeneralSettings.json` and is repeatable. --- ## Pre-start validation `scripts/prestart-check.sh` runs `check` on the source and `traderx_check.py` on the profile and exits non-zero on errors, so it can gate a server start: ```bash scripts/prestart-check.sh ~/serverprofile/TraderX traderx.yaml compat.json && ./start-server.sh ``` --- ## Compatibility Written against TraderX `main` (mod version string 1.0.1, September 2026). The file-name rules, bitfield layouts and preset format are taken from the mod's Enforce Script sources; if a future TraderX release changes them, the constants at the top of both scripts are the place to adjust. ## License MIT – see [LICENSE](LICENSE).