Files
Epicnabbo-Catalogus-Updated…/readme.md
T
Remco Epicnabbo 9a3fa1eb6b Replace README with catalog DB reference
Replace previous EpicNabbo v2 development README with a comprehensive Catalog Database Reference. The new document details core tables (items_base, catalog_pages, catalog_items), additional catalog tables, full column schemas, compatibility with Arcturus emulator, Nitro-V3 client and Nitro_Render_V3 renderer, schema differences, data flow diagram, and reference counts from FullDatabase.sql. Removes the prior development warning/marketing content and provides actionable technical documentation and links to relevant files for developers.
2026-06-11 16:11:52 +02:00

182 lines
11 KiB
Markdown

# Catalog Database Reference
This document describes the core catalog tables (`catalog_items`, `catalog_pages`, `items_base`) and their compatibility across the Habbo retro stack.
## Overview
The catalog system consists of three core database tables shared between the **emulator (Arcturus Morningstar Extended)**, **Nitro-V3 (React client)**, and **Nitro_Render_V3 (renderer)**:
```
items_base → defines every furniture item (interaction type, dimensions, stack behavior, etc.)
catalog_pages → defines the catalog tree structure (pages, sub-pages, layouts)
catalog_items → defines what items are sold on which pages and at what price
```
Additional tables for special catalog features:
- `catalog_pages_bc` / `catalog_items_bc` — Builders Club catalog
- `catalog_items_limited` — tracks limited-edition (RARE) item sales
- `catalog_club_offers` — HC/VIP/BC subscription offers
- `catalog_clothing` — wearable clothing items
- `catalog_featured_pages` — front page featured slots
- `catalog_target_offers` — targeted promotional offers
## Table Schemas
### `items_base`
Defines the base properties of every furniture item. Referenced by `catalog_items.item_ids`, `items.id`, and many other tables via foreign key.
| Column | Type | Description |
|--------|------|-------------|
| `id` | `int(10) unsigned` | Primary key, matches sprite ID in FurnitureData |
| `sprite_id` | `int(11)` | Sprite identifier (usually same as `id`) |
| `public_name` | `varchar(56)` | Display name shown in the client |
| `item_name` | `varchar(70)` | Internal classname (matches FurnitureData classname) |
| `type` | `varchar(3)` | `s` = floor item, `i` = wall item, `r` = robot/bot, `e` = effect |
| `width` | `int(11)` | Tile width |
| `length` | `int(11)` | Tile length |
| `stack_height` | `double(4,2)` | Stack height (0.00 = flat, 1.00 = normal stack) |
| `allow_stack` | `tinyint(1)` | Can other items be stacked on top |
| `allow_sit` | `tinyint(1)` | Can avatars sit on this |
| `allow_lay` | `tinyint(1)` | Can avatars lay on this |
| `allow_walk` | `tinyint(1)` | Can avatars walk through this |
| `allow_gift` | `tinyint(1)` | Can this be wrapped as a gift |
| `allow_trade` | `tinyint(1)` | Can players trade this |
| `allow_recycle` | `tinyint(1)` | Can this be recycled |
| `allow_marketplace_sell` | `tinyint(1)` | Can this be sold on the marketplace |
| `allow_inventory_stack` | `tinyint(1)` | Does this stack in inventory |
| `interaction_type` | `varchar(500)` | Behavior type (e.g. `default`, `gate`, `teleport`, `wired_trigger`, `dimmer`, `postit`, `bed`, `chair`, `football_counter`, etc.) |
| `interaction_modes_count` | `int(11)` | Number of interaction states (e.g. 2 for toggleable items) |
| `vending_ids` | `varchar(255)` | Vending machine reward item IDs |
| `multiheight` | `varchar(50)` | Multi-height stack data |
| `customparams` | `varchar(256)` | Custom parameters (e.g. clothing set IDs) |
| `effect_id_male` | `int(11)` | Male avatar effect ID |
| `effect_id_female` | `int(11)` | Female avatar effect ID |
| `clothing_on_walk` | `varchar(255)` | Clothing effect applied on walk |
### `catalog_pages`
Defines the hierarchical catalog tree structure visible in the Nitro client.
| Column | Type | Description |
|--------|------|-------------|
| `id` | `int(11)` | Primary key |
| `parent_id` | `int(11)` | Parent page ID (`-1` = root page) |
| `caption_save` | `varchar(25)` | Internal caption key |
| `caption` | `varchar(128)` | Display caption |
| `page_layout` | `enum` | Layout type: `default_3x3`, `frontpage`, `club_buy`, `club_gift`, `spaces`, `spaces_new`, `recycler`, `trophies`, `plasto`, `soundmachine`, `guilds`, `guild_furni`, `bots`, `pets`, `single_bundle`, `productpage1`, `room_bundle`, `sold_ltd_items`, `badge_display`, `vip_buy`, `default_3x3_color_grouping`, `frontpage_featured`, `petcustomization`, `collectibles`, `info_duckets`, `info_rentables`, `info_pets`, `recent_purchases`, `marketplace`, `marketplace_own_items`, `roomads`, `guild_forum`, `info_loyalty`, `loyalty_vip_buy` |
| `icon_color` | `int(11)` | Catalog icon color (1-255) |
| `icon_image` | `int(11)` | Catalog icon image ID |
| `min_rank` | `int(11)` | Minimum rank to view |
| `order_num` | `int(11)` | Sort order |
| `visible` | `enum('0','1')` | Is the page visible |
| `enabled` | `enum('0','1')` | Is the page enabled |
| `club_only` | `enum('0','1')` | HC/VIP only |
| `vip_only` | `enum('1','0')` | VIP only |
| `page_headline` | `varchar(1024)` | Headline image/text key |
| `page_teaser` | `varchar(64)` | Teaser image key |
| `page_special` | `varchar(2048)` | Special layout data |
| `page_text1` | `text` | Primary page text |
| `page_text2` | `text` | Secondary page text |
| `page_text_details` | `text` | Detail text |
| `page_text_teaser` | `text` | Teaser text |
| `room_id` | `int(11)` | Room ID (for room bundle pages) |
| `includes` | `varchar(128)` | Sem colon separated page IDs to include (`1;2;3`) |
| `catalog_mode` | `enum('NORMAL','BUILDER','BOTH')` | Catalog mode |
### `catalog_items`
Links items_base entries to catalog_pages with pricing and availability.
| Column | Type | Description |
|--------|------|-------------|
| `id` | `int(11)` | Primary key |
| `item_ids` | `varchar(666)` | Comma-separated items_base IDs (usually single ID) |
| `page_id` | `int(11)` | FK → catalog_pages.id |
| `offer_id` | `int(11)` | Offer ID (`-1` = default) |
| `song_id` | `int(10) unsigned` | Trax song ID |
| `order_number` | `int(11)` | Sort order within the page |
| `catalog_name` | `varchar(100)` | Catalog name / offer identifier |
| `cost_credits` | `int(11)` | Credit cost |
| `cost_points` | `int(11)` | Points/currency cost |
| `points_type` | `int(11)` | 0 = duckets, 5 = diamonds, others = seasonal currencies |
| `amount` | `int(11)` | Amount received per purchase |
| `limited_sells` | `int(11)` | How many have been sold (auto-tracked) |
| `limited_stack` | `int(11)` | Total limited quantity (0 = unlimited) |
| `extradata` | `varchar(500)` | Extra data (e.g. badge code, preset data) |
| `badge` | `varchar(500)` | Badge code (AtomCMS extension, always null for emulator) |
| `have_offer` | `enum('0','1')` | Is the offer active |
| `club_only` | `enum('0','1')` | HC/VIP only |
| `rate` | `varchar(255)` | Rate info (AtomCMS extension, always null for emulator) |
## Compatibility Matrix
### Emulator (Arcturus Morningstar Extended)
| Table | Status | Notes |
|-------|--------|-------|
| `items_base` | ✅ Full native | The emulator reads this directly for furniture definitions. Full schema match. |
| `catalog_pages` | ✅ Full native | The emulator reads from this for catalog tree. Full schema match. |
| `catalog_items` | ✅ Full native | The emulator reads this for offers/pricing. Full schema match. |
The emulator directly queries all three tables via its DAO layer. No translation or mapping layer is needed.
### Nitro-V3 (React Client)
| Table | Status | Notes |
|-------|--------|-------|
| `items_base` | ✅ Full native via emulator | Client never reads DB directly. Data flows: DB → emulator → Nitro protocol → client. `public_name` is used by `FurniEditor` (see `src/hooks/furni-editor/useFurniEditor.ts:11`). |
| `catalog_pages` | ✅ Full native via emulator | Catalog tree is served by the emulator through `CatalogModeComposer` / `CatalogPageComposer` protocol messages. |
| `catalog_items` | ✅ Full native via emulator | Offer data is served by the emulator through `CatalogOfferComposer` protocol messages. |
The client does not require any direct database access. All catalog data is served real-time via the emulator's Nitro WebSocket protocol.
### Nitro_Render_V3 (Renderer)
| Table | Status | Notes |
|-------|--------|-------|
| `items_base` | ✅ Compatible via client | The renderer receives furniture rendering data (dimensions, interaction type, states) from the client, which receives it from the emulator. |
| `catalog_pages` | ✅ Not applicable | The renderer does not deal with catalog pages. |
| `catalog_items` | ✅ Not applicable | The renderer does not deal with catalog offers. |
The renderer consumes FurnitureData.json (gamedata) for sprite/asset mapping. The `items_base.interaction_type` must match the interaction logic in the renderer's room engine.
## Schema Differences
The AtomCMS schema has two extra columns on `catalog_items` compared to the emulator's reference schema:
| Column | AtomCMS | Emulator | Impact |
|--------|---------|----------|--------|
| `badge` | `varchar(500)` | Not present | Backward compatible — extra column ignored by emulator |
| `rate` | `varchar(255)` | Not present | Backward compatible — extra column ignored by emulator |
| `PRIMARY KEY` | `(id, extradata)` | `(id)` | AtomCMS composite PK does not break emulator FK constraints (`fk_catitems_page` references `page_id`) |
These are safe additions. The emulator only reads the columns it knows about.
## Data Flow
```
┌──────────────┐ SQL ┌──────────────┐ Nitro Protocol ┌──────────┐ Render Cmds ┌────────────────┐
│ MySQL/Maria │ ◄──────────► │ Emulator │ ◄────────────────► │ Nitro-V3 │ ◄──────────────► │ Nitro_Render_V3│
│ (items_base,│ │ (Arcturus │ (WebSocket) │ (React) │ │ (PixiJS) │
│ catalog_*, │ │ Morningstar│ │ │ │ │
│ ...) │ │ Extended) │ │ │ │ │
└──────────────┘ └──────────────┘ └──────────┘ └────────────────┘
```
## Reference Data
The FullDatabase.sql shipped with the emulator contains:
- ~10,420 `items_base` rows
- ~769 `catalog_pages` rows
- ~10,790 `catalog_items` rows
This is the complete, production-ready catalog for Arcturus Morningstar Extended, fully compatible with Nitro-V3 and Nitro_Render_V3 out of the box.
## See Also
- `/var/www/emulator/Default Database/FullDatabase.sql` — reference database
- `/var/www/emulator/docs/builders_club_catalog_reference.md` — BC catalog docs
- `/var/www/atomcms/database/schema/mysql-schema.sql` — AtomCMS schema
- `/var/www/atomcms/app/Services/CatalogService.php` — CMS catalog sync tools
- `/var/www/Nitro-V3/src/hooks/furni-editor/useFurniEditor.ts` — client furni editor