None of the vendor repos ship .otb files. They are expected to be provided externally.
vendor/canary/data/items/appearances.dat— protobuf-based appearances (only vendor repo that ships this)
Client 7.40 ~ 15.11 (very broad range). Protobuf appearances used for 12.81+, legacy Tibia.dat/Tibia.spr for older versions.
- ThingTypeManager::loadDat() —
src/client/thingtypemanager.cpp:73-110- Reads signature (u32), content revision, category counts (u16 each for items/creatures/effects/missiles)
- Items start at ID 100, others at ID 1
- Calls
ThingType::unserialize()for each entry (insrc/client/thingtype.cpp)
- SpriteManager::loadSpr() / loadRegularSpr() / loadCwmSpr() —
src/client/spritemanager.h/cpp- Parses
.sprsprite files, also supports CWM sprite format
- Parses
- saveDat() / saveSpr() available under
FRAMEWORK_EDITORflag
- ThingTypeManager::loadAppearances() —
src/client/thingtypemanager.cpp:147-232- Reads
catalog-content.jsonfor sprite sheet metadata - Parses
appearances.datvia protobuf (appearances.proto) - Categories: object (items), outfit (creatures), effect, missile
- Reads
- SpriteAppearances —
src/client/spriteappearances.cpp/h- Handles sprite sheets (
.bmp.lzmaformat)
- Handles sprite sheets (
- Proto file:
src/protobuf/appearances.proto
- ThingTypeManager::loadOtb() —
src/client/thingtypemanager.cpp:525-573- Parses
.otbbinary tree format (signature, root attr version, major/minor version, item types)
- Parses
- ThingTypeManager::loadXml() —
src/client/thingtypemanager.cpp:575-623- Parses
items.xml, requires OTB loaded first
- Parses
- ThingTypeManager::loadStaticData() —
src/client/thingtypemanager.cpp:268-316- Parses
staticdata.datvia protobuf for monster/boss race data - Proto file:
src/protobuf/staticdata.proto
- Parses
Using OTClient's appearances.proto (vendor/otclient/src/protobuf/appearances.proto) as the canonical proto definition.
- Most complete / newest version (supports up to client 15.11)
- Has extra fields vs Canary/RME:
deco_kit,hook_south,hook_east,transparencylevel,ITEM_CATEGORYquiver/soul_cores/fist_weapons,PLAYER_PROFESSION_MONK - Wire-compatible with Canary's bundled
appearances.dat(unknown fields are safely ignored by protobuf) - Package:
otclient.protobuf.appearances
appearances.dat— from Tibia 15.00 client (4.8MB)appearances.proto— fromvendor/otclient/src/protobuf/appearances.protocanary.otbm— fromvendor/canary/data-canary/world/canary.otbm(19MB, OTBM version 2)items.xml— fromvendor/canary/data/items/items.xml(84k lines, item names/properties)sprites/— original.bmp.lzmasheets (4,879) +catalog-content.jsonfrom Tibia 15.00 clientsprites-png/— pre-converted PNG sheets (4,879) + generatedcatalog-content.json
In the modern Canary/protobuf format, server ID = client ID. Canary's items.xml uses plain id attributes (starting at 100) with no separate clientid field. The old .otb mapping layer (server ID ↔ client ID) was only needed for older versions where these IDs diverged.
OTBM (item IDs) → appearances.dat (same IDs, sprite refs + flags) → sprite sheets (pixels)
↑
items.xml adds names/properties
RME's ItemDatabase (source/items.h) has two loading paths:
loadFromOtb()— classic.otbfor old versionsloadFromProtobuf()— loads directly from protobufAppearances, no.otbneeded
Sourced from Tibia 15.00 client installation. Pre-converted to PNG via scripts/convert-sprites.ts (Node.js, uses lzma-native + sharp).
- Client version: 15.00 (
src/core.hpp: CLIENT_VERSION = 1500) - Ships
appearances.datanditems.xml - Ships multiple
.otbmmaps (main world + quest/event maps) - TODO: explore parsers further
- Has OTBM read/write (
source/iomap_otbm.cpp) - Has OTB parser (
source/items.cpp) - Has protobuf appearances loader (
source/items.h: loadFromProtobuf()) - Has sprite appearances loader (
source/sprite_appearances.cpp/h) - TODO: explore parsers further