Tôi làm Structure Studio từ một nhu cầu khá đơn giản: một công trình Terraria không nên bị giữ mãi trong một world. Một căn nhà, máy frame, bức pixel art hay cụm trang trí đều nên có thể lưu riêng, mở ra sửa tiếp và gửi cho người khác.

Có hai cách dùng Structure Studio. Trong trang xem map, nó giúp đưa công trình từ world ra package hoặc nhập package trở lại world. Còn trang Structure Studio riêng là nơi để bạn thiết kế từ đầu mà không cần tải file world.

Structure Studio trong trang xem map

Nếu công trình đã nằm trong một world, hãy mở world đó, bật Edit Mode rồi chọn trọn khu vực cần lấy. Mở tool Structure Studio để biến vùng chọn thành file .twpack. Cách này phù hợp khi bạn muốn lấy một căn nhà, đấu trường, máy móc hoặc phần trang trí ra khỏi map hiện tại.

Chiều ngược lại cũng tương tự. Bạn mở package, kiểm tra kích thước và cách đặt, đưa nó vào clipboard rồi dùng Paste để đặt lên map. Với package lạ hoặc công trình lớn, tôi vẫn khuyên sao lưu file .wld đích trước.

Trang riêng là một xưởng thiết kế, không phải map viewer

Màn hình chào của Structure Studio với lựa chọn tạo mới và mở twpack
Tạo một structure trống, mở package có sẵn hoặc khôi phục bản nháp gần nhất.

Trang chuyên biệt không yêu cầu file world. Nó chỉ tạo một tài liệu nhỏ chứa đúng khu vực bạn định xây. Nhờ vậy trang mở nhanh hơn, dễ di chuyển hơn và bạn cũng không bị cả bản đồ lớn làm phân tâm.

Tôi thường dùng trang này cho những thứ cần sửa qua nhiều lượt: khung nhà, bộ nội thất, hệ thống dây, máy frame, bảng hiệu, pixel art hoặc các cụm decor dùng lại ở nhiều nơi. Canvas quá lớn vẫn có thể tốn nhiều bộ nhớ, nhưng với công trình thông thường, làm việc trên một tài liệu riêng nhẹ và gọn hơn nhiều so với tải cả world.

Tạo một structure mới

Hộp thoại tạo Structure mới với tên kích thước và anchor
Đặt tên, chọn kích thước canvas và điểm neo mặc định.
  1. Chọn New Structure.
  2. Đặt một cái tên dễ nhận biết. Tên này cũng được dùng khi xuất package.
  3. Nhập chiều rộng và chiều cao theo tile Terraria. Nên chừa khoảng trống quanh máy móc hoặc vật thể có frame lớn.
  4. Chọn anchor. Bottom center tiện cho nhà đặt trên mặt đất; Center thường hợp với tranh.
  5. Xem dung lượng ước tính rồi chọn Create Canvas.

Kích thước canvas cũng là kích thước structure. Đừng tạo canvas thật lớn chỉ để có thêm chỗ trống: toàn bộ số ô đó đều tốn bộ nhớ và làm package mang kích thước lớn hơn cần thiết.

Bộ công cụ Edit Mode, nhưng không cần tải world

Canvas và các công cụ chỉnh sửa Terraria trong Structure Studio
Structure Studio dùng chung hệ thống với Edit Mode và chỉ hiện những tool làm việc được trên tài liệu structure.

Nếu từng sửa map, bạn sẽ nhận ra thanh công cụ ngay. Pen, Brush, Eraser, Fill, các công cụ hình học, Selection, Paste, Replace, Pixel Art, đặt object, làm wiring, Undo và History đều dùng chung hệ thống chỉnh sửa với Edit Mode.

Một số lệnh chỉ dành cho world sẽ không xuất hiện. Chẳng hạn World Properties không có ý nghĩa khi tài liệu này không có world header. Vì vậy, nói chính xác thì Structure Studio có bộ công cụ Edit Mode tương thích với tài liệu structure, chứ không phải bê nguyên mọi lệnh của trang map sang.

Layer thay đổi cách chỉnh sửa công trình Terraria

Panel quản lý layer trong Structure Studio
Tách từng phần của công trình ra các edit layer riêng trong lúc thiết kế.

Đây là phần tôi thấy đáng dùng nhất. Thay vì ghi mọi thay đổi thẳng lên một mặt phẳng, bạn có thể chia công trình thành nhiều layer. Khi làm nhà, tôi để khung nhà ở một layer, nội thất ở layer khác và wiring ở layer thứ ba. Với pixel art, phần tranh, đường viền và khối đỡ cũng có thể tách riêng.

Mỗi layer có thể được chọn, đổi tên, ẩn, đổi thứ tự hoặc giảm opacity. Khi vẽ, xóa hay di chuyển trên layer đang chọn, dữ liệu nằm ở layer khác không bị sửa trực tiếp. Wiring che mất hình thì ẩn nó đi một lúc. Decor đặt sai chỗ thì di chuyển layer đó, không cần dựng lại bức tường phía sau.

Có một giới hạn cần biết: layer là công cụ hỗ trợ trong lúc thiết kế. Khi export, các layer đang hiển thị sẽ được flatten thành dữ liệu structure cuối cùng. Định dạng .twpack hiện tại không giữ nguyên chồng layer để mở lại và chỉnh như file Photoshop. Layer đang bị ẩn cũng không đi vào kết quả đã flatten.

Ví dụ thực tế: làm pixel art

Thiết kế pixel art trong Structure Studio
Dùng Pixel Art để tạo bản đầu, sau đó sửa tay bằng các công cụ còn lại.

Bạn có thể chạy Pixel Art ngay trên canvas rồi dùng Pen, Eraser, Replace và Selection để dọn lại kết quả. Nếu ảnh được đặt trên layer riêng, việc thử nghiệm cũng bớt rủi ro: tạo một phương án khác ở layer mới, đổi đường viền hoặc thử loại khối đỡ khác mà không làm hỏng phần còn lại.

Cách làm này cũng hợp với máy frame. Tách lớp vỏ nhìn thấy khỏi wire, actuator và các object chức năng. Khi cần kiểm tra, bạn chỉ việc hiện đúng hệ thống mình đang sửa thay vì nhìn mọi thứ chồng lên nhau.

Kiểm tra công trình bằng Real View

Công trình trong Structure Studio khi bật Real View
Real View cho thấy texture, paint, liquid và animation trước khi package được đưa vào world.

Canvas thường phù hợp để chỉnh chính xác từng tile. Real View trả lời một câu hỏi khác: các tile này khi vào Terraria sẽ trông ra sao? Hãy bật nó để kiểm tra texture gây rối, màu sơn, chất lỏng, object động và frame của vật thể nhiều tile. Tôi khuyên chuyển qua lại giữa hai chế độ thay vì chỉ thiết kế dựa vào màu minimap.

Xuất, lưu trữ và dùng lại

Nút xuất twpack trong Structure Studio
Xuất phần kết quả đang hiển thị thành một file .twpack độc lập.

Khi làm xong, chọn Export .twpack. Bạn có thể giữ file trong thư viện công trình cá nhân, gửi cho người khác hoặc mở nó bằng Structure Studio trong trang map để paste vào world.

Trình duyệt cũng giữ một bản nháp cục bộ để khôi phục sau khi vô tình tải lại trang. Tính năng này tiện, nhưng không thay thế cho việc export. Dữ liệu trình duyệt có thể bị xóa và bản recovery không phải file để chia sẻ.

Định dạng .twpack

Phần còn lại là tài liệu kỹ thuật dành cho người viết tool và mod. .twpack là định dạng trao đổi, không phải file bị khóa cho riêng TerraWorld.dev. Chúng tôi khuyến khích bạn đọc, tạo, chuyển đổi và hỗ trợ nó trong mod Terraria. Hãy nhận diện package bằng các trường trong manifest, không chỉ bằng phần mở rộng của tên file.

Cấu trúc file sau khi giải nén twpack
Một file .twpack là ZIP chứa manifest, metadata, tile payload và entity payload.

Cấu trúc archive

example.twpack
├── manifest.json
├── structure.json
└── payload/
    ├── tiles.bin
    └── entities.json

Writer hiện tại tạo ZIP chuẩn với method 0 (STORE), nghĩa là các entry được lưu mà không dùng Deflate. Reader hiện tại của TerraWorld từ chối entry có nén, đường dẫn tuyệt đối, đường dẫn bắt đầu bằng dấu gạch chéo ngược hoặc đường dẫn chứa ...

manifest.json

{
  "format": "terraworld-data-package",
  "schemaVersion": 1,
  "kind": "structure",
  "name": "Example Structure",
  "createdAt": 1780000000000,
  "files": {
    "structure": "structure.json",
    "tiles": "payload/tiles.bin",
    "entities": "payload/entities.json"
  }
}

Ba trường format, schemaVersionkind quyết định khả năng tương thích. Ở phiên bản hiện tại, chúng phải lần lượt là terraworld-data-package, 1structure. createdAt là Unix timestamp tính bằng millisecond. Consumer nên đọc đường dẫn từ object files, không nên hard-code tên payload.

structure.json và entities.json

structure.json chứa name, description, width, height, source, thiết lập placement và các filter boolean gồm tiles, walls, liquids, entities, wires, coatings.

payload/entities.json chứa các mảng chests, signs, tileEntities, modChests và trường validationHints không bắt buộc. Reader nên coi mảng tùy chọn bị thiếu là mảng rỗng. Nếu cần round-trip không mất dữ liệu, đừng tự ý loại bỏ các trường JSON chưa biết.

Tile payload dạng binary

payload/tiles.bin dùng little-endian. File bắt đầu bằng header 12 byte, sau đó là các record cố định 28 byte.

OffsetKiểuGiá trị
04 byteMagic TWST
4uint16Binary version, hiện là 1
6uint16Record size, hiện là 28
8uint32Số record
Offset trong recordKiểuTrường
0uint32Relative X
4uint32Relative Y
8uint16Tile type
10uint16Wall type
12int16Frame U
14int16Frame V
16uint8Liquid amount
17uint8Liquid type
18uint8Wire bit mask
19uint8Tile paint
20uint8Wall paint
21uint8Brick style
22uint16Flags
244 byteĐể dành, hiện bằng 0

Các bit của flags: bit 0 là active tile, bit 1 actuator, bit 2 inactive, bit 3 invisible block, bit 4 invisible wall, bit 5 full-bright block và bit 6 full-bright wall. Wire bit mask dùng thứ tự red, blue, green, yellow từ bit 0 đến bit 3.

Giải nén và đóng gói lại

  1. Mở .twpack như một ZIP archive hoặc tạm đổi phần mở rộng thành .zip.
  2. Đọc manifest.json trước và kiểm tra các trường nhận diện format.
  3. Đọc metadata và payload theo đúng đường dẫn do manifest khai báo.
  4. Khi đóng gói lại, đặt các file ở root của archive, dùng tên UTF-8, ZIP STORE và CRC32 hợp lệ cho từng entry.
  5. Không bọc tất cả file trong một thư mục cha. Đổi phần mở rộng của archive hoàn chỉnh thành .twpack.

Giới hạn validation hiện tại của TerraWorld

  • Kích thước archive tối đa 64 MiB.
  • Width và height phải là số nguyên dương, mỗi chiều không quá 100.000.
  • Tổng số tile cell không quá 10.000.000.
  • Tọa độ của mọi record phải nằm trong kích thước đã khai báo.
  • Binary magic, version, record size, độ dài payload và ZIP CRC32 phải khớp.

Importer của mod nên validate xong trước khi ghi bất kỳ thứ gì vào world. Nó cũng cần kiểm tra tile, wall, item và entity ID có phù hợp với phiên bản Terraria hoặc tModLoader đang chạy hay không. Để dễ tương thích về sau, hãy từ chối schema version chưa hỗ trợ bằng lỗi rõ ràng, chấp nhận các trường JSON chưa biết và thử round-trip package theo cả hai chiều giữa mod và TerraWorld.