Important
Supports Terraria 1.4.5.5 (world file version 318)
Caution
Initial experimental support for tModLoader 1.4.4.9
🎉 New Features
-
Add ReactiveUI v23 module initializer for test project
-
Add spray support to morph tool
-
Morph tool now supports spray mode (density, speed controls)
-
Inherits brush line shapes, outline mode, and transforms
-
Morph target setup runs before first spray tick
-
Add item id and search to chests fixes #2189
-
Add mica fix and fallback for windows fixes #2184
-
Add CAD-style wire routing for pencil tool
-
Add WireRouter with 90° elbow and 45° miter routing algorithms (4-connectivity only)
-
Add click-to-click drawing: first click sets anchor, preview renders to cursor, second click commits
-
W key cycles routing modes: Wire 90° → Wire 45° → Normal → repeat (anchor preserved)
-
Q key toggles direction: Auto ↔ → Horizontal-first ↓ → Vertical-first
-
Right-click or Escape cancels anchor, second Escape exits CAD mode
-
Render colored preview tiles in XNA matching active wire color
-
Add status bar indicator with localized mode text and Unicode direction arrows
-
Add 59 unit tests for WireRouter covering all quadrants, edge cases, and 4-connectivity
-
Works with all paint modes (tile/wall, wire, liquid)
-
Add bus routing fixes #2190
-
Add wire routing scripting API
-
Add routeWire() and routeBus() to draw API for CAD-style routing
-
Add routeWirePath() and routeBusPath() for coordinate-only queries
-
Support 90° elbow and 45° miter modes with auto/h/v direction
-
Bus wireCount auto-converts to brush size based on spacing
-
Works with any picker config (wires, tiles, liquids)
-
Add 10 unit tests for routing API
-
Add overflow menu to activity bar for short windows
-
Add OverflowTabPanel that replaces TabPanel in the activity bar
-
Hidden tabs appear in a context menu anchored bottom-right
-
Icon foreground bound explicitly to avoid black-on-startup
-
Add line drawing previews to pencil
-
Add shift+line preview for pencil and brush tools
-
Show preview line from last click position to cursor when holding shift
-
Brush tool supports full brush shape preview (High Quality Brush Preview setting)
-
Preview computed at render time to avoid input/render thread race conditions
-
Uses same transparent blue color as the standard cursor preview
-
Normal cursor preview at tip remains visible during line preview
-
Add debounce for high quality brush line preview
-
Cache HQ brush preview and debounce recomputation by 250ms
-
Show stale cache while cursor is moving, recompute when paused
-
Simple Bresenham line preview (pencil/LQ) remains instant
-
Clear cache when shift is released
🐛 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
- Fix ApplicationInsights v3 API changes: use GlobalProperties for removed context properties
- Fix LuaCSharp 0.5.3 API changes: update delegate signatures and exception types
- Fix ReactiveUI v23 build: replace RxApp with RxSchedulers, update ReactiveUI.WPF
- Fix for weird chest sizes
- Fix build
✨ Enhancements
- Update dependency VirtualizingWrapPanel to 2.5.0 (#2183)
- Update actions/setup-dotnet action to v5
- Update actions/checkout action to v6
- Update dependency Microsoft.ApplicationInsights to v3
- Update dependency coverlet.collector to v8
- Update Avalonia
- Update dependency SkiaSharp to 3.119.2
- Update dependency LuaCSharp to 0.5.3
- Update actions/upload-artifact action to v6
- Update dependency System.Drawing.Common to v10
- Update dependency ReactiveUI to v23
- Update crowdin link
📦 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
-
Merge remote-tracking branch 'origin/renovate/actions-setup-dotnet-5.x' (#2076)
-
Merge remote-tracking branch 'origin/renovate/actions-checkout-6.x' (#2102)
-
Merge remote-tracking branch 'origin/renovate/major-applicationinsights-dotnet-monorepo' (#2129)
-
Merge remote-tracking branch 'origin/renovate/coverlet.collector-8.x' (#2154)
-
Merge remote-tracking branch 'origin/renovate/avalonia' (#2157)
-
Merge remote-tracking branch 'origin/renovate/skiasharp-monorepo' (#2158)
-
Merge remote-tracking branch 'origin/renovate/luacsharp-0.x' (#2161)
-
Merge remote-tracking branch 'origin/renovate/major-github-artifact-actions' (#2162)
-
Merge remote-tracking branch 'origin/renovate/major-dotnet-monorepo' (#2163)
-
Merge remote-tracking branch 'origin/renovate/reactiveui-23.x'
Conflicts:
src/TEdit/TEdit.csproj (#2176)
-
New Crowdin translations by GitHub Action
-
New Crowdin translations by GitHub Action
-
Merge main into feature/modloader
-
Resolve conflicts: take main's dependency updates (ReactiveUI v23,
System.Drawing.Common v10, ApplicationInsights v3) -
Keep modloader's Mode=OneWay bindings in PaintModeView for mod tile support
-
Re-add modloader localization keys dropped during merge (nbt_explorer_title,
world_explorer_tab_vanilla, world_explorer_tab_tmodloader) -
Restore Xunit.SkippableFact package reference for modloader tests
-
Fix ReactiveUI v23 module initializer for TEdit.Terraria.Tests
-
Merge remote-tracking branch 'origin/main' into feature/modloader
-
Drag ClipboardBuffer
-
Wire mode and paste improvements
👥 Contributors
- @BinaryConstruct (42 commits)
- 🌟 @crowdin-bot (2 commits)
- @renovate[bot] (11 commits)