Important
Supports Terraria 1.4.5.5 (world file version 318)
🐛 Bug Fixes
-
Fix Calamity2 tile loading: support new dense .twld format #1075
-
Add ParseTileDataDense/ParseWallDataDense for new tileData/wallData format
-
Add BuildTileDataDense/BuildWallDataDense for round-trip save
-
Fix 1-based saveType indexing (0=vanilla, 1+=mod tile map index)
-
Add bounds checking for stream desync resilience
-
Fix legacy format to read initial skip bytes before first record
-
Add 4 Calamity2 real-world tests (parse, quadrants, round-trip)
-
Add RawTileData/RawWallData properties to TwldData
-
Fix mod tile/wall rendering: accurate colors, layer depth, Safe prefix #1075
-
Sample tile/wall colors from first texture frame instead of full-sheet average
-
Add SampleFirstFrameColor() to TmodTextureExtractor for rawimg textures
-
Fix tile fallback colored square rendering at LayerTileTextures depth
-
Add Safe* prefix wall matching (mirrors existing Unsafe* fix)
-
Log unmatched wall names at debug level for diagnostics
-
Fix pre-existing unit test failures
-
Add SaveTypeToTileMapIndex/SaveTypeToWallMapIndex lookup population in TwldFileTests
-
Fix ModTileEntry_FromTag expected SaveType (index+1 when no "value" key)
-
Fix WallProperty.Id serialization: add JsonIgnoreCondition.Never to prevent
WhenWritingDefault from skipping Id=0 (which deserializes to default -1) -
Add textureWrap data for tile 185 (Small Decos) in tiles.json
📦 Other Changes
-
TModLoader .twld support: NBT parser, tile/wall overlay, round-trip save #1075
-
Add BigEndianReader/Writer for tModLoader's big-endian NBT format (TEdit.Common/IO)
-
Add TagCompound and TagIO: GZip-compressed NBT serializer compatible with tModLoader
-
Add TModLoader/ module: TwldFile, TwldData, ModTileEntry, ModWallEntry, ModTileData, ModWallData
-
Parse .twld sidecar: header, tile/wall maps, binary tile/wall data, chest items, NPCs, tile entities
-
Overlay mod tiles/walls onto World.Tiles using virtual IDs beyond vanilla range
-
Register dynamic TileProperty/WallProperty with stable hash-based placeholder colors
-
Strip mod data before vanilla .wld save, re-apply after (transparent round-trip)
-
Preserve unmodified .twld sections (modData, bestiary, killCounts, etc.) for lossless save
-
25 new tests: TagCompound round-trip, BigEndian encoding, binary tile parsing, entry serialization
-
ModScraper: extract tile/wall colors from .tmod archives #1075
-
Add TEdit.ModScraper console app to scan .tmod files for tile/wall textures
-
Support both PNG and tModLoader .rawimg texture formats
-
Sample weighted average colors from non-transparent pixels
-
Output modColors.json mapping mod:tile → hex color
-
Search Steam Workshop and tModLoader Mods directories by default
-
Add modColors.json loading to TwldFile for better mod tile rendering
-
Fall back to hash-based colors when no scraped color available
-
Cache mod colors after first load for performance
-
Add 8 regression tests: vanilla world guards, modColors.json parsing
-
All 21 TwldFile tests pass, 0 regressions
-
World Explorer: add Vanilla/tModLoader toggle button #1075
-
Add toggle button in search bar to switch between Vanilla and tModLoader worlds
-
Filter world list by IsTModLoader flag from world header
-
Scan tModLoader worlds folder (My Games/Terraria/tModLoader/Worlds)
-
Show world count for each mode in the toggle button
-
Auto-select tModLoader mode when no vanilla worlds exist
-
Add localization keys: world_explorer_tab_vanilla, world_explorer_tab_tmodloader
-
Load mod tile/wall textures from .tmod archives at world load #1075
-
Add TmodTextureExtractor to read .tmod archives and extract tile/wall textures (PNG + rawimg)
-
Add name-to-virtual-ID mapping in TwldFile for bridging texture paths to tile/wall IDs
-
Wire LoadModTextures into WorldViewModel load pipeline after RegisterModSprites
-
Add Texture2D loading helpers for PNG bytes and raw RGBA with color key transparency
-
Process texture queue in render loop for deferred mod texture creation
-
Fix rawimg decoder to handle version=1 header prefix (3 int32s not 2)
-
Find .tmod files via cascading search: tModLoader Mods folder, Steam workshop
-
Add 19 unit tests for rawimg decoding, name mapping, and real .tmod integration
-
Add tmodloader-support.md tracking remaining mod support work
-
Item editing
-
Mod chest item editing: copy/paste, UI display, item textures #1075
-
Copy/paste now carries mod fields (ModName, ModItemName, prefix, NBT data)
-
NetId setter clears mod identity so vanilla item selection works cleanly
-
Chest editor shows italic mod item name when IsModItem is true
-
Extract item textures from .tmod archives, display 24x24 previews
-
FastChestItem template uses MultiBinding for mod+vanilla preview lookup
-
Add ModItemPreviewCache (string-keyed) and ItemPreviewMultiConverter
-
Fix pre-existing: UndoManager TileImportance bounds check for mod tiles
-
Fix pre-existing: ClipboardView binding path (Buffer.Name)
-
Mod item support for tile entity editors #1075
-
Add mod fields (ModName, ModItemName, etc.) to TileEntityItem and TileEntity
-
TileEntity.ToItem()/FromItem() helpers for single-item entities
-
TileEntityItem carries mod identity through Copy, ToItem, and implicit operators
-
Item.ToTileEntityItem() and implicit operator preserve mod fields
-
ApplyModTileEntityItems: overlay .twld NBT mod data onto tile entities at load
-
RebuildModTileEntityItems: serialize mod data back to NBT at save
-
Fix sync save path missing RebuildModChestItems call
-
Copy/paste now works for all single-item entity types with mod identity
-
XAML bindings for IsModItem/ModItemDisplayName on all tile entity editors
-
Updated tmodloader-support.md with tile entity architecture notes
-
Convert console.wld to LFS pointer
👥 Contributors
- @BinaryConstruct (11 commits)