Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/data-ingestion.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,36 @@ failure during those statements can leave a partial family, but `import-world.sh
failure and the next run clears the family again before rebuilding it. No DBC bytes or generated
catalogue artifact is written into the repository.

TaxiNodes mount fields name creature-template entries, despite the `wow_dbc` field name
`mount_creature_display_info`. The standalone DBC pass requires `--taxi-mounts <dump.sql[.gz]>`
and resolves them through the full dump, not the spatially filtered creature catalogue. The world
import script passes its existing `DUMP` input. This makes import order independent of which mount
creatures have spawns in the World Shard.

For each faction, a zero creature entry selects the other faction's entry before lookup. A missing
template, a template with no model, or a selected model absent from `CreatureDisplayInfo` produces
display zero and a warning. The Module then refuses that faction's flight before charging the fare.
An explicit missing entry does not fall back to the other faction. Empty template input, unfinished
INSERT statements, duplicate entries and invalid entry or model fields fail before any DBC catalogue
SQL runs.

The catalogue stores the first nonzero model in the template's four model slots. This deterministic
choice omits the reference's random model and gender selection. The creature-entry lookup and
faction fallback follow [CMaNGOS Classic's taxi mount selection](https://github.com/cmangos/mangos-classic/blob/8ec338a1704e7dcb1c0213eb7ed58f9231ade40f/src/game/Globals/ObjectMgr.cpp#L6500-L6534).

Existing catalogues need the standalone DBC pass again with the same client and full dump. Updating
the binary alone does not repair stored displays. With flights stopped, an Operator can rebuild
them on each affected World Shard with explicit targets:

```bash
cargo run -p lyracore-importer -- --server "$SPACETIME_SERVER" --db "$DB" \
--dbc "$DBC" --taxi-mounts "$DUMP"
# Review the dry run, then repeat with --apply during the import maintenance window.
```

This reloads all standalone DBC catalogues, including taxi nodes, paths and points. It preserves the
reserved taxi fixture. Flights already active retain their captured mount display until they end.

## What the seeded fixture knowingly contains

The firewall above is about **bulk data**: this project never vendors, mirrors, or ships a
Expand Down
12 changes: 12 additions & 0 deletions docs/verification/taxi-flight-verification.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,15 @@ and run the full adapter suite.

The attended gate remains separate: an unmodified 1.12.1 build-5875 client must confirm the taxi
map, multi-point spline, mount, flight animation, landing cleanup, and session stability by eye.

## Imported mount displays

The importer tests use different creature entries and display IDs for both factions. They cover
zero-entry fallback, missing templates, absent client displays and template model selection. These
checks verify the stored display values, not the client's rendered model.

For a real-client check, record the source and destination node IDs, the source TaxiNodes faction
entry, the template's first nonzero model, and the imported `game_taxi_node` display. Take the route
with each supported faction and compare the active flight's mount display with that value and the
model shown by the client. Include the reported flight over Mist's Edge once its endpoints are
known. The report did not supply those endpoints, so that route has not been reproduced here.
2 changes: 2 additions & 0 deletions importer/scripts/import-world-sql-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@ STUB_MODE=succeed STUB_ROW_COUNT=150 WORLD_PROFILE=alliance-single run_import
check "the profile run reaches the assertion stage" not_contains "$out" '[world] ABORT'
check "the profile is displayed with all of its planned maps" \
contains "$out" 'canonical profile alliance-single (planned maps: 0 1 36 369)'
check "the standalone DBC catalogue receives the full taxi mount dump" \
grep -q -- '--dbc .*--taxi-mounts .import/classic-db-full.sql --apply' "$stub_log"
check "the dump ETL receives the canonical profile name" \
grep -q -- 'lyracore-importer .*--world-profile alliance-single' "$stub_log"
check "the dump ETL does not recreate a profile as legacy spatial flags" \
Expand Down
10 changes: 3 additions & 7 deletions importer/scripts/import-world.sh
Original file line number Diff line number Diff line change
Expand Up @@ -427,15 +427,11 @@ else
./target/debug/lyracore-importer --db "$DB" --server "$SPACETIME_SERVER" \
--nav "$DBC" "${SCOPE_FLAGS[@]}" --apply || exit 1
fi
# Character-creation + faction DBC tables. The combined --dump --dbc pass above uses the DBCs ONLY for
# Scale==0 resolution; dbc::run() — the SOLE loader of game_start_item / game_char_base_info /
# game_race_info / game_faction[_template] — is gated on --dump being ABSENT, so a --dump pass SKIPS it.
# Run --dbc ALONE here so a fresh reprovision + this script populates those tables; otherwise non-Warrior
# classes fall back to the Warrior loadout, Human Female renders Male, and create_character skips
# race/class validation (each is an idempotent clear+reload, independent of the cmangos creature slice).
# The standalone DBC pass loads character creation, faction and taxi catalogues.
# Taxi mount entries resolve through the full dump, independent of the imported creature slice.
echo "[world] character-creation + faction DBC tables (start items / race+class combos / race display / factions)"
run_checked_step "standalone DBC catalogue import" "dbc: loaded|error|abort" 6 \
./target/debug/lyracore-importer --db "$DB" --server "$SPACETIME_SERVER" --dbc "$DBC" --apply || exit 1
./target/debug/lyracore-importer --db "$DB" --server "$SPACETIME_SERVER" --dbc "$DBC" --taxi-mounts "$DUMP" --apply || exit 1
# Real talent trees (TalentTab.dbc + Talent.dbc → game_talent_tab/game_talent).
# WITHOUT this the tables hold only the 8 demo talents, whose ids don't match what the 5875 client
# sends on a talent click → talent selection silently fails (the client renders the real trees from its
Expand Down
Loading
Loading