Skip to content
Felucca Online

Docs

Protocol reference

Generated from uo_proto::msg (protocol version 3) by crates/uo-mcp/tests/protocol_doc.rs: don't edit by hand, run UO_BLESS=1 cargo test -p uo-mcp --test protocol_doc. Decision #3: one public protocol for the game client, scripts and agents alike; bots are ordinary players with the same limits. Guide: scripting.

Transport

Wire protocol. JSON over WebSocket, one message per text frame. The same protocol serves the game client, automation scripts and the MCP bridge — there is no privileged "bot API", bots are first-class players.

Client -> server: {"req": 7, "type": "walk_to", "x": 10, "y": 4}

Server -> client: {"type": "reply", "req": 7, "ok": true, "data": {...}} plus unsolicited delta, snapshot and event messages.

Version 2 (decision #87, docs/server-architecture.md): the world arrives as per-tick deltas of the player's area of interest (entities entering, changing and leaving, object damage); sessions can be resumed on any gateway with the token from Welcome; combat orders and the combat event stream of uo-combat (decision #68) travel with entity ids and world object keys.

Version 3 (decision #121, docs/economy.md): the economy — harvesting, crafting, eating, town markets (swaps, liquidity, vault deposits, plots, proposals), plunder and stolen goods, Aquais' mint and store, corpses and looting; the owner's sheet is pushed privately (GameEvent::Sheet).

Decision #123 (docs/npcs.md) adds townsfolk (EntityKind::Npc), talking to them (Talk, Choose -> GameEvent::Dialogue), the onboarding errands (SkipErrand; progress in the sheet's citizen) and hints (GameEvent::Hint).

Social play (decision #131, docs/social.md, still version 3: every addition is optional): chat channels, parties, guilds, murder counts and young colonists, appended at the ends of the enums.

  • Connect a WebSocket to a gateway (ws://host:7777 by default) and send JSON text frames, one message per frame.
  • Getting in (decision #126): on servers with accounts, sign_in (or sign_in_token with an API token from create_api_token, the way for scripts and bots), then play_character; development servers also take the login by name shown below. resume gets a dropped connection back. Every client message may carry req, a number of your choice; the server answers it with a reply carrying the same req, ok, and either data or a plain-words error.
  • Unsolicited messages: snapshot (the whole area of interest, after login or a gap), delta (what changed each tick, 20 per second), event (chat, work results, combat, your sheet).
  • Field names are snake_case; enums are tagged (type, kind, event). Tiles are x east, y south. Times are server milliseconds. Weights are tenths of a stone. Skill values are tenths (312 = 31.2).
  • Unknown fields must be ignored: new versions add fields and message kinds.

A session, line by line (> sent, < received):

> {"req":1,"type":"login","name":"Ann"}
< {"type":"reply","req":1,"ok":true,"data":{"kind":"welcome","protocol":3,"entity_id":1001,"wallet":"dev:Ann","map_seed":1,"map_width":16384,"map_height":16384,"tick_hz":20,"ledger":"off","token":"2f6c…","server_ms":72000000,"region_size":64,"aoi_radius":18,"x":812,"y":455,"spells":["magic_arrow","heal"],"world":"felucca","world_hash":"9b1e…","day_ms":6900000,"time_scale":1}}
< {"type":"snapshot","tick":9120,"entities":[{"id":1001,"x":812,"y":455,"facing":"south","kind":"player","name":"Ann","moving":false,"equipment":[["main_hand",300]],"look":{"gender":"female","skin":"dark","hair":"long","hair_color":3,"beard":false},"guild":"IW","young":true,"tool":100,"materials":[["main_hand",851]],"keys":[["q","puncture"],["f","dash"]],"runes":[["main_hand",["rune_swift"]]],"exceptional":["main_hand"],"hits":50,"max_hits":50,"mana":20,"max_mana":20,"dead":false,"step_ms":250},{"id":77000001,"x":818,"y":450,"facing":"west","kind":"creature","species":"wolf","hits":18,"max_hits":30,"mana":0,"max_mana":0,"dead":false}]}
> {"req":2,"type":"harvest","target":{"kind":"object","key":4398046511617}}
< {"type":"reply","req":2,"ok":true}
< {"type":"event","event":"worked","text":"You put 2 logs in your pack.","item_id":1,"amount":2,"gain":["lumberjacking",313]}
< {"type":"delta","tick":9121,"update":[{"id":77000001,"x":817,"y":450,"facing":"west","kind":"creature","species":"wolf","hits":18,"max_hits":30,"mana":0,"max_mana":0,"dead":false}]}
> {"req":3,"type":"swap","town":3,"item":1,"side":"sell","amount":100,"limit":1}
< {"type":"reply","req":3,"ok":false,"error":"You don't have that many."}

Commands (client → server)

Every command is an object with type and, optionally, req.

login

Must be the first message (or Resume). name identifies the character; in dev mode it is created on first login.

fieldtype
nameString
{"req":1,"type":"login","name":"Ann"}

resume

Re-attach to a live session (after a dropped connection or a gateway failure) with the token from Welcome.

fieldtype
tokenString
{"req":2,"type":"resume","token":"2f6c…"}

step

Take a single step.

fieldtype
dirDirection
{"req":3,"type":"step","dir":"north_east"}

walk_to

Path-find to a tile and walk there, one step at a time; the walk continues across region borders.

fieldtype
xi32
yi32
{"req":4,"type":"walk_to","x":812,"y":455}

stop

{"req":5,"type":"stop"}

move

Keep walking in a direction (UO's held right mouse button, WASD) until dir: null: one step per step time, sliding along what's in the way. Any other order ends it.

fieldtype
dirOption<Direction>
{"req":6,"type":"move","dir":"west"}

say

fieldtype
textString
{"req":7,"type":"say","text":"Logs for sale!"}

look

Describe the surroundings (entities within radius tiles).

fieldtype
radiusu32
{"req":8,"type":"look","radius":12}

inventory

{"req":9,"type":"inventory"}

equip

Wear an item from the backpack.

fieldtype
item_idItemId
{"req":10,"type":"equip","item_id":304}

unequip

fieldtype
slotEquipSlot
{"req":11,"type":"unequip","slot":"off_hand"}

gather

Old on-chain gathering; refused (use Harvest).

fieldtype
node_idu32
{"req":12,"type":"gather","node_id":1}

craft

Run a recipe times times at a station within reach.

fieldtype
recipe_idRecipeId
timesu32
{"req":13,"type":"craft","recipe_id":1,"times":5}

harvest

Work a resource node (a tree, vein or rock: Object) or fish (Tile of water). Repeats until stopped, the node is spent or the backpack is full; walking or any other order ends it.

fieldtype
targetTargetRef
{"req":14,"type":"harvest","target":{"kind":"object","key":4398046511617}}

use

Use an item from the backpack (eat food).

fieldtype
uidItemUid
{"req":15,"type":"use","uid":17}

move_item

Put an item (with what it holds) into a container we carry: the backpack or a bag in it. Worn items come off first (Unequip). amount: only that many of a stack (split off; the rest stays where it was). onto: a stack in that container to join (same kind), as when one pile is dropped on another; it may be in the same container.

fieldtype
uidItemUid
containerItemUid
amountOption<u32>
ontoOption<ItemUid>
{"req":16,"type":"move_item","uid":17,"container":7,"amount":20,"onto":12}

sheet

Ask for the character's sheet now (it is also pushed on change).

{"req":17,"type":"sheet"}

market

The market of the town whose exchange is within reach.

fieldtype
townTownId
{"req":18,"type":"market","town":3}

swap

Buy or sell amount units of a good at its pool. limit: the most coin to pay (buy) or the least to receive (sell); 0 = none. The trade fails rather than fill worse.

fieldtype
townTownId
itemItemId
sideSide
amountu64
limitu64
{"req":19,"type":"swap","town":3,"item":1,"side":"sell","amount":20,"limit":70}

deposit

Put coin or goods from the backpack into the town's vault.

fieldtype
townTownId
itemItemId
amountu64
{"req":20,"type":"deposit","town":3,"item":8,"amount":500}

withdraw

fieldtype
townTownId
itemItemId
amountu64
{"req":21,"type":"withdraw","town":3,"item":8,"amount":200}

add_liquidity

Add coin and goods to a pool in its ratio (the rest stays with you).

fieldtype
townTownId
itemItemId
goldu64
goodsu64
{"req":22,"type":"add_liquidity","town":3,"item":5,"gold":300,"goods":100}

remove_liquidity

fieldtype
townTownId
itemItemId
sharesu64
{"req":23,"type":"remove_liquidity","town":3,"item":5,"shares":1000}

claim_plot

Hold a plot by locking stake worth its price.

fieldtype
townTownId
plotPlotId
{"req":24,"type":"claim_plot","town":3,"plot":12}

release_plot

fieldtype
townTownId
plotPlotId
{"req":25,"type":"release_plot","town":3,"plot":12}

propose

fieldtype
townTownId
actionAction
{"req":26,"type":"propose","town":3,"action":{"action":"set_fee","fee":800}}

vote

fieldtype
townTownId
proposalu32
yesbool
{"req":27,"type":"vote","town":3,"proposal":4,"yes":true}

plunder

Take goods out of a broken vault; they are stolen.

fieldtype
townTownId
itemItemId
amountu64
{"req":28,"type":"plunder","town":3,"item":8,"amount":2000}

return_stolen

Hand stolen goods back to the town they were taken from.

fieldtype
townTownId
{"req":29,"type":"return_stolen","town":3}

fence

Have a lawless town's fence clean stolen goods for a cut.

fieldtype
townTownId
{"req":30,"type":"fence","town":9}

mint

Aquais: gold ingots to coins at the mint's rate.

fieldtype
ingotsu32
{"req":31,"type":"mint","ingots":3}

buy

Aquais: buy from the mainland store.

fieldtype
itemItemId
amountu32
{"req":32,"type":"buy","item":14,"amount":2}

buy_patent

Any exchange: a work patent for a skill.

fieldtype
skillSkill
{"req":33,"type":"buy_patent","skill":"lumberjacking"}

export

Aquais: ship coins to the mainland (they leave the world).

fieldtype
coinsu64
{"req":34,"type":"export","coins":1000}

loot

Look into a corpse within reach.

fieldtype
keyObjectKey
{"req":35,"type":"loot","key":9007199254740993}

take

Take one item (or everything: no uid) from a corpse within reach; amount: only that many of a stack (the rest stays).

fieldtype
keyObjectKey
uidOption<ItemUid>
amountOption<u32>
{"req":36,"type":"take","key":9007199254740993,"uid":null}

attack

Approach and strike (then auto-attack) an entity or an object.

fieldtype
targetTargetRef
{"req":37,"type":"attack","target":{"kind":"entity","id":42}}

cast

Approach into range and cast.

fieldtype
spellSpellId
targetTargetRef
{"req":38,"type":"cast","spell":"fireball","target":{"kind":"entity","id":42}}

guard

{"req":39,"type":"guard"}

potion

{"req":40,"type":"potion"}

hold

Stop auto-attacking until the next order.

{"req":41,"type":"hold"}

open

Walk up to a closed door or gate and open it.

fieldtype
keyObjectKey
{"req":42,"type":"open","key":4398046511700}

plant

Walk up to an obstacle and plant a powder keg by it (needs charges).

fieldtype
keyObjectKey
{"req":43,"type":"plant","key":4398046511700}

ping

fieldtype
client_msu64
{"req":44,"type":"ping","client_ms":1234567}

talk

Talk to a townsperson: from afar the character walks up first. The dialogue arrives as GameEvent::Dialogue.

fieldtype
npcEntityId
{"req":45,"type":"talk","npc":5764607523034243073}

choose

Answer a dialogue with one of its options (Choice::key).

fieldtype
npcEntityId
optionString
{"req":46,"type":"choose","npc":5764607523034243073,"option":"accept"}

skip_errand

Skip the current errand, or all of them.

fieldtype
allbool
{"req":47,"type":"skip_errand","all":false}

server_info

What the server is (protocol, sign-in methods, creation limits); works before signing in.

{"req":48,"type":"server_info"}

register

A new account; key is an alpha key (each opens one account).

fieldtype
usernameString
passwordString
keyString
{"req":49,"type":"register","username":"ann","password":"correct horse","key":"FEL-K7QM-3XWD-9PRA"}

sign_in

fieldtype
usernameString
passwordString
{"req":50,"type":"sign_in","username":"ann","password":"correct horse"}

sign_in_token

Sign in with an API token (scripts, bots: #3) or the session of an earlier AccountInfo.

fieldtype
tokenString
{"req":51,"type":"sign_in_token","token":"uo_3f9a1c2e_…"}

account

The signed-in account and its characters.

{"req":52,"type":"account"}

create_character

A new character within the ruleset's creation limits; it lands in Aquais. Answered with Account.

fieldtype
nameString
lookLook
stru16
dexu16
intu16
skillsVec<(Skill, SkillValue)>Up to three starting skills (tenths) summing to the ruleset's total.
{"req":53,"type":"create_character","name":"Ann Lee","look":{"gender":"female","skin":"dark","hair":"long","hair_color":3,"beard":false},"str":30,"dex":40,"int":10,"skills":[["archery",500],["anatomy",300],["healing",200]]}

play_character

Enter the world as one of the account's characters (answered with Welcome, like Login).

fieldtype
nameString
{"req":54,"type":"play_character","name":"Ann Lee"}

delete_character

fieldtype
nameString
{"req":55,"type":"delete_character","name":"Ann Lee"}

create_api_token

A token for scripts and bots to sign in as this account.

fieldtype
labelString
{"req":56,"type":"create_api_token","label":"my bot"}

revoke_api_token

fieldtype
idString
{"req":57,"type":"revoke_api_token","id":"3f9a1c2e"}

gm

A game master's console line (.tele 100 200, .help); refused for players who aren't GMs. Answered with ReplyData::Gm.

fieldtype
lineString
{"req":58,"type":"gm","line":".tele 1024 512"}

craft_with

Craft choosing the material: another ingot for the recipe's iron, another board for its plain boards (uo_proto::craft); for the build system's gear the material sets the tier (#148).

fieldtype
recipe_idRecipeId
timesu32
materialOption<ItemId>
designOption<String>An armour piece's design, one the crafter knows: Head, Body, Feet the key of its D, R or F ability, Hands, Arms, Legs an affix design (uo_proto::builds::craft).
affixOption<String>The second affix an exceptional Hands, Arms or Legs piece gets (any of its slot's pool but the design's own).
{"req":59,"type":"craft_with","recipe_id":10301,"times":2,"material":772}

repair

Mend a worn item at the station of the trade that makes it, with one unit of its material.

fieldtype
uidItemUid
{"req":60,"type":"repair","uid":21}

wear

Wear this item (Equip takes any of a kind).

fieldtype
uidItemUid
{"req":61,"type":"wear","uid":21}

set_skill_lock

Set a skill's gain arrow: up, down (gives points to others at the cap) or locked.

fieldtype
skillSkill
lockLock
{"req":62,"type":"set_skill_lock","skill":"fishing","lock":"down"}

set_stat_lock

fieldtype
statStat
lockLock
{"req":63,"type":"set_stat_lock","stat":"int","lock":"locked"}

commission

At a town's exchange: commission design design of a plot you hold (uo_world::plots::designs); a building permit goes into the backpack.

fieldtype
townTownId
plotPlotId
designu32
{"req":64,"type":"commission","town":17,"plot":0,"design":2}

break_ground

On the plot: open the construction site with a permit from the backpack.

fieldtype
uidItemUid
{"req":65,"type":"break_ground","uid":12}

deliver

Hand materials to a construction site (a house key) within reach; no item: everything carried that the site still needs.

fieldtype
keyObjectKey
itemOption<ItemId>
amountu320: as much as the site needs.
{"req":66,"type":"deliver","key":462210957312,"item":null,"amount":0}

lock_house

Lock or unlock a house's front door (friends and up open it).

fieldtype
keyObjectKey
lockedbool
{"req":67,"type":"lock_house","key":462210957312,"locked":true}

house_access

Put a character (by name, in sight) on an access list, or take them off.

fieldtype
keyObjectKey
listAccessList
nameString
addbool
{"req":68,"type":"house_access","key":462210957312,"list":"friends","name":"Rowan","add":true}

stash

Put an item from the backpack into the house's secure chest (Loot / Take on the chest look and take).

fieldtype
keyObjectKey
uidItemUid
{"req":69,"type":"stash","key":462210960323,"uid":7}

place_furniture

Place furniture from the backpack on a ground-floor tile of the house.

fieldtype
keyObjectKey
uidItemUid
xi32
yi32
facingFacing
{"req":70,"type":"place_furniture","key":462210957312,"uid":9,"x":11512,"y":6855,"facing":"south"}

pick_up_furniture

Take placed furniture back into the backpack.

fieldtype
keyObjectKey
slotu16
{"req":71,"type":"pick_up_furniture","key":462210957312,"slot":0}

repair_house

Mend every damaged or broken piece, paying its materials.

fieldtype
keyObjectKey
{"req":72,"type":"repair_house","key":462210957312}

demolish

Tear the house (or the site) down; the permit comes back.

fieldtype
keyObjectKey
{"req":73,"type":"demolish","key":462210957312}

tell

A private message to a character by name, wherever they are.

fieldtype
toString
textString
{"req":74,"type":"tell","to":"Bram","text":"Meet me at the bridge."}

chat

A line on a channel: party, guild, alliance, region, trade.

fieldtype
channelChannel
textString
{"req":75,"type":"chat","channel":"party","text":"Archers first."}

party_invite

Ask a character to join our party (we lead it, or found it).

fieldtype
nameString
{"req":76,"type":"party_invite","name":"Bram"}

party_answer

Join the party of whoever invited us (yes: false declines).

fieldtype
yesbool
{"req":77,"type":"party_answer","yes":true}

party_leave

{"req":78,"type":"party_leave"}

party_kick

The leader removes a member.

fieldtype
nameString
{"req":79,"type":"party_kick","name":"Bram"}

guild_found

Found a guild (burns social::GUILD_FOUND_COST coins).

fieldtype
nameString
tagString
{"req":80,"type":"guild_found","name":"Iron Wardens","tag":"IW"}

guild_invite

Officers and the leader invite a character.

fieldtype
nameString
{"req":81,"type":"guild_invite","name":"Bram"}

guild_answer

Answer a guild's invitation.

fieldtype
guildGuildId
yesbool
{"req":82,"type":"guild_answer","guild":7002195088111616,"yes":true}

guild_leave

Leave the guild (the last member's leaving disbands it).

{"req":83,"type":"guild_leave"}

guild_kick

fieldtype
nameString
{"req":84,"type":"guild_kick","name":"Bram"}

guild_rank

fieldtype
nameString
rankRank
{"req":85,"type":"guild_rank","name":"Bram","rank":"officer"}

guild_stance

Set our stance towards another guild (by name or tag): war at once, an alliance once both propose it, neutral ends either.

fieldtype
guildString
stanceStance
{"req":86,"type":"guild_stance","guild":"RV","stance":"war"}

social

Our party and guild now (they are also pushed on change).

{"req":87,"type":"social"}

renounce_young

Give up the young colonist's protection early.

{"req":88,"type":"renounce_young"}

report

Report a character to the game masters.

fieldtype
nameString
reasonString
{"req":89,"type":"report","name":"Spammer","reason":"trade channel spam"}

drop

Put an item (with what it holds) on the ground: a pile anyone may loot like a corpse (Loot, Take; no crime), gone after a while. Worn items come off with it; stolen goods can't be dropped. at: a free tile within DROP_RANGE (#134; else, or none, at your feet); a pile already lying there takes it in. amount: only that many of a stack.

fieldtype
uidItemUid
atOption<(i32, i32)>
amountOption<u32>
{"req":90,"type":"drop","uid":7,"at":[818,451]}

close

Walk up to an open door or gate and close it (Open opens one; an open door also swings shut by itself after a few seconds).

fieldtype
keyObjectKey
{"req":91,"type":"close","key":4398046511700}

raise_guard

Guard up (up: true, the key pressed) or down (released), at once, even while recovering. A press shortly before a blow lands turns it aside (a perfect guard); a held guard blocks part of every blow from the front. at: when the key was pressed, in server game ms (the clock the pongs carry), so lag doesn't eat the window; believed at most 150 ms back. (Guard is a short tap of the same.)

fieldtype
upbool
atOption<u64>
{"req":92,"type":"raise_guard","up":true,"at":1761400000250}

dodge

Dodge a tile that way at once: a moment of invulnerability for some stamina, even while recovering.

fieldtype
dirDirection
{"req":93,"type":"dodge","dir":"south_east"}

ability

Use the ability on a key: the weapon's Q, W, E, the chest's R, the helmet's D, the boots' F (uo_proto::builds). Approaches until in reach when it needs a target; target none: yourself or where you stand (self abilities, escapes). Replaces #145's techniques: Cleave, Lunge, Puncture… are the families' Q and W.

fieldtype
slotSlot
targetOption<TargetRef>
{"req":94,"type":"ability","slot":"q","target":{"kind":"entity","id":77000001}}

set_loadout

Set the loadout (Q and W per weapon family; R, D, F for the chest, helmet and boots, any class, from their whole pools; passives), out of a fight only.

fieldtype
loadoutLoadout
{"req":95,"type":"set_loadout","loadout":{"picks":[{"family":"sword","q":"riposte","w":"parry"}],"d":"blind","passives":["duelist"]}}

socket

Socket a rune from the pack into the next free socket of the weapon in hand (1 socket at T1–T2, 2 at T3–T4, 3 at T5, one more when exceptional; socket 1 changes Q, 2 W, 3 E), out of a fight only.

fieldtype
runeItemId
{"req":96,"type":"socket","rune":1172}

unsocket

Take the rune out of a socket (0 = the first) of the weapon in hand, out of a fight only: the rune is destroyed.

fieldtype
socketu8
{"req":97,"type":"unsocket","socket":0}

Replies

{"type":"reply","req":N,"ok":true,"data":{"kind":…}} — data is one of these (many commands answer ok with no data):

welcome

Carries a Welcome (its fields sit beside kind).

{"type":"reply","req":1,"ok":true,"data":{"kind":"welcome","protocol":3,"entity_id":1001,"wallet":"dev:Ann","map_seed":1,"map_width":16384,"map_height":16384,"tick_hz":20,"ledger":"off","token":"2f6c…","server_ms":72000000,"region_size":64,"aoi_radius":18,"x":812,"y":455,"spells":["magic_arrow","heal"],"world":"felucca","world_hash":"9b1e…","day_ms":6900000,"time_scale":1}}

look

fieldtype
meEntityState
entitiesVec<EntityState>
{"type":"reply","req":8,"ok":true,"data":{"kind":"look","me":{"id":1001,"x":812,"y":455,"facing":"south","kind":"player","name":"Ann","moving":false,"equipment":[["main_hand",300]],"look":{"gender":"female","skin":"dark","hair":"long","hair_color":3,"beard":false},"guild":"IW","young":true,"tool":100,"materials":[["main_hand",851]],"keys":[["q","puncture"],["f","dash"]],"runes":[["main_hand",["rune_swift"]]],"exceptional":["main_hand"],"hits":50,"max_hits":50,"mana":20,"max_mana":20,"dead":false,"step_ms":250},"entities":[{"id":77000001,"x":818,"y":450,"facing":"west","kind":"creature","species":"wolf","hits":18,"max_hits":30,"mana":0,"max_mana":0,"dead":false}]}}

inventory

fieldtype
walletString
itemsVec<ItemStack>
{"type":"reply","req":9,"ok":true,"data":{"kind":"inventory","wallet":"dev:Ann","items":[{"item_id":1,"qty":6}]}}

tx

Result of an on-chain action.

fieldtype
signatureString
itemsVec<ItemStack>
{"type":"reply","req":12,"ok":true,"data":{"kind":"tx","signature":"","items":[]}}

pong

fieldtype
client_msu64
server_msu64
{"type":"reply","req":44,"ok":true,"data":{"kind":"pong","client_ms":1234567,"server_ms":72000050}}

market

Carries a Box<MarketView> (its fields sit beside kind).

{"type":"reply","req":18,"ok":true,"data":{"kind":"market","town":0,"name":"Aquais","free_port":true,"lawless":false,"params":{"fee":1000,"split":{"reserves":6000,"treasury":0,"crown":4000},"plot_price":5000,"window":{"start_hour":19,"hours":2},"return_reward":1000},"treasury":0,"burned":0,"lord":null,"vault":{"hits":450,"max":450,"open_until":0},"raid_window":true,"pools":[{"item":1,"gold":20000,"goods":20000,"shares":20000,"mine":0,"locked":0},{"item":9,"gold":20000,"goods":11111,"shares":14907,"mine":0,"locked":0}],"deposits":[],"stake":0,"total_stake":0,"plots":[],"proposals":[],"log":[],"mint":{"rate":100,"books":{"minted_ingots":0,"coins_minted":0,"exported":0,"burned":0,"mainland_at":0,"mainland_coin":0,"mainland_goods":0},"store":[{"item":14,"price":5},{"item":101,"price":60},{"item":100,"price":50},{"item":102,"price":30},{"item":103,"price":40},{"item":104,"price":40},{"item":791,"price":40},{"item":792,"price":40},{"item":793,"price":30},{"item":794,"price":30},{"item":881,"price":40},{"item":750,"price":120},{"item":751,"price":25},{"item":752,"price":35},{"item":753,"price":60},{"item":754,"price":60},{"item":757,"price":8},{"item":766,"price":3},{"item":705,"price":2},{"item":758,"price":8},{"item":759,"price":8},{"item":760,"price":6},{"item":761,"price":6},{"item":762,"price":8},{"item":763,"price":6},{"item":703,"price":6},{"item":765,"price":6},{"item":901,"price":30},{"item":903,"price":35},{"item":905,"price":55},{"item":906,"price":60},{"item":907,"price":120},{"item":908,"price":90},{"item":909,"price":120},{"item":910,"price":90},{"item":912,"price":40},{"item":913,"price":30},{"item":914,"price":20}]},"server_ms":72000000}}

sheet

Carries a Box<SheetView> (its fields sit beside kind).

{"type":"reply","req":17,"ok":true,"data":{"kind":"sheet","sheet":{"name":"Ann","stats":{"str":{"base":60,"lock":"up"},"dex":{"base":50,"lock":"up"},"int":{"base":40,"lock":"up"}},"skills":{"lumberjacking":{"base":312,"lock":"up"}},"vitals":{"hits":60,"stamina":50,"mana":40},"items":{"7":{"def":200,"amount":1,"place":{"at":"equipped","slot":"backpack"}},"8":{"def":8,"amount":1000,"place":{"at":"in","container":7}},"9":{"def":1,"amount":6,"place":{"at":"in","container":7}}}},"citizen":{"patents":{"lumberjacking":604800000},"satiety":100,"fed_ms":0,"criminal_until":0,"hero_until":0,"ghost":false,"errands":{"step":0,"progress":0,"skipped":false,"skipped_steps":0,"started_ms":0,"finished_ms":0,"hints":0},"murders":0,"murder_decay_ms":0,"played_ms":0,"young":true,"shield_until":0},"notoriety":"innocent","weight":172,"capacity":2150,"task":"Lumberjacking","town":0,"server_ms":72000000}}

container

A corpse's contents.

fieldtype
keyObjectKey
nameString
itemsVec<(ItemUid, Item)>
until_msu64When it rots, server ms.
pileOption<(i32, i32)>A pile of things on the ground (#130): its tile. Something let go into its window is dropped there (Drop { at }).
{"type":"reply","req":35,"ok":true,"data":{"kind":"container","key":9007199254740993,"name":"the corpse of a wolf","items":[[31,{"def":11,"amount":1}],[32,{"def":13,"amount":1}]],"until_ms":72300000}}

server_info

Carries a Box<ServerInfo> (its fields sit beside kind).

{"type":"reply","req":1,"ok":true,"data":{"kind":"server_info","protocol":3,"accounts":true,"dev_login":false,"alpha_keys":true,"world":"felucca","world_hash":"9b1e…","max_characters":5,"creation":{"stat_total":80,"stat_min":10,"stat_max":60,"skill_count":3,"skill_total":1000,"skill_max":500,"name_min":2,"name_max":16},"online":12}}

account

Carries a Box<AccountInfo> (its fields sit beside kind).

{"type":"reply","req":2,"ok":true,"data":{"kind":"account","username":"ann","characters":[{"name":"Ann Lee","look":{"gender":"female","skin":"dark","hair":"long","hair_color":3,"beard":false},"stats":[30,40,10],"skills":[["archery",500],["anatomy",300],["healing",200]],"x":12443,"y":7244,"created_ms":72000000,"worn":[["shirt",{"def":500,"amount":1}]]}],"max_characters":5,"session":"8c1d…"}}

api_token

A new API token: the secret is shown only now.

fieldtype
idString
tokenString
{"type":"reply","req":3,"ok":true,"data":{"kind":"api_token","id":"3f9a1c2e","token":"uo_3f9a1c2e_…"}}

gm

A GM console answer (text, may span lines).

fieldtype
textString
{"type":"reply","req":51,"ok":true,"data":{"kind":"gm","text":"Ann is at 1024,512 (region 136)"}}

SheetView

Your own character, only ever sent to you (sheet reply and event).

fieldtype
sheetCharacter
citizenCitizen
notorietyNotoriety
weightWeightCarried and the most that can be carried, tenths of a stone.
capacityWeight
taskOption<String>What the character is busy with ("Mining", "Cooking"…).
townOption<TownId>The town whose guard zone they stand in.
server_msu64
{
  "sheet": {
    "name": "Ann",
    "stats": {
      "str": {
        "base": 60,
        "lock": "up"
      },
      "dex": {
        "base": 50,
        "lock": "up"
      },
      "int": {
        "base": 40,
        "lock": "up"
      }
    },
    "skills": {
      "lumberjacking": {
        "base": 312,
        "lock": "up"
      }
    },
    "vitals": {
      "hits": 60,
      "stamina": 50,
      "mana": 40
    },
    "items": {
      "7": {
        "def": 200,
        "amount": 1,
        "place": {
          "at": "equipped",
          "slot": "backpack"
        }
      },
      "8": {
        "def": 8,
        "amount": 1000,
        "place": {
          "at": "in",
          "container": 7
        }
      },
      "9": {
        "def": 1,
        "amount": 6,
        "place": {
          "at": "in",
          "container": 7
        }
      }
    }
  },
  "citizen": {
    "patents": {
      "lumberjacking": 604800000
    },
    "satiety": 100,
    "fed_ms": 0,
    "criminal_until": 0,
    "hero_until": 0,
    "ghost": false,
    "errands": {
      "step": 0,
      "progress": 0,
      "skipped": false,
      "skipped_steps": 0,
      "started_ms": 0,
      "finished_ms": 0,
      "hints": 0
    },
    "murders": 0,
    "murder_decay_ms": 0,
    "played_ms": 0,
    "young": true,
    "shield_until": 0
  },
  "notoriety": "innocent",
  "weight": 172,
  "capacity": 2150,
  "task": "Lumberjacking",
  "town": 0,
  "server_ms": 72000000
}

Welcome

fieldtype
protocolu32
entity_idEntityId
walletString
map_seedu64
map_widthu32
map_heightu32
tick_hzu32
ledgerString
tokenStringResume token for Command::Resume.
server_msu64Server clock (ms) when the welcome was sent.
region_sizeu32
aoi_radiusu32
xi32The character's tile.
yi32
spellsVec<SpellId>Spells the character can cast (the spell bar).
worldStringThe baked world the map is read from (assets/world/<name>); empty: the seed's noise map.
world_hashStringIts world.json hash: the client must have the same bake.
day_msu64One world day in game ms (decision #135): the client shows the hour clock::world_hour(server time, day_ms), the same for everyone.
time_scaleu32Game time runs this many times faster than the wall clock (1 in play, more in test runs, --time-scale).

World updates

snapshot

fieldtype
ticku64
entitiesVec<EntityState>
objectsVec<ObjectUpdate>Every changed object in the area (damaged, broken, open, spawned).
groundVec<GroundPatch>Oiled and burning ground in the area (builds, decision #150): what a client joining mid-fight can't learn from Ground events it missed.

delta

fieldtype
ticku64
enterVec<EntityState>
updateVec<EntityState>
leaveVec<EntityId>
objectsVec<ObjectUpdate>

EntityState

Every mobile in your area of interest. kind is flattened in: its tag and fields sit beside id.

fieldtype
idEntityId
xi32
yi32
facingDirection
kindEntityKind
hitsi32
max_hitsi32
manai32
max_manai32
deadbool
step_msu32How long one step takes now, ms (players: a run out of a fight, a walk in one; 0: unknown, take 500). Clients time predicted steps by it.
hiddenboolA game master walking unseen (#128): gateways show it only to the GM itself and to other GMs.
stami32Melee (decision #145): stamina (the melee resource), poise taken in permille of the maximum (full = broken), momentum pips (0..=5) and the stance (guarding, broken, exhausted). Zero for non-fighters.
max_stami32
poiseu16
momentumu8
stanceCombatStance
statesVec<(StateId, u8)>Builds (decisions #147–#150): the states on it with their stacks.
countersCountersIts chance counters (crit, block), visible to everyone (§ 16): percent towards the next one (at 100 it happens).
cooldownsVec<u64>When each ability key (Q W E R D F) is ready again, in server game ms (the clock the pongs carry; 0: ready); empty: every key ready. Absolute, so it changes only when an ability is used.
liveOption<Box<LiveView>>What else of a fighter's build the HUD shows (stream U1 of #150): when its states end, worn triggers' counts, stances, charges, marks, the Tome's spare spell. None when there is nothing.
eliteVec<crate::creatures::EliteMod>An elite creature's modifiers (docs/builds.md § 14, stream E of #150): its name reads "a Hasted Vampiric grey wolf" (creatures::Elite::name). Empty for everyone else.
{"id":1001,"x":812,"y":455,"facing":"south","kind":"player","name":"Ann","moving":false,"equipment":[["main_hand",300]],"look":{"gender":"female","skin":"dark","hair":"long","hair_color":3,"beard":false},"guild":"IW","young":true,"tool":100,"materials":[["main_hand",851]],"keys":[["q","puncture"],["f","dash"]],"runes":[["main_hand",["rune_swift"]]],"exceptional":["main_hand"],"hits":50,"max_hits":50,"mana":20,"max_mana":20,"dead":false,"step_ms":250}

Entity kinds

player

fieldtype
nameString
movingbool
equipmentVec<(EquipSlot, ItemId)>
notorietyNotoriety
ghostboolWalking dead, looking for a healer.
lookOption<Look>The body under the clothes (decision #126); None: by name.
guildStringTheir guild's tag (#131), shown over the name.
youngboolA young colonist (#131): other players can't harm them.
toolOption<ItemId>The tool they are working with (#134: chopping, mining, fishing, crafting): drawn in their hand instead of their weapon while the task lasts.
materialsVec<(EquipSlot, ItemId)>Worn pieces made of a material above tier 1 (decision #148): the slot and the material item (ItemProps::material), so clients tint them as their wearer sees them. Pieces not listed wear their tier 1 look.
keysVec<(crate::builds::Slot, crate::builds::AbilityId)>The abilities on their keys, Q W E R D F (decision #172): the target card reads their build, as the build's code would.
runesVec<(EquipSlot, Vec<String>)>Worn pieces with runes in their sockets (rune item keys, socket order) (#172).
exceptionalVec<EquipSlot>Worn pieces of exceptional quality (#172).

resource_node

fieldtype
node_idu32
item_idItemId

mob

A server-played mobile (camp bandits).

fieldtype
nameString
archetypeStringuo_combat::Archetype, snake_case.
equipmentVec<(EquipSlot, ItemId)>

creature

An animal (placeholder art: a capsule).

fieldtype
speciesString

npc

A townsperson (crate::npc): drawn as a human of its role, can't be attacked; click to talk.

fieldtype
nameString
roleNpcRole
equipmentVec<(EquipSlot, ItemId)>

ObjectUpdate

A world object whose state differs from the baked world (damaged, broken, open, regrowing (look), or spawned at run time: corpses, carcasses, vaults, Wall of Stone, kegs).

fieldtype
keyObjectKey
hitsu16
brokenbool
openbool
spawnOption<StaticObject>Objects created at run time (Wall of Stone, powder kegs) carry their static; generated ones are known from the seed.
buildingOption<Box<HouseView>>A player house's record (decision #129): its pieces are rebuilt from it (uo_world::plots) and keyed under it.
remainsOption<Box<Remains>>A corpse or carcass (decision #134): whose body it is. Clients draw that body lying dead (a creature's capsules, a dressed human) and open it with Loot; the static's sprite is the fallback art.
lookOption<String>A worked-out resource node coming back (#133): while broken, it is drawn as this sprite instead (a felled tree's sapling, then a young tree); it can't be worked until it stands whole again.
burningboolA wooden object on fire (Wildfire, decision #150): drawn burning until an update says otherwise (ObjectBurning events change it).
{"key":9007199254740993,"hits":1,"broken":false,"open":false,"spawn":{"sprite":"corpse","x":818,"y":450,"z":0.0,"facing":"south"},"remains":{"kind":{"kind":"creature","species":"orc"},"facing":"south"}}

Events

{"type":"event","event":…}

chat

fieldtype
fromString
textString
{"type":"event","event":"chat","from":"Bram","text":"Selling stone in Skartor"}

gathered

fieldtype
entity_idEntityId
item_idItemId
signatureString
{"type":"event","event":"gathered","entity_id":1001,"item_id":1,"signature":""}

crafted

fieldtype
entity_idEntityId
recipe_idRecipeId
signatureString
{"type":"event","event":"crafted","entity_id":1001,"recipe_id":1,"signature":""}

system

fieldtype
textString
{"type":"event","event":"system","text":"You are starving: eat something."}

sheet

The owner's sheet changed (private).

Carries a Box<SheetView> (its fields sit beside event).

(a sheet reply's SheetView, as an event: {"type":"event","event":"sheet","sheet":{…},"citizen":{…},…})

worked

A harvest or craft attempt finished (private): what came of it.

fieldtype
textString
item_idOption<ItemId>
amountu32
gainOption<(Skill, SkillValue)>A skill went up to this value.
{"type":"event","event":"worked","text":"You put 2 logs in your pack.","item_id":1,"amount":2,"gain":["lumberjacking",313]}

combat

Something happened in a fight; at_ms is server time.

fieldtype
at_msu64
combatCombatEvent
{"type":"event","event":"combat","at_ms":72000400,"combat":{"kind":"hit","by":77000001,"id":1001,"damage":6,"cause":{"kind":"weapon"}}}

respawned

A dead character stands again (x, y).

fieldtype
idEntityId
xi32
yi32
{"type":"event","event":"respawned","id":1001,"x":810,"y":452}

step_rejected

The character's step or walk was refused: it stands at x, y (clients that predicted their own steps roll back to it).

fieldtype
idEntityId
xi32
yi32
{"type":"event","event":"step_rejected","id":1001,"x":812,"y":455}

dialogue

An NPC speaks to the player (private).

Carries a Box<DialogueView> (its fields sit beside event).

{"type":"event","event":"dialogue","npc":5764607523034243073,"name":"Hester","role":"harbour_master","text":"Welcome ashore, colonist. Run a few errands for me and I'll see you're paid in kind.","options":[{"key":"accept","label":"Yes, give me work"},{"key":"skip_all","label":"I know the colony: no errands"},{"key":"bye","label":"Goodbye"}]}

hint

Something worth knowing, shown as a toast and in the journal (private): a first-time hint (errands::Hint::key) or an errand done (errand).

fieldtype
keyString
titleString
textString
{"type":"event","event":"hint","key":"errand","title":"Errand done: The exchange","text":"You receive 2 bread. Next: Chop 5 logs from trees outside the walls."}

skill_gained

A skill rose by use (private); lowered: a skill locked down that gave the points.

fieldtype
skillSkill
valueSkillValue
loweredOption<(Skill, SkillValue)>
{"type":"event","event":"skill_gained","skill":"melee","value":412,"lowered":["fishing",299]}

stat_gained

A stat rose by use (private).

fieldtype
statStat
valueu16
loweredOption<(Stat, u16)>
{"type":"event","event":"stat_gained","stat":"str","value":41}

message

A chat line on a channel (local speech stays Chat).

Carries a ChatLine (its fields sit beside event).

{"type":"event","event":"message","channel":"guild","from":"Bram","tag":"IW","text":"Vipers west of the bridge!","at_ms":72000400}

party

Our party changed (None: we are in none).

fieldtype
partyOption<PartyView>
{"type":"event","event":"party","party":{"id":3377699720527873,"leader":1001,"members":[{"char":1001,"name":"Ann"},{"char":1002,"name":"Bram"}]}}

party_status

Where our party's members are and how they fare.

fieldtype
membersVec<MemberStatus>
{"type":"event","event":"party_status","members":[{"char":1002,"x":830,"y":440,"hits":41,"max_hits":60,"mana":12,"max_mana":30,"dead":false}]}

guild

Our guild changed (None: we are in none).

fieldtype
guildOption<Box<GuildView>>

({"type":"event","event":"guild","guild":{"id":…,"name":"Iron Wardens","tag":"IW","members":[…],"allies":[…],"enemies":[…],…}}, or "guild":null)

party_invited

Someone asks us into their party (PartyAnswer).

fieldtype
fromString
{"type":"event","event":"party_invited","from":"Bram"}

guild_invited

A guild asks us to join (GuildAnswer).

fieldtype
guildGuildId
nameString
tagString
fromString
{"type":"event","event":"guild_invited","guild":7002195088111616,"name":"Iron Wardens","tag":"IW","from":"Bram"}

law

The law speaks (#131): a crime, a murder count, youth's end, a town refusing a murderer. reason is a short key for scripts.

fieldtype
reasonString
textString
{"type":"event","event":"law","reason":"criminal","text":"You attacked Bram, an innocent: you are a criminal (grey) for a while."}

Combat events

Inside {"event":"combat","at_ms":…,"combat":{"kind":…}}. Fighters are entity ids, obstacles object keys, tiles [x, y]; ms is how long the action takes.

engaged

fieldtype
idEntityId
{"kind":"engaged","id":1001}

disengaged

fieldtype
idEntityId
{"kind":"disengaged","id":1001}

moved

fieldtype
idEntityId
from(i32, i32)
to(i32, i32)
msu32
{"kind":"moved","id":77000001,"from":[818,450],"to":[817,451],"ms":500}

swing

fieldtype
idEntityId
targetTargetRef
impact_msu32
msu32
{"kind":"swing","id":1001,"target":{"kind":"entity","id":77000001},"impact_ms":300,"ms":1000}

shot

fieldtype
idEntityId
targetTargetRef
stopStopRef
spellOption<SpellId>
flight_msu32
msu32
{"kind":"shot","id":1001,"target":{"kind":"entity","id":77000001},"stop":{"kind":"clear"},"spell":null,"flight_ms":240,"ms":2000}

hit

flags: what made the hit what it was (uo_combat::melee::hit bits: 1 counter, 2 rear, 4 crit, 8 weakness, 16 resisted, 32 blocked, 64 empowered, 128 execute, 256 technique, 512 broken, 1024 knocked into something, 2048 bleeding).

fieldtype
byOption<EntityId>
idEntityId
damagei32
causeCauseRef
flagsu16
{"kind":"hit","by":1001,"id":77000001,"damage":9,"cause":{"kind":"spell","spell":"magic_arrow"}}

missed

fieldtype
byEntityId
idEntityId
{"kind":"missed","by":1001,"id":77000001}

parried

fieldtype
byEntityId
idEntityId
{"kind":"parried","by":1001,"id":77000001}

whiffed

fieldtype
idEntityId
{"kind":"whiffed","id":1001}

object_hit

A blow on an object; also every stroke of an axe or pickaxe on a tree, rock or vein (#133, damage 0 when it doesn't crack further): clients shake and flash it.

fieldtype
byOption<EntityId>
keyObjectKey
damageu16
leftu16
from(i32, i32)
{"kind":"object_hit","by":1001,"key":4398046511700,"damage":1,"left":4,"from":[812,455]}

object_broken

fieldtype
keyObjectKey
{"kind":"object_broken","key":4398046511700}

object_spawned

fieldtype
keyObjectKey
byEntityId
{"kind":"object_spawned","key":4398046511701,"by":1001}

detonated

fieldtype
keyObjectKey
at(i32, i32)
{"kind":"detonated","key":4398046511701,"at":[813,455]}

door_opened

fieldtype
keyObjectKey
byEntityId
{"kind":"door_opened","key":4398046511700,"by":1001}

object_expired

fieldtype
keyObjectKey
{"kind":"object_expired","key":4398046511701}

cast_started

fieldtype
idEntityId
spellSpellId
targetTargetRef
msu32
{"kind":"cast_started","id":1001,"spell":"fireball","target":{"kind":"entity","id":77000001},"ms":1500}

fizzled

fieldtype
idEntityId
spellSpellId
{"kind":"fizzled","id":1001,"spell":"fireball"}

spell_struck

fieldtype
idEntityId
spellSpellId
targetTargetRef
stopStopRef
at(i32, i32)
{"kind":"spell_struck","id":1001,"spell":"fireball","target":{"kind":"entity","id":77000001},"stop":{"kind":"clear"},"at":[818,450]}

healed

fieldtype
byEntityId
idEntityId
amounti32
{"kind":"healed","by":1001,"id":1001,"amount":12}

guarding

fieldtype
idEntityId
msu32
{"kind":"guarding","id":1001,"ms":3000}

drank

fieldtype
idEntityId
amounti32
msu32
{"kind":"drank","id":1001,"amount":20,"ms":500}

died

fieldtype
idEntityId
{"kind":"died","id":77000001}

order_failed

fieldtype
idEntityId
reasonString
{"kind":"order_failed","id":1001,"reason":"no line of fire"}

door_closed

A door or gate closed: by by, or by itself (decision #136).

fieldtype
keyObjectKey
byOption<EntityId>
{"kind":"door_closed","key":4398046511700,"by":null}

ability_used

An ability starts (decisions #145, #150; generalises #145's telegraph): the tiles it will strike and when it lands as everyone sees it (impact_ms from now; a feint really lands earlier), ms the whole action. Clients paint the tiles.

fieldtype
idEntityId
abilityAbilityId
slotSlot
targetTargetRef
tilesVec<(i32, i32)>
impact_msu32
msu32
empoweredbool
{"kind":"ability_used","id":77000001,"ability":"cleave","slot":"q","target":{"kind":"entity","id":1001},"tiles":[[818,449],[817,449],[819,449]],"impact_ms":750,"ms":2250}

perfect_guard

id turned by's blow aside with a guard pressed in time.

fieldtype
byEntityId
idEntityId
{"kind":"perfect_guard","by":77000001,"id":1001}

evaded

by's blow found id mid-dodge.

fieldtype
byEntityId
idEntityId
{"kind":"evaded","by":77000001,"id":1001}

dodged

fieldtype
idEntityId
from(i32, i32)
to(i32, i32)
{"kind":"dodged","id":1001,"from":[818,449],"to":[819,449]}

guard_lowered

The guard went down: released, or broken by running out of stamina.

fieldtype
idEntityId
brokenbool
{"kind":"guard_lowered","id":1001,"broken":true}

broken

Poise broken: staggered ms, open to an Execute.

fieldtype
idEntityId
msu32
{"kind":"broken","id":77000001,"ms":2500}

executed

fieldtype
byEntityId
idEntityId
{"kind":"executed","by":1001,"id":77000001}

knocked_back

Pushed or pulled to to (to == from: stopped, by the object against if any).

fieldtype
idEntityId
from(i32, i32)
to(i32, i32)
againstOption<ObjectKey>
{"kind":"knocked_back","id":77000001,"from":[818,450],"to":[818,450],"against":4398046511700}

interrupted

A wind-up or cast was broken off.

fieldtype
idEntityId
{"kind":"interrupted","id":77000001}

state_applied

A state landed on id (stacks now, for ms).

fieldtype
idEntityId
stateStateId
stacksu8
msu32
byOption<EntityId>
{"kind":"state_applied","id":77000001,"state":"bleeding","stacks":1,"ms":3000,"by":1001}

state_ended

A state ran out or was cleansed.

fieldtype
idEntityId
stateStateId
{"kind":"state_ended","id":77000001,"state":"bleeding"}

reaction

A reaction fired on id (Electrocute, Freeze, Shatter…).

fieldtype
idEntityId
reactionReactionId
byOption<EntityId>
{"kind":"reaction","id":77000001,"reaction":"electrocute","by":1001}

triggered

A clothing piece, jewel, rune or keystone of id fired (its key).

fieldtype
idEntityId
triggerString
targetOption<EntityId>
{"kind":"triggered","id":1001,"trigger":"storm_ring","target":77000001}

escaped

An escape took id from from to to (the same tile for one that doesn't move: evasion, breaking control).

fieldtype
idEntityId
abilityAbilityId
from(i32, i32)
to(i32, i32)
{"kind":"escaped","id":1001,"ability":"dash","from":[818,449],"to":[821,449]}

formation_on

A formation (a surcoat's drill) formed or broke around id.

fieldtype
idEntityId
formationString
{"kind":"formation_on","id":1001,"formation":"shield_wall"}

formation_off

fieldtype
idEntityId
formationString
{"kind":"formation_off","id":1001,"formation":"shield_wall"}

ground

Tiles turned Oiled or into burning ground (state oiled or burning) for ms; ms 0: back to plain ground (stream S).

fieldtype
tilesVec<(i32, i32)>
stateStateId
msu32
byOption<EntityId>
{"kind":"ground","tiles":[[818,450],[819,450]],"state":"oiled","ms":10000,"by":1001}

object_burning

A wooden object caught fire (on) or went out (Wildfire).

fieldtype
keyObjectKey
onbool
byOption<EntityId>
{"kind":"object_burning","key":4398046511700,"on":true,"by":1001}

Shared shapes

TargetRef

entity

fieldtype
idEntityId
{"kind":"entity","id":42}

object

fieldtype
keyObjectKey
{"kind":"object","key":4398046511617}

tile

fieldtype
xi32
yi32
{"kind":"tile","x":812,"y":455}

Directions

north, north_east, east, south_east, south, south_west, west, north_west

Spells

magic_arrow, heal, fireball, wall_of_stone, lightning, explosion, mega_explosion

Items

Ids are permanent (append-only). Weight in tenths of a stone per per units.

idkeynameweightper
1logLog201
2boardBoard101
3iron_oreIron Ore1201
4iron_ingotIron Ingot11
5stoneStone1001
6gold_oreGold Ore1201
7gold_ingotGold Ingot21
8gold_coinGold Coin125
9raw_fishRaw Fish101
10cooked_fishCooked Fish101
11raw_meatRaw Meat101
12cooked_meatCooked Meat101
13hideHide101
14breadBread101
100hatchetHatchet401
101pickaxePickaxe1101
102fishing_poleFishing Pole801
103smith_hammerSmith's Hammer801
104sawSaw201
200backpackBackpack301
201bagBag201
202pouchPouch101
300daggerDagger101
301longswordLongsword701
302maceMace1401
303quarterstaffQuarterstaff401
304bowBow601
305halberdHalberd1601
350bucklerBuckler501
351heater_shieldHeater Shield801
500shirtShirt101
501long_pantsLong Pants201
502shoesShoes201
503bootsBoots301
504tunicTunic501
505robeRobe301
506skirtSkirt401
507cloakCloak501
508half_apronHalf Apron101
509wizards_hatWizard's Hat101
550gold_ringGold Ring11
551gold_braceletGold Bracelet11
552gold_necklaceGold Necklace11
553gold_earringsGold Earrings11
700bonesBones101
701furFur101
702boar_tuskBoar Tusk21
703spider_silkSpider's Silk110
704bat_wingBat Wing110
705featherFeather110
706grave_dustGrave Dust110
707troll_fatTroll Fat101
708lizard_scalesLizard Scales15
709drake_scaleDrake Scale21
710dragon_scaleDragon Scale31
711dragons_bloodDragon's Blood110
712wisp_essenceWisp Essence110
713treant_barkTreant Bark201
714fire_essenceFire Essence110
715ectoplasmEctoplasm110
716amberAmber11
717sapphireSapphire11
718rubyRuby11
719diamondDiamond11
720orcish_idolOrcish Idol301
721giant_toothFrost Giant's Tooth101
750spellbookSpellbook301
751scroll_magic_arrowMagic Arrow Scroll11
752scroll_healHeal Scroll11
753scroll_fireballFireball Scroll11
754scroll_wall_of_stoneWall of Stone Scroll11
755scroll_lightningLightning Scroll11
756scroll_explosionExplosion Scroll11
757blank_scrollBlank Scroll11
758black_pearlBlack Pearl11
759blood_mossBlood Moss11
760garlicGarlic11
761ginsengGinseng11
762mandrake_rootMandrake Root11
763nightshadeNightshade11
765sulfurous_ashSulfurous Ash11
766empty_bottleEmpty Bottle51
767heal_potionHeal Potion51
768refresh_potionRefresh Potion51
769strength_potionStrength Potion51
770agility_potionAgility Potion51
771copper_oreCopper Ore1201
772copper_ingotCopper Ingot11
773verite_oreVerite Ore1201
774verite_ingotVerite Ingot11
775oak_logOak Log201
776oak_boardOak Board101
777yew_logYew Log201
778yew_boardYew Board101
779flaxFlax51
780clothCloth11
781leatherLeather11
782wheatWheat51
783flourFlour51
785shaftShaft110
786arrowArrow110
787beamBeam501
788nailsNails120
789bandageBandage110
790meat_pieMeat Pie101
791sewing_kitSewing Kit201
792fletching_kitFletcher's Tools201
793scribes_penScribe's Pen51
794mortar_pestleMortar and Pestle101
800wooden_chestWooden Chest1501
801wooden_boxWooden Box1001
802stoolStool501
803tableTable2001
810broadswordBroadsword601
811katanaKatana601
812kryssKryss201
813spearSpear701
814war_axeWar Axe801
815war_hammerWar Hammer1001
816clubClub901
820wooden_shieldWooden Shield501
821metal_shieldMetal Shield601
822kite_shieldKite Shield701
850dull_copper_oreDull Copper Ore1201
851dull_copper_ingotDull Copper Ingot11
852shadow_iron_oreShadow Iron Ore1201
853shadow_iron_ingotShadow Iron Ingot11
854bronze_oreBronze Ore1201
855bronze_ingotBronze Ingot11
856agapite_oreAgapite Ore1201
857agapite_ingotAgapite Ingot11
858valorite_oreValorite Ore1201
859valorite_ingotValorite Ingot11
860ash_logAsh Log201
861ash_boardAsh Board101
862frostwood_logFrostwood Log201
863frostwood_boardFrostwood Board101
864heartwood_logHeartwood Log201
865heartwood_boardHeartwood Board101
866bloodwood_logBloodwood Log201
867bloodwood_boardBloodwood Board101
868spined_leatherSpined Leather11
869horned_hideHorned Hide151
870horned_leatherHorned Leather11
871barbed_leatherBarbed Leather11
872dragonscaleDragonscale Leather11
873dyed_linenDyed Linen11
874silk_clothSpider Silk Cloth11
875ghostweaveGhostweave11
876starweaveStarweave11
877quartzQuartz11
878star_sapphireStar Sapphire11
879tanning_oilTanning Oil51
880design_scrollDesign Scroll11
881tinker_toolsTinker's Tools201
900building_permitBuilding Permit11
901chairChair501
903benchBench601
905round_tableRound Table1001
906writing_tableWriting Table901
907bedBed2001
908bookcaseBookcase1501
909armoireArmoire2001
910dresserDresser1501
912candelabraCandelabra401
913rugRug301
914barrelBarrel601

Recipes

idkeyinputsoutputskill (min)
1boards1 log2 boardcarpentry (0)
2iron_ingot2 iron_ore1 iron_ingotmining (0)
3hatchet1 board + 2 iron_ingot1 hatchetblacksmithy (0)
4pickaxe1 board + 3 iron_ingot1 pickaxeblacksmithy (0)
5gold_ingot2 gold_ore1 gold_ingotmining (400)
6fishing_pole2 board1 fishing_polecarpentry (0)
7smith_hammer1 board + 2 iron_ingot1 smith_hammerblacksmithy (0)
8saw1 board + 2 iron_ingot1 sawblacksmithy (0)
9cooked_fish1 raw_fish1 cooked_fishcooking (0)
10cooked_meat1 raw_meat1 cooked_meatcooking (0)
11copper_ingot2 copper_ore1 copper_ingotmining (400)
12verite_ingot2 verite_ore1 verite_ingotmining (600)
13oak_boards1 oak_log2 oak_boardcarpentry (200)
14yew_boards1 yew_log2 yew_boardcarpentry (600)
26metal_shield14 iron_ingot1 metal_shieldblacksmithy (200)
42nails1 iron_ingot20 nailsblacksmithy (0)
43sewing_kit2 iron_ingot1 sewing_kitblacksmithy (0)
44scribes_pen1 board + 1 feather1 scribes_pencarpentry (0)
45fletching_kit2 board + 1 iron_ingot1 fletching_kitcarpentry (0)
46mortar_pestle1 board + 1 stone1 mortar_pestlecarpentry (0)
47beam4 board1 beamcarpentry (100)
50wooden_shield9 board1 wooden_shieldcarpentry (100)
51wooden_box10 board + 5 nails1 wooden_boxcarpentry (200)
52wooden_chest15 board + 10 nails1 wooden_chestcarpentry (400)
53stool9 board1 stoolcarpentry (100)
54table17 board + 10 nails1 tablecarpentry (450)
55shafts1 board8 shaftfletching (0)
56arrows1 shaft + 1 feather1 arrowfletching (0)
58leather1 hide1 leathertailoring (0)
59cloth2 flax1 clothtailoring (0)
60bandages1 cloth2 bandagetailoring (0)
61shirt8 cloth1 shirttailoring (0)
62long_pants8 cloth1 long_pantstailoring (50)
63tunic8 cloth1 tunictailoring (100)
64skirt10 cloth1 skirttailoring (100)
65robe16 cloth1 robetailoring (200)
66cloak14 cloth1 cloaktailoring (250)
67half_apron6 cloth1 half_aprontailoring (50)
68wizards_hat15 cloth1 wizards_hattailoring (300)
69bag2 leather1 bagtailoring (0)
70pouch1 leather1 pouchtailoring (0)
71backpack4 leather1 backpacktailoring (100)
72shoes5 leather1 shoestailoring (0)
73boots8 leather1 bootstailoring (200)
85heal_potion1 ginseng + 1 empty_bottle1 heal_potionalchemy (0)
86refresh_potion1 black_pearl + 1 empty_bottle1 refresh_potionalchemy (0)
87agility_potion1 blood_moss + 1 empty_bottle1 agility_potionalchemy (150)
88strength_potion2 mandrake_root + 1 empty_bottle1 strength_potionalchemy (250)
89blank_scroll1 flax2 blank_scrollinscription (0)
90scroll_magic_arrow1 blank_scroll + 1 sulfurous_ash1 scroll_magic_arrowinscription (0)
91scroll_heal1 blank_scroll + 1 garlic + 1 ginseng + 1 spider_silk1 scroll_healinscription (100)
92scroll_fireball1 blank_scroll + 1 black_pearl1 scroll_fireballinscription (250)
93scroll_wall_of_stone1 blank_scroll + 1 blood_moss + 1 garlic1 scroll_wall_of_stoneinscription (250)
94scroll_lightning1 blank_scroll + 1 mandrake_root + 1 sulfurous_ash1 scroll_lightninginscription (400)
95scroll_explosion1 blank_scroll + 1 blood_moss + 1 mandrake_root1 scroll_explosioninscription (650)
96spellbook10 blank_scroll + 2 leather1 spellbookinscription (200)
97flour2 wheat1 flourcooking (0)
98bread1 flour1 breadcooking (0)
99meat_pie1 flour + 1 raw_meat1 meat_piecooking (200)
130chair6 board1 chaircarpentry (200)
131bench8 board1 benchcarpentry (200)
132round_table14 board1 round_tablecarpentry (400)
133writing_table12 board + 1 iron_ingot1 writing_tablecarpentry (450)
134bed18 board + 4 hide1 bedcarpentry (500)
135bookcase16 board1 bookcasecarpentry (500)
136armoire20 board + 2 iron_ingot1 armoirecarpentry (600)
137dresser14 board + 1 iron_ingot1 dressercarpentry (500)
138barrel10 board + 2 iron_ingot1 barrelcarpentry (300)
139candelabra4 iron_ingot1 candelabrablacksmithy (300)
140rug4 hide1 rugtailoring (200)
141dull_copper_ingot2 dull_copper_ore1 dull_copper_ingotmining (200)
142shadow_iron_ingot2 shadow_iron_ore1 shadow_iron_ingotmining (200)
143bronze_ingot2 bronze_ore1 bronze_ingotmining (400)
144agapite_ingot2 agapite_ore1 agapite_ingotmining (600)
145valorite_ingot2 valorite_ore1 valorite_ingotmining (800)
146ash_boards1 ash_log2 ash_boardcarpentry (400)
147frostwood_boards1 frostwood_log2 frostwood_boardcarpentry (600)
148heartwood_boards1 heartwood_log2 heartwood_boardcarpentry (800)
149bloodwood_boards1 bloodwood_log2 bloodwood_boardcarpentry (800)
150spined_leather1 fur1 spined_leathertailoring (200)
151horned_leather1 horned_hide1 horned_leathertailoring (400)
152barbed_leather2 lizard_scales1 barbed_leathertailoring (600)
153dragonscale1 drake_scale1 dragonscaletailoring (800)
154dragonscale_great1 dragon_scale2 dragonscaletailoring (800)
155dyed_linen1 cloth + 1 nightshade1 dyed_linentailoring (200)
156silk_cloth4 spider_silk1 silk_clothtailoring (400)
157ghostweave1 cloth + 2 ectoplasm1 ghostweavetailoring (600)
158starweave1 cloth + 2 wisp_essence1 starweavetailoring (800)
159tanning_oil2 raw_fish + 1 empty_bottle2 tanning_oilalchemy (0)
160tinker_tools2 iron_ingot1 tinker_toolsblacksmithy (0)
161rune_research10 blank_scroll + 1 sapphire1 design_scrollinscription (400)
162mana_potion1 nightshade + 1 empty_bottle1 mana_potionalchemy (100)
163cure_potion1 garlic + 1 empty_bottle1 cure_potionalchemy (150)
164fire_resist_potion1 sulfurous_ash + 1 blood_moss + 1 empty_bottle1 fire_resist_potionalchemy (300)
165invisibility_potion2 nightshade + 1 bat_wing + 1 empty_bottle1 invisibility_potionalchemy (500)
166haste_potion2 blood_moss + 2 feather + 1 empty_bottle1 haste_potionalchemy (400)
167oil_flask2 raw_fish + 1 empty_bottle1 oil_flaskalchemy (200)
168frost_flask1 black_pearl + 1 nightshade + 1 empty_bottle1 frost_flaskalchemy (300)
169fish_stew2 raw_fish + 1 garlic1 fish_stewcooking (200)
170roast_feast4 raw_meat + 1 bread + 1 garlic1 roast_feastcooking (400)

Skills

Skill keys (the number is UO's skill id):

alchemy 0, anatomy 1, animal_lore 2, item_identification 3, arms_lore 4, parrying 5, begging 6, blacksmithy 7, fletching 8, peacemaking 9, camping 10, carpentry 11, cartography 12, cooking 13, detecting_hidden 14, discordance 15, evaluating_intelligence 16, healing 17, fishing 18, forensic_evaluation 19, herding 20, hiding 21, provocation 22, inscription 23, lockpicking 24, magery 25, resisting_spells 26, snooping 28, musicianship 29, poisoning 30, archery 31, spirit_speak 32, stealing 33, tailoring 34, animal_taming 35, taste_identification 36, tinkering 37, tracking 38, veterinary 39, melee 40, lumberjacking 44, mining 45, meditation 46, stealth 47, remove_trap 48

Equipment slots

main_hand, off_hand, head, body, neck, hands, arms, legs, feet, shirt, pants, tunic, robe, skirt, cloak, waist, ring, bracelet, earrings, backpack

Versions

  • 3 (#121): the economy — harvesting, crafting, eating, markets, plunder, Aquais, corpses; the private sheet.
  • 2 (#87): snapshots and deltas of the area of interest, resume tokens, combat orders and events.
  • 1: the first protocol (login, walk, look, chat, on-chain gather/craft).

Welcome.protocol says which version the server speaks. New fields and message kinds may appear within a version; a field is never removed or changes meaning without a version bump.