Adds --export-wbnd-json / --import-wbnd-json with the established
readEnumField template factoring int+name dual encoding for both
bindKind ("bindonpickup"/"bindonequip"/"bindonuse"/
"bindonaccount"/"soulbound"/"nobind") and itemQualityFloor
("poor"/"common"/"uncommon"/"rare"/"epic"/"legendary"/
"artifact"/"heirloom"). All 3 presets (vanilla/TBC/WotLK)
byte-identical binary roundtrip OK including the WotLK
Heirloom rule with accountBoundCrossFaction=true.
Live-tested raid-trade-window=0 contradiction validator:
hand-mutated TBC Uncommon rule (ruleId 12) tradableWindowSec
to 0 while keeping tradableForRaidGroup=true. Validator
correctly errored: "tradableForRaidGroup=true with
tradableWindowSec=0 — window expires instantly, equivalent
to no window". Catches a subtle policy-config bug where the
flag claims a feature exists but the duration silently
disables it.
CLI flag count 1416 -> 1418.
Novel replacement for the implicit item-binding policy vanilla
WoW carried in ItemTemplate.bondingType + per-item special-case
rules in the server's LootMgr (the 2-hour raid-loot trade
window was hard-coded; the account-bound-shared-across-faction
rule for heirlooms was a TBC+ addition with no formal data-
driven format). Each WBND entry binds one soulbind rule to its
bind kind (BoP / BoE / BoU / BoA / Soulbound / NoBind),
itemQualityFloor predicate (rule applies to items of this
quality and above unless overridden by a stricter rule),
tradable-window duration, raid-trade allowance, BoE-becomes-
BoP trigger, and cross-faction sharing flag.
Three presets capturing actual expansion-era policy evolution:
--gen-bnd-vanilla 4 rules — Poor=NoBind, Common=BoE,
Uncommon+=BoP no-window, Epic+=Soulbound.
NO raid-trade window — the 1.12 master-
loot drama era
--gen-bnd-tbc 5 rules adding the iconic 2-hour raid-
trade window for BoP items (Uncommon and
Rare quality)
--gen-bnd-wotlk 6 rules adding Heirloom = BindOnAccount
+ cross-faction (Alliance<->Horde via
account-mail) for the WotLK level-1-to-80
twink path
Validator catches: id+name required, bindKind 0..5,
itemQualityFloor 0..7, no duplicate ruleIds, no duplicate
(bindKind,qualityFloor) pairs (resolveForQuality lookup tie).
Hard error: tradableForRaidGroup=true with window=0 (window
expires instantly = no window at all). Warns on contradictions:
tradableForRaidGroup with non-BoP kind, window > 0 without
raid-trade flag, boeBecomesBoP without BoE kind,
accountBoundCrossFaction without BoA kind (all flag-ignored at
runtime).
Format count 134 -> 135. CLI flag count 1409 -> 1416.