TraderX_Tools/README.md
2026-09-06 22:47:27 +03:00

133 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# traderx-tools
Command-line tools for administering the **TraderX** DayZ trader mod
(<https://github.com/TheDmitri/TraderX>) 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 <this repo> 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 <TraderX dir> [-o FILE]
traderx_build.py import-traderplus <file.json> [--category NAME] [--trader T]... (-o FILE | --into FILE)
traderx_build.py import-expansion <file|dir> [--category NAME] [--trader T]... (-o FILE | --into FILE)
traderx_build.py import-plain <file.txt> --price N [--category NAME] [--trader T]... (-o FILE | --into FILE)
traderx_build.py build <source> --out <TraderX dir> [--dry-run] [--clean] [--strict] [--compat FILE]... [--no-backup]
traderx_build.py check <source> [--strict] [--compat FILE]...
traderx_build.py compat <ClassName> <compat.json>...
traderx_check.py <TraderX dir> [--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).