Important
Supports Terraria 1.4.5.5 (world file version 318)
Initial preview support for tModLoader 1.4.4.9
Caution
HIGHLY EXPERIMENTAL! NOT FOR REGULAR USE!!!
THIS HAS HIGH LIKELYHOOD OF BREAKING YOUR FILES!!!
Features
- Modded Worlds Explorer
- Initial Save/load for modded worlds
- NBT Editor
- Mod Tile rendering *only tested with calamity mod

🐛 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
- Convert .wld test files to LFS pointers
- Files were committed as raw binaries before LFS was configured
- Re-stage through LFS clean filter to store as proper pointers
- 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
👥 Contributors
- @BinaryConstruct (11 commits)