Each built its text with path::string(), which throws for a character outside the ANSI code page, so the real error or message was replaced by a code-page error.
Merge: carry added assets with a changed list, combine in-place values, list repeats once
Three merge bugs found by auditing 104 installed mods:
- A changed list (the music playlist) reached every bundle copy that holds
it, but the songs a mod added beside it only reached copies of the bundle
the mod added them to. The game keeps the playlist in eight bundles, so
the other seven named songs they did not hold. Added assets now follow
the change into whichever bundle copy takes it.
- An entry naming an asset that lost its name to another mod's asset is
now dropped from the list, both in the merged bundle and in the list
other mods' copies are given.
- Two mods changing values in place in one asset (lighting) kept one mod's
copy whole and silently dropped the other's. Plain values are now
combined, the higher-priority mod winning where both changed one. An
edit that also moved a reference or resized a list is taken whole or not
at all, and the merge notes whose changes are missing.
- A reference two mods both append to a list is listed once.
- Read Dev / Creator / Homie Steam IDs from api.reskate.dev instead of the hardcoded list
- Creator (red) and Homie (gold) tags and hoodie/board colours; Admin tag is now pink
- Global bans: lobby hosts and dedicated servers turn banned players away
("global_bans": false in ReSkateServer.json opts a server out)
- SPECIAL menu page for listed players to hide their own tag and items
- Fix hoodie and board keeping the animated colour after the animation turns off
- Multiplayer protocol 39 -> 40
With several cosmetic mods installed the game crashed as soon as an
equipped custom item came into view, and so on every launch after it
was equipped.
Cosmetic presets (Engine/Resource/bundle_ref_table.*)
- The character bundle-reference table says which bundle holds each
preset, under the preset's full path and under its leaf name, one row
per hash. Mods number their presets alike in different folders
(cust_tops/1_ap, cust_bottoms/1_ap), so two mods can share a leaf
name. Adding the second preset threw "collides with an existing
lookup", the merge fell back to the highest-priority mod's copy of
the table, and every other cosmetic mod's presets were unregistered.
The game then built the skater with a preset it could not find and
called through a bad pointer.
- A preset whose leaf name is taken is now added under its full path
only; the leaf name stays with the preset that had it. Only a clash
of full paths still fails. MergedTable::shadowed lists each such
preset with the one that holds its name.
Merge log (Engine/Vfs/mod_merge_combine.cpp)
- Each mod with shadowed presets gets a line naming how many and an
example pair, so an item that shows the wrong preset can be traced to
the mods that clash.
Checked against 39 installed mods, 15 of them cosmetic: the table
combines 274 presets where it used to keep one mod's, all reachable by
full path and 267 by leaf name, with the game's own 6264 rows unchanged.
The seven left without a leaf row are a naming clash between the mods
themselves (two Carhartt packs, a Zero tee and deck); whether the game
finds those by full path is not known.
bundle_ref_table_tests takes an optional second mod and checks that two
mods' presets are all added, in either order, and that a shared leaf
name is reported with the preset that holds it.