# Wired Creator Tools (`:wired`) Reference ## 1. Scope This document describes the current `:wired` tooling that was added across: - `Arcturus-Morningstar-Extended` (server-side data, diagnostics, config) - `Nitro_Render_V3` (packet parsing and room/session metadata) - `Nitro-V3` (UI, monitor, inspection, previews, inline editing) It focuses on: - the `Monitor` tab - the `Inspection` tab (`furni`, `user`, `global`) - the `wired_emulator_settings` database table - the formulas and thresholds behind the monitor statistics --- ## 2. High-level architecture ### 2.1 Data flow `Emulator` -> `Nitro_Render_V3` -> `Nitro-V3` - The emulator computes room diagnostics and exposes extra room, furni, user, and monitor metadata. - The renderer parses those packets and stores the values in room/session data objects. - Nitro reads those values and renders them in the `:wired` UI. ### 2.2 Main files - Emulator diagnostics: - `Emulator/src/main/java/com/eu/habbo/habbohotel/wired/core/WiredEngine.java` - `Emulator/src/main/java/com/eu/habbo/habbohotel/wired/core/WiredRoomDiagnostics.java` - `Emulator/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredMonitorDataComposer.java` - Renderer parsing: - `Nitro_Render_V3/packages/communication/src/messages/parser/roomevents/WiredMonitorDataParser.ts` - Nitro UI: - `Nitro-V3/src/components/wired-tools/WiredCreatorToolsView.tsx` --- ## 3. Database configuration ## 3.1 New table Wired configuration is now separated from `emulator_settings` into: ```sql wired_emulator_settings ( key, value, comment ) ``` Migration file: - `Database Updates/002_move_wired_settings_to_wired_emulator_settings.sql` The migration: 1. creates `wired_emulator_settings` 2. imports existing wired values from `emulator_settings` 3. inserts defaults for new monitor/diagnostic keys when missing 4. removes migrated wired keys from `emulator_settings` ### 3.2 Compatibility behaviour The emulator still has a **fallback read path**: - first it reads wired keys from `wired_emulator_settings` - if a wired key is still missing there, it can still read it from the old `emulator_settings` This allows safe rollout during migration. ## 3.3 Wired configuration keys | Key | Default | Purpose | |---|---:|---| | `wired.engine.enabled` | `1` | Compatibility flag kept for old configs. Wired now runs through the new engine only. | | `wired.engine.exclusive` | `1` | Compatibility flag kept for old configs. Wired now runs through the new engine only. | | `wired.engine.maxStepsPerStack` | `100` | Maximum internal processing steps allowed for one stack execution. | | `wired.engine.debug` | `0` | Enables verbose wired engine logging. | | `wired.custom.enabled` | `0` | Enables legacy custom wired compatibility logic. | | `hotel.wired.furni.selection.count` | `5` | Maximum furni count selectable/storable by wired boxes. | | `hotel.wired.max_delay` | `20` | Maximum accepted wired delay value for delayed effects. | | `hotel.wired.message.max_length` | `100` | Maximum length of wired/bot text fields. | | `wired.effect.teleport.delay` | `500` | Delay in milliseconds used by wired teleports. | | `wired.place.under` | `0` | Allows wired furniture placement under other items. | | `wired.tick.interval.ms` | `50` | Global tick interval in milliseconds for repeater-style wired. | | `wired.tick.resolution` | `100` | Legacy compatibility tick resolution value. | | `wired.tick.debug` | `0` | Enables verbose logging for the tick service. | | `wired.tick.thread.priority` | `6` | Java thread priority for the tick service. | | `wired.highscores.displaycount` | `25` | Maximum wired highscore entries shown to the user. | | `wired.abuse.max.recursion.depth` | `10` | Maximum recursive wired depth before execution stops. | | `wired.abuse.max.events.per.window` | `100` | Maximum identical events allowed inside the abuse rate-limit window. | | `wired.abuse.rate.limit.window.ms` | `10000` | Time window in milliseconds used by the abuse limiter. | | `wired.abuse.ban.duration.ms` | `600000` | Room wired-ban duration in milliseconds after abuse detection. | | `wired.monitor.usage.window.ms` | `1000` | Rolling window size used to calculate monitor usage. | | `wired.monitor.usage.limit` | `1000` | Maximum usage budget allowed in one monitor window. | | `wired.monitor.delayed.events.limit` | `100` | Maximum delayed wired events that may be pending in one room. | | `wired.monitor.overload.average.ms` | `50` | Average execution threshold in milliseconds for overload tracking. | | `wired.monitor.overload.peak.ms` | `150` | Peak execution threshold in milliseconds for overload tracking. | | `wired.monitor.overload.consecutive.windows` | `2` | Consecutive overloaded windows required before `EXECUTOR_OVERLOAD`. | | `wired.monitor.heavy.usage.percent` | `70` | Usage percentage threshold that contributes to `MARKED_AS_HEAVY`. | | `wired.monitor.heavy.consecutive.windows` | `5` | Consecutive heavy windows required before the room is marked heavy. | | `wired.monitor.heavy.delayed.percent` | `60` | Delayed queue percentage threshold that contributes to the heavy state. | --- ## 4. Monitor tab ## 4.1 Statistics shown in the UI The `Monitor` tab currently shows: - `Wired usage` - `Is heavy` - `Room furni` - `Wall furni` - `Delayed events` - `Average execution` - `Peak execution` - `Recursion` - `Killed remaining` - `Permanent furni vars` ### 4.1.1 `Wired usage` Format: ```text usageCurrentWindow / usageLimitPerWindow ``` Source: - server-side `WiredRoomDiagnostics` Meaning: - `usageCurrentWindow` = cost consumed in the current rolling monitor window - `usageLimitPerWindow` = max allowed budget before `EXECUTION_CAP` ### 4.1.2 `Is heavy` Format: ```text Yes / No ``` Source: - server-side boolean from `WiredRoomDiagnostics` Meaning: - `Yes` if the room has crossed the heavy thresholds for enough consecutive windows ### 4.1.3 `Room furni` Format: ```text (floor count + wall count) / roomItemLimit ``` Source: - numerator: renderer room object counts - denominator: server room item limit exposed in room/session data ### 4.1.4 `Wall furni` Format: ```text wall count / roomItemLimit ``` Important note: - there is **no separate wall-only cap** here - the denominator is the same room furni limit exposed by the server ### 4.1.5 `Delayed events` Format: ```text delayedEventsPending / delayedEventsLimit ``` Source: - server-side `WiredRoomDiagnostics` ### 4.1.6 `Average execution` Format: ```text averageExecutionMs + "ms" ``` Meaning: - average execution time of sampled stacks inside the current monitor window ### 4.1.7 `Peak execution` Format: ```text peakExecutionMs + "ms" ``` Meaning: - highest sampled execution time inside the current monitor window ### 4.1.8 `Recursion` Format: ```text recursionDepthCurrent / recursionDepthLimit ``` Meaning: - current nested wired call depth vs the configured recursion cap ### 4.1.9 `Killed remaining` Format: ```text killedRemainingSeconds + "s" ``` Meaning: - remaining room cooldown while wired execution is temporarily halted by protection logic ### 4.1.10 `Permanent furni vars` Format: ```text customVariableEntryCount / 60 ``` Current meaning: - the numerator is the total number of renderer-side entries stored inside `RoomObjectVariable.FURNITURE_CUSTOM_VARIABLES` - the denominator `60` is currently a fixed UI denominator This is currently **renderer-side custom variable count**, not a DB row count. --- ## 4.2 Cost model behind `Wired usage` The current estimated stack cost is computed in the emulator. ### 4.2.1 Base formula ```text cost = 1 cost += number_of_conditions cost += 2 for each selector effect cost += 3 for each non-selector effect cost += 4 extra for each delayed effect cost += recursionDepth * 2 cost = max(1, cost) ``` ### 4.2.2 Practical breakdown | Element | Cost | |---|---:| | Base stack cost | `1` | | Each condition | `+1` | | Each selector effect | `+2` | | Each regular effect | `+3` | | Each delayed effect | `+4` extra | | Each recursion level | `+2` | ### 4.2.3 Example If a stack has: - `2` conditions - `1` selector - `2` normal effects - `1` delayed effect - recursion depth `1` Then: ```text 1 + 2 conditions + 2 selector + 6 regular effects + 4 delayed effect extra + 2 recursion = 17 ``` That `17` is what is attempted against: ```text usageCurrentWindow + estimatedCost <= usageLimitPerWindow ``` If the result would exceed the budget, the engine records `EXECUTION_CAP`. --- ## 4.3 Heavy / overload calculations ### 4.3.1 Overload A monitor window is considered overloaded when: ```text executionSamplesCurrentWindow > 0 AND ( averageExecutionMs >= overloadAverageThresholdMs OR peakExecutionMs >= overloadPeakThresholdMs ) ``` After `wired.monitor.overload.consecutive.windows` consecutive overloaded windows: - the room logs `EXECUTOR_OVERLOAD` ### 4.3.2 Heavy A monitor window is considered heavy when at least one of these is true: ```text usagePercent >= heavyUsageThresholdPercent OR delayedPercent >= heavyDelayedThresholdPercent OR overloadWindow == true ``` Where: ```text usagePercent = round(usageCurrentWindow * 100 / usageLimitPerWindow) delayedPercent = round(delayedEventsPending * 100 / delayedEventsLimit) ``` After `wired.monitor.heavy.consecutive.windows` consecutive heavy windows: - the room is marked heavy - the monitor logs `MARKED_AS_HEAVY` --- ## 4.4 Error / warning log types The monitor currently supports: - `EXECUTION_CAP` - `DELAYED_EVENTS_CAP` - `EXECUTOR_OVERLOAD` - `MARKED_AS_HEAVY` - `KILLED` - `RECURSION_TIMEOUT` Each log/history entry can carry: - type - severity - amount/count - latest occurrence - reason/motivation - trigger/source label - trigger/source id --- ## 5. Inspection tab ## 5.1 Furni inspection Current variables include: - `@id` - `@class_id` - `@height` - `@state` - `@position.x` - `@position.y` - `@rotation` - `@altitude` - `@wallitem_offset` (wall items only) - `@type` - `@dimensions.x` - `@dimensions.y` - `@owner_id` - dynamic flags: - `@can_sit_on` - `@can_lay_on` - `@can_stand_on` - `@is_stackable` - extra teleport variable when relevant: - `~teleport.target_id` Editable fields: - `@state` - `@position.x` - `@position.y` - `@rotation` - `@altitude` - `@wallitem_offset` (wall items) Important notes: - floor moves are sent through wired-style movement flow/animation - wall item updates use wall position recomposition - booleans such as sit/lay/stand/stack come from `items_base`-derived metadata, not from `FurnitureData.json` ## 5.2 User inspection Current variables include: - `@index` - `@type` - `@gender` - `@level` - `@achievement_score` - `@position.x` - `@position.y` - `@direction` - `@altitude` - `@favourite_group_id` - `@room_entry` - `@room_entry.teleport_id` - `@user_id` / `@bot_id` / `@pet_id` Dynamic flags/actions include: - `@is_hc` - `@has_rights` - `@is_owner` - `@is_group_admin` - `@is_mute` - `@is_trading` - `@is_frozen` - `@effect` - `@team_score` - `@team_color` - `@team_type` - `@sign` - `@dance` - `@is_idle` - `@handitems` Editable fields: - `@position.x` - `@position.y` - `@direction` ## 5.3 Global inspection Current variables include: - `@furni_count` - `@user_count` - `@wired_timer` - `@teams.red.score` - `@teams.green.score` - `@teams.blue.score` - `@teams.yellow.score` - `@teams.red.size` - `@teams.green.size` - `@teams.blue.size` - `@teams.yellow.size` - `@room_id` - `@group_id` - `@timezone_server` - `@timezone_client` - `@current_time` - `@current_time.millisecond_of_second` - `@current_time.seconds_of_minute` - `@current_time.minute_of_hour` - `@current_time.hour_of_day` - `@current_time.day_of_week` - `@current_time.day_of_month` - `@current_time.day_of_year` - `@current_time.week_of_year` - `@current_time.month_of_year` - `@current_time.year` Important notes: - `@timezone_server` comes from the emulator room/session snapshot and follows `hotel.timezone` - `@timezone_client` comes from the browser - `@wired_timer` is currently client-side time since room entry - `@current_time.*` is currently based on the server hotel time snapshot plus client-side progression --- ## 6. UI behaviour notes ### 6.1 Monitor windows The monitor now uses real Nitro card windows for: - info - log history - error information This means they are: - closable with the standard Nitro card close button - draggable - resizable ### 6.2 Keep selected In `Inspection`: - when `Keep selected` is enabled - clicking another furni/user does **not** replace the current preview/selection ### 6.3 Inline editing Inline editors: - can be opened by clicking the row - submit on `Enter` - stop accidental room chat typing while the input is focused --- ## 7. Current limitations - `Permanent furni vars` currently uses a fixed denominator (`60`) in the Nitro UI - `@wired_timer` is still client-side, not a dedicated server timer - `wired.tick.resolution` is kept for compatibility/documentation, but the current tick service uses `wired.tick.interval.ms` - `wired.highscores.displaycount` is migrated/documented, but its usage should be validated in the current runtime path if highscore behaviour is changed later