ModernUO/scripting-guide/serialization/index.html

731 lines
No EOL
51 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="The Ultima Online Server Emulator for the modern era!">
<meta name="author" content="Kamron Batman">
<link rel="canonical" href="https://modernuo.com/scripting-guide/serialization/">
<link rel="prev" href="../timers/">
<link rel="icon" href="../../branding/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
<title>Serialization - ModernUO</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/stylesheets/extra.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<!-- Determine title -->
<!-- The image needs to have an absolute URL -->
<!-- Open graph meta tags -->
<meta property="og:type" content="website" />
<meta property="og:title" content="ModernUO - Serialization" />
<meta property="og:description" content="The Ultima Online Server Emulator for the modern era!" />
<meta property="og:url" content="https://modernuo.com/scripting-guide/serialization/" />
<meta property="og:image" content="https://modernuo.com//branding/android-chrome-512x512.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="512" />
<meta property="og:image:height" content="512" />
<!-- Twitter meta tags -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@modernuo" />
<meta name="twitter:creator" content="@modernuo" />
<meta name="twitter:title" content="ModernUO - Serialization" />
<meta name="twitter:description" content="The Ultima Online Server Emulator for the modern era!" />
<meta name="twitter:image" content="https://modernuo.com//branding/android-chrome-512x512.png" />
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#serialization-savings" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="ModernUO" class="md-header__button md-logo" aria-label="ModernUO" data-md-component="logo">
<svg height="529.15997" viewBox="0 0 529.15997 529.15997" width="529.15997" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m2512.85 434.602c664.19 226.828 1108.92 846.878 1108.92 1549.778 0 506.38-229.59 976.52-629.89 1289.87l-48.49 37.96v-1419.24c0-285.63-16.44-484.51-48.85-591.12-31.25-102.71-92.53-204.08-182.15-301.28-59.65-64.691-126.61-118.961-199.54-161.781v2695.511l-20.68 6.77c-163.79 53.55-334.64 80.71-507.81 80.71-116.47 0-232.75-12.43-346.2-36.98v323.08c114.09 20.48 230.43 30.86 346.2 30.86 1077.66 0 1954.37-876.72 1954.37-1954.36 0-877.2-584.34-1645.45-1425.88-1881.771z"/></clipPath><linearGradient id="b" gradientTransform="matrix(0 -3981.4 -3981.4 0 2788.45 3927.9)" gradientUnits="userSpaceOnUse" spreadMethod="pad" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#bfbdbb"/><stop offset=".248485" stop-color="#fbfcfc"/><stop offset=".484848" stop-color="#959696"/><stop offset=".70303" stop-color="#f0f0f0"/><stop offset="1" stop-color="#8d8d8d"/></linearGradient><clipPath id="c"><path d="m1984.36 30.0117c-1077.637 0-1954.36 876.7073-1954.36 1954.3683 0 877.19 584.355 1645.42 1425.89 1881.75v-2120.73c0-174.88 16.68-297.63 50.98-375.3 36.14-81.88 96.23-147.98 178.61-196.45 80.54-47.37 177.6-71.39 288.48-71.39 116.83 0 219.8 26.54 306.04 78.89 12.05 7.32 23.7 15.02 34.9 23.06v-449.19c-98.23-27.68-208.6-41.7-328.46-41.7-206.52 0-387.97 45.481-539.3 135.2-150.47 89.179-259.14 201.46-323.02 333.71-65.54 135.72-98.77 374.85-98.77 710.74v1419.24l-48.491-37.96c-400.308-313.35-629.89-783.49-629.89-1289.87 0-902.87 734.531-1637.411 1637.391-1637.411 111.23 0 222.24 11.269 330.54 33.543v-322.4534c-108.89-18.6289-219.96-28.0469-330.54-28.0469z"/></clipPath><linearGradient id="d" gradientTransform="matrix(0 -3981.4 -3981.4 0 1172.45 3927.91)" gradientUnits="userSpaceOnUse" spreadMethod="pad" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#ae9964"/><stop offset=".248485" stop-color="#fbe383"/><stop offset=".484848" stop-color="#8d7036"/><stop offset=".714286" stop-color="#c9b14e"/><stop offset="1" stop-color="#7f6740"/></linearGradient><g transform="matrix(.13333333 0 0 -.13333333 0 529.16)"><path d="m1984.36 3968.74c-128.6 0-254.34-12.45-376.2-35.93v-385.64c120.72 29.1 246.68 44.61 376.2 44.61 173.94 0 341.47-27.89 498.49-79.23v-2724.37c92.71 47.199 177.2 111.371 251.6 192.058 92.7 100.542 156.23 205.822 188.8 312.892 33.27 109.43 50.14 311.26 50.14 599.84v1357.66c376.17-294.47 618.38-752.6 618.38-1266.25 0-712.39-465.88-1317.919-1108.92-1528.189v-392.7613c853.7 221.6793 1485.88 998.8603 1485.88 1920.9503 0 1094.17-890.17 1984.36-1984.37 1984.36" fill="#dfdfdd"/><g clip-path="url(#a)"><path d="m2512.85 434.602c664.19 226.828 1108.92 846.878 1108.92 1549.778 0 506.38-229.59 976.52-629.89 1289.87l-48.49 37.96v-1419.24c0-285.63-16.44-484.51-48.85-591.12-31.25-102.71-92.53-204.08-182.15-301.28-59.65-64.691-126.61-118.961-199.54-161.781v2695.511l-20.68 6.77c-163.79 53.55-334.64 80.71-507.81 80.71-116.47 0-232.75-12.43-346.2-36.98v323.08c114.09 20.48 230.43 30.86 346.2 30.86 1077.66 0 1954.37-876.72 1954.37-1954.36 0-877.2-584.34-1645.45-1425.88-1881.771v331.993" fill="url(#b)"/></g><path d="m1973.96 1132.26c-105.46 0-197.39 22.62-273.26 67.24-76.85 45.22-132.83 106.7-166.38 182.71-32.59 73.78-48.43 192.58-48.43 363.19v1226.51 540.64 392.76c-853.699-221.68-1485.89-998.85-1485.89-1920.93 0-1094.2 890.184-1984.3682812 1984.36-1984.3682812 123.1 0 243.58 11.3476812 360.54 32.9179812v384.8203c-115.94-26.668-236.61-40.781-360.54-40.781-886.32 0-1607.391 721.081-1607.391 1607.411 0 513.65 242.207 971.78 618.383 1266.25v-1357.66c0-340.44 34.228-583.96 101.758-723.78 66.48-137.66 179.09-254.221 334.73-346.471 156.02-92.489 342.61-139.387 554.6-139.387 132.62 0 252.67 16.719 358.46 49.25v535.068c-23.54-22.21-50.33-42.57-80.46-60.85-81.5-49.46-179.23-74.54-290.48-74.54" fill="#e9cf72"/><g clip-path="url(#c)"><path d="m1984.36 30.0117c-1077.637 0-1954.36 876.7073-1954.36 1954.3683 0 877.19 584.355 1645.42 1425.89 1881.75v-2120.73c0-174.88 16.68-297.63 50.98-375.3 36.14-81.88 96.23-147.98 178.61-196.45 80.54-47.37 177.6-71.39 288.48-71.39 116.83 0 219.8 26.54 306.04 78.89 12.05 7.32 23.7 15.02 34.9 23.06v-449.19c-98.23-27.68-208.6-41.7-328.46-41.7-206.52 0-387.97 45.481-539.3 135.2-150.47 89.179-259.14 201.46-323.02 333.71-65.54 135.72-98.77 374.85-98.77 710.74v1419.24l-48.491-37.96c-400.308-313.35-629.89-783.49-629.89-1289.87 0-902.87 734.531-1637.411 1637.391-1637.411 111.23 0 222.24 11.269 330.54 33.543v-322.4534c-108.89-18.6289-219.96-28.0469-330.54-28.0469" fill="url(#d)"/></g></g></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
ModernUO
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Serialization
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/modernuo/modernuo" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
modernuo/modernuo
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../installation/" class="md-tabs__link">
Get Started
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../timers/" class="md-tabs__link">
Scripting guide
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<!--
Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
-->
<!-- Main navigation -->
<nav
class="md-nav md-nav--primary"
aria-label="nav.title"
data-md-level="0"
>
<!-- Site title -->
<label class="md-nav__title" for="__drawer">
<a
href="https://modernuo.com/"
title="ModernUO"
class="md-nav__button md-logo"
aria-label="ModernUO"
>
<svg height="529.15997" viewBox="0 0 529.15997 529.15997" width="529.15997" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m2512.85 434.602c664.19 226.828 1108.92 846.878 1108.92 1549.778 0 506.38-229.59 976.52-629.89 1289.87l-48.49 37.96v-1419.24c0-285.63-16.44-484.51-48.85-591.12-31.25-102.71-92.53-204.08-182.15-301.28-59.65-64.691-126.61-118.961-199.54-161.781v2695.511l-20.68 6.77c-163.79 53.55-334.64 80.71-507.81 80.71-116.47 0-232.75-12.43-346.2-36.98v323.08c114.09 20.48 230.43 30.86 346.2 30.86 1077.66 0 1954.37-876.72 1954.37-1954.36 0-877.2-584.34-1645.45-1425.88-1881.771z"/></clipPath><linearGradient id="b" gradientTransform="matrix(0 -3981.4 -3981.4 0 2788.45 3927.9)" gradientUnits="userSpaceOnUse" spreadMethod="pad" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#bfbdbb"/><stop offset=".248485" stop-color="#fbfcfc"/><stop offset=".484848" stop-color="#959696"/><stop offset=".70303" stop-color="#f0f0f0"/><stop offset="1" stop-color="#8d8d8d"/></linearGradient><clipPath id="c"><path d="m1984.36 30.0117c-1077.637 0-1954.36 876.7073-1954.36 1954.3683 0 877.19 584.355 1645.42 1425.89 1881.75v-2120.73c0-174.88 16.68-297.63 50.98-375.3 36.14-81.88 96.23-147.98 178.61-196.45 80.54-47.37 177.6-71.39 288.48-71.39 116.83 0 219.8 26.54 306.04 78.89 12.05 7.32 23.7 15.02 34.9 23.06v-449.19c-98.23-27.68-208.6-41.7-328.46-41.7-206.52 0-387.97 45.481-539.3 135.2-150.47 89.179-259.14 201.46-323.02 333.71-65.54 135.72-98.77 374.85-98.77 710.74v1419.24l-48.491-37.96c-400.308-313.35-629.89-783.49-629.89-1289.87 0-902.87 734.531-1637.411 1637.391-1637.411 111.23 0 222.24 11.269 330.54 33.543v-322.4534c-108.89-18.6289-219.96-28.0469-330.54-28.0469z"/></clipPath><linearGradient id="d" gradientTransform="matrix(0 -3981.4 -3981.4 0 1172.45 3927.91)" gradientUnits="userSpaceOnUse" spreadMethod="pad" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#ae9964"/><stop offset=".248485" stop-color="#fbe383"/><stop offset=".484848" stop-color="#8d7036"/><stop offset=".714286" stop-color="#c9b14e"/><stop offset="1" stop-color="#7f6740"/></linearGradient><g transform="matrix(.13333333 0 0 -.13333333 0 529.16)"><path d="m1984.36 3968.74c-128.6 0-254.34-12.45-376.2-35.93v-385.64c120.72 29.1 246.68 44.61 376.2 44.61 173.94 0 341.47-27.89 498.49-79.23v-2724.37c92.71 47.199 177.2 111.371 251.6 192.058 92.7 100.542 156.23 205.822 188.8 312.892 33.27 109.43 50.14 311.26 50.14 599.84v1357.66c376.17-294.47 618.38-752.6 618.38-1266.25 0-712.39-465.88-1317.919-1108.92-1528.189v-392.7613c853.7 221.6793 1485.88 998.8603 1485.88 1920.9503 0 1094.17-890.17 1984.36-1984.37 1984.36" fill="#dfdfdd"/><g clip-path="url(#a)"><path d="m2512.85 434.602c664.19 226.828 1108.92 846.878 1108.92 1549.778 0 506.38-229.59 976.52-629.89 1289.87l-48.49 37.96v-1419.24c0-285.63-16.44-484.51-48.85-591.12-31.25-102.71-92.53-204.08-182.15-301.28-59.65-64.691-126.61-118.961-199.54-161.781v2695.511l-20.68 6.77c-163.79 53.55-334.64 80.71-507.81 80.71-116.47 0-232.75-12.43-346.2-36.98v323.08c114.09 20.48 230.43 30.86 346.2 30.86 1077.66 0 1954.37-876.72 1954.37-1954.36 0-877.2-584.34-1645.45-1425.88-1881.771v331.993" fill="url(#b)"/></g><path d="m1973.96 1132.26c-105.46 0-197.39 22.62-273.26 67.24-76.85 45.22-132.83 106.7-166.38 182.71-32.59 73.78-48.43 192.58-48.43 363.19v1226.51 540.64 392.76c-853.699-221.68-1485.89-998.85-1485.89-1920.93 0-1094.2 890.184-1984.3682812 1984.36-1984.3682812 123.1 0 243.58 11.3476812 360.54 32.9179812v384.8203c-115.94-26.668-236.61-40.781-360.54-40.781-886.32 0-1607.391 721.081-1607.391 1607.411 0 513.65 242.207 971.78 618.383 1266.25v-1357.66c0-340.44 34.228-583.96 101.758-723.78 66.48-137.66 179.09-254.221 334.73-346.471 156.02-92.489 342.61-139.387 554.6-139.387 132.62 0 252.67 16.719 358.46 49.25v535.068c-23.54-22.21-50.33-42.57-80.46-60.85-81.5-49.46-179.23-74.54-290.48-74.54" fill="#e9cf72"/><g clip-path="url(#c)"><path d="m1984.36 30.0117c-1077.637 0-1954.36 876.7073-1954.36 1954.3683 0 877.19 584.355 1645.42 1425.89 1881.75v-2120.73c0-174.88 16.68-297.63 50.98-375.3 36.14-81.88 96.23-147.98 178.61-196.45 80.54-47.37 177.6-71.39 288.48-71.39 116.83 0 219.8 26.54 306.04 78.89 12.05 7.32 23.7 15.02 34.9 23.06v-449.19c-98.23-27.68-208.6-41.7-328.46-41.7-206.52 0-387.97 45.481-539.3 135.2-150.47 89.179-259.14 201.46-323.02 333.71-65.54 135.72-98.77 374.85-98.77 710.74v1419.24l-48.491-37.96c-400.308-313.35-629.89-783.49-629.89-1289.87 0-902.87 734.531-1637.411 1637.391-1637.411 111.23 0 222.24 11.269 330.54 33.543v-322.4534c-108.89-18.6289-219.96-28.0469-330.54-28.0469" fill="url(#d)"/></g></g></svg>
</a>
ModernUO
</label>
<!-- Repository containing source -->
<div class="md-nav__source">
<a href="https://github.com/modernuo/modernuo" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
modernuo/modernuo
</div>
</a>
</div>
<!-- Render item list -->
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a class="md-nav__link" href="https://muo.gg/discord" target="_blank">
<img src="https://img.shields.io/discord/751317910504603701?logo=discord&style=social" alt="Discord" />
</a>
<a class="md-nav__link" href="https://www.reddit.com/r/modernuo" target="_blank">
<img src="https://img.shields.io/reddit/subreddit-subscribers/modernuo?style=social&label=/r/modernuo" alt="/r/modernuo" />
</a>
<a class="md-nav__link" href="https://www.twitter.com/modernuo" target="_blank">
<img src="https://img.shields.io/twitter/follow/modernuo?label=@modernuo&style=social" alt="@modernuo" />
</a>
<a class="md-nav__link" href="https://gitter.im/modernuo/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge" target="_blank">
<img src="https://img.shields.io/gitter/room/modernuo/modernuo?logo=gitter&logoColor=46BC99&style=social" alt="Gitter" />
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="serialization-savings">Serialization / Savings<a class="headerlink" href="#serialization-savings" title="Permanent link">&para;</a></h1>
<div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Generic persistence</label><label for="__tabbed_1_2">Codegen</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p><code>Persistence.Serialize</code> and <code>Persistence.Deserialize</code> is replaced with GenericPersistence class</p>
<p>Example of how to persist a custom system.</p>
<div class="highlight"><pre><span></span><code><span class="k">namespace</span><span class="w"> </span><span class="nn">Server.ExampleSystem</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ExampleSerialization</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Configure</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">GenericPersistence</span><span class="p">.</span><span class="n">Register</span><span class="p">(</span><span class="s">&quot;ExampleSystem&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">Serialize</span><span class="p">,</span><span class="w"> </span><span class="n">Deserialize</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Serialize</span><span class="p">(</span><span class="n">IGenericWriter</span><span class="w"> </span><span class="n">writer</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Do serialization here</span>
<span class="w"> </span><span class="n">writer</span><span class="p">.</span><span class="n">WriteEncodedInt</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span><span class="w"> </span><span class="c1">// version</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Deserialize</span><span class="p">(</span><span class="n">IGenericReader</span><span class="w"> </span><span class="n">reader</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Do deserialization here</span>
<span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">ReadEncodedInt</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<h3 id="basic-info">Basic info<a class="headerlink" href="#basic-info" title="Permanent link">&para;</a></h3>
<p>ModernUO can programatically generate migrations. This feature is based on internal C# Source generators <a href="https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/">More info</a></p>
<p>Old way of serializing objects:
<div class="highlight"><pre><span></span><code><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ExampleItem</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Item</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">_exampleText</span><span class="p">;</span>
<span class="w"> </span><span class="na">[CommandProperty(AccessLevel.GameMaster)]</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">ExampleText</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">_exampleText</span><span class="p">;</span>
<span class="w"> </span><span class="k">set</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">value</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">_exampleText</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">_exampleText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">MarkDirty</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="na">[Constructible]</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">ExampleItem</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">text</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Example</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">ExampleItem</span><span class="p">(</span><span class="n">Serial</span><span class="w"> </span><span class="n">serial</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="n">serial</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Serialize</span><span class="p">(</span><span class="n">IGenericWriter</span><span class="w"> </span><span class="n">writer</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">base</span><span class="p">.</span><span class="n">Serialize</span><span class="p">(</span><span class="n">writer</span><span class="p">);</span>
<span class="w"> </span><span class="n">writer</span><span class="p">.</span><span class="n">WriteEncodedInt</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span><span class="w"> </span><span class="c1">//Version</span>
<span class="w"> </span><span class="n">writer</span><span class="p">.</span><span class="n">Write</span><span class="p">(</span><span class="n">_exampleText</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Deserialize</span><span class="p">(</span><span class="n">IGenericReader</span><span class="w"> </span><span class="n">reader</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">base</span><span class="p">.</span><span class="n">Deserialize</span><span class="p">(</span><span class="n">reader</span><span class="p">);</span>
<span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">ReadEncodedInt</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// version 0</span>
<span class="w"> </span><span class="n">_exampleText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">ReadString</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div></p>
<p>Same class serialized with codegen
<div class="highlight"><pre><span></span><code><span class="na">[SerializationGenerator(0)]</span>
<span class="k">public</span><span class="w"> </span><span class="k">partial</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ExampleItem</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Item</span>
<span class="p">{</span>
<span class="w"> </span><span class="na">[SerializableField(0)]</span>
<span class="w"> </span><span class="na">[SerializedCommandProperty(AccessLevel.GameMaster)]</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">_exampleText</span><span class="p">;</span>
<span class="w"> </span><span class="na">[Constructible]</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">ExampleItem</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">text</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">_exampleText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div></p>
<h3 id="step-by-step">Step by step<a class="headerlink" href="#step-by-step" title="Permanent link">&para;</a></h3>
<ol>
<li>Add <code>SerializationGenerator(versionNumber)</code> to your class and make the class <code>partial</code>
<div class="highlight"><pre><span></span><code><span class="na">[SerializationGenerator(0)]</span>
<span class="k">public</span><span class="w"> </span><span class="k">partial</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ExampleItem</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Item</span>
</code></pre></div></li>
<li>Delete the constructor with <code>Serial serial</code></li>
<li>Delete the <code>Serialize</code> and <code>Deserialize</code> methods.</li>
<li>Add <code>SerializableField(fieldOrder)</code> attribute to all field you want to serialize.
<div class="highlight"><pre><span></span><code><span class="na">[SerializableField(0)]</span>
<span class="k">private</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">_exampleText</span><span class="p">;</span>
</code></pre></div></li>
<li>Run <code>publish.cmd</code>.</li>
</ol>
<p>ModernUO will create migration files for you. In this case "Server.Items.ExampleItem.v0.json" and "Server.Items.ExampleItem.Serialization.cs".
These files contains all information and classes needed for ModernUO to serialize/deserialize your objects.</p>
<h3 id="migrations">Migrations<a class="headerlink" href="#migrations" title="Permanent link">&para;</a></h3>
<p>When new field is added to the serialization, you need to increment <code>versionNumber</code> and run <code>publish.cmd</code> again to generate a migration file for the new version.
Here is little example.</p>
<p>New class code will look like this:
<div class="highlight"><pre><span></span><code><span class="na">[SerializationGenerator(1)]</span>
<span class="k">public</span><span class="w"> </span><span class="k">partial</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ExampleItem</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Item</span>
<span class="p">{</span>
<span class="w"> </span><span class="na">[SerializableField(0)]</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">_exampleText</span><span class="p">;</span>
<span class="w"> </span><span class="na">[SerializableField(1)]</span>
<span class="w"> </span><span class="na">[SerializedCommandProperty(AccessLevel.GameMaster)]</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">_addedExampleTest</span><span class="p">;</span>
<span class="w"> </span><span class="na">[Constructible]</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">ExampleItem</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">text</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">addedText</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">_exampleText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="w"> </span><span class="n">_addedExampleTest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">addedText</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div></p>
<p>Your IDE (Visual Studio, Rider, or VSCode), will show errors and the ModernUO will not compile.
This happens because the code generator builds a migration from V0 to V1 and a new struct <code>V0Content</code> with all of the V0 fields is generated.
ModernUO is expecting the developer to create a migration from the old version to the new.
Now create a <code>MigrateFrom</code> method for each of the older versions, in this case V0, to the new version.</p>
<div class="highlight"><pre><span></span><code><span class="k">private</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">MigrateFrom</span><span class="p">(</span><span class="n">V0Content</span><span class="w"> </span><span class="n">content</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">_exampleText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">content</span><span class="p">.</span><span class="n">ExampleText</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>Since the class is <code>partial</code>, you can create a standalone file for migrations to keep them organized. For example "ExampleItem.Migrations.cs"</p>
</div>
<p>Your migration is now complete.</p>
<h3 id="migrating-from-pre-codegen">Migrating from pre-codegen<a class="headerlink" href="#migrating-from-pre-codegen" title="Permanent link">&para;</a></h3>
<p>To migrate from pre-codegen serialization, change the old Deserialize method to this:
<div class="highlight"><pre><span></span><code><span class="k">private</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Deserialize</span><span class="p">(</span><span class="n">IGenericReader</span><span class="w"> </span><span class="n">reader</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">version</span><span class="p">)</span>
</code></pre></div></p>
<p>This method will be automatically called when the serialization generator doesn't have a migration for for that older version.
In this method you can make old fashioned deserializations that are mostly compatible with RunUO.</p>
<h3 id="after-deserialization">After Deserialization<a class="headerlink" href="#after-deserialization" title="Permanent link">&para;</a></h3>
<p>To execute code after the deserialization, add the <code>AfterDeserialization()</code> attribute to a method.
<div class="highlight"><pre><span></span><code><span class="na">[AfterDeserialization]</span>
<span class="k">private</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">AfterDeserialization</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="c1">// Some code here</span>
<span class="p">}</span>
</code></pre></div></p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>By default, <code>AfterDeserialization</code> is executed synchronously right after the actual deserialization. Passing <code>false</code> to the attribute will make it execute after all deserializations.</p>
</div>
<h3 id="serializing-non-entity-classes">Serializing Non-Entity Classes<a class="headerlink" href="#serializing-non-entity-classes" title="Permanent link">&para;</a></h3>
<p>Sometimes you might need to serialize a nested object that is not an <code>ISerializable</code>. The syntax is largely the same except you must also mark the <em>parent</em> object for dirty tracking by using the <code>DirtyTrackingEntity</code> attribute.
A good example of this is <a href="https://github.com/modernuo/ModernUO/blob/main/Projects/UOContent/Items/Aquarium/AquariumState.cs">"AquariumState"</a>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Non-entity classes cannot be serialized by reference since that would require a reference Serial or ID. This means if the object is a serializable property on multiple objects, it will be serialized
multiple times and will effectively get duplicated on world load. Consider either making it an <code>ISerializable</code> type and building world load/save mechanisms, or do not serialize the nested object directly.
Instead opt for a global lookup, serialize with generic persistence, and then reattach to the objects using the <code>WorldLoad</code> event sink.</p>
</div>
</div>
</div>
</div>
<!-- Content footer -->
<footer class="tx-content__footer md-typeset">
</footer>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="footer.title">
<a href="../timers/" class="md-footer__link md-footer__link--prev" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Timers
</div>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright 2019-2025 ModernUO Development Team
</div>
</div>
<div class="md-social">
<a href="https://muo.gg/github" target="_blank" rel="noopener" title="ModernUO on Github" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://muo.gg/discord" target="_blank" rel="noopener" title="ModernUO on Discord" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M492.5 69.8c-.2-.3-.4-.6-.8-.7-38.1-17.5-78.4-30-119.7-37.1-.4-.1-.8 0-1.1.1s-.6.4-.8.8c-5.5 9.9-10.5 20.2-14.9 30.6-44.6-6.8-89.9-6.8-134.4 0-4.5-10.5-9.5-20.7-15.1-30.6-.2-.3-.5-.6-.8-.8s-.7-.2-1.1-.2C162.5 39 122.2 51.5 84.1 69c-.3.1-.6.4-.8.7C7.1 183.5-13.8 294.6-3.6 404.2c0 .3.1.5.2.8s.3.4.5.6c44.4 32.9 94 58 146.8 74.2.4.1.8.1 1.1 0s.7-.4.9-.7c11.3-15.4 21.4-31.8 30-48.8.1-.2.2-.5.2-.8s0-.5-.1-.8-.2-.5-.4-.6-.4-.3-.7-.4c-15.8-6.1-31.2-13.4-45.9-21.9-.3-.2-.5-.4-.7-.6s-.3-.6-.3-.9 0-.6.2-.9.3-.5.6-.7c3.1-2.3 6.2-4.7 9.1-7.1.3-.2.6-.4.9-.4s.7 0 1 .1c96.2 43.9 200.4 43.9 295.5 0 .3-.1.7-.2 1-.2s.7.2.9.4c2.9 2.4 6 4.9 9.1 7.2.2.2.4.4.6.7s.2.6.2.9-.1.6-.3.9-.4.5-.6.6c-14.7 8.6-30 15.9-45.9 21.8-.2.1-.5.2-.7.4s-.3.4-.4.7-.1.5-.1.8.1.5.2.8c8.8 17 18.8 33.3 30 48.8.2.3.6.6.9.7s.8.1 1.1 0c52.9-16.2 102.6-41.3 147.1-74.2.2-.2.4-.4.5-.6s.2-.5.2-.8c12.3-126.8-20.5-236.9-86.9-334.5zm-302 267.7c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.4 59.2-52.8 59.2m195.4 0c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.2 59.2-52.8 59.2"/></svg>
</a>
<a href="https://muo.gg/patreon" target="_blank" rel="noopener" title="Sponsor ModernUO on Patreon" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M490 153.8c-.1-65.4-51-119-110.7-138.3-74.2-24-172-20.5-242.9 12.9C50.6 68.9 23.6 157.7 22.6 246.2 21.8 319 29 510.6 137.2 512c80.3 1 92.3-102.5 129.5-152.3 26.4-35.5 60.5-45.5 102.4-55.9 72-17.8 121.1-74.7 121-150z"/></svg>
</a>
<a href="https://muo.gg/reddit" target="_blank" rel="noopener" title="/r/modernuo" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M0 256C0 114.6 114.6 0 256 0s256 114.6 256 256-114.6 256-256 256H37.1c-13.7 0-20.5-16.5-10.9-26.2L75 437C28.7 390.7 0 326.7 0 256m349.6-102.4c23.6 0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6 0-37.8 14.6-41.8 34-34.5 3.7-61.4 33-61.4 68.4v.2c-37.5 1.6-71.8 12.3-99 29.1-10.1-7.8-22.8-12.5-36.5-12.5-33 0-59.8 26.8-59.8 59.8 0 24 14.1 44.6 34.4 54.1 2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54 0-33-26.8-59.8-59.8-59.8-13.7 0-26.3 4.6-36.4 12.4-27.4-17-62.1-27.7-100-29.1v-.2c0-25.4 18.9-46.5 43.4-49.9 4.4 18.8 21.3 32.8 41.5 32.8zm-172.5 93.3c16.7 0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6-31.4-8.8-30.4-30.5S160.3 247 177 247zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6 11.8-39.3 28.5-39.3 31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9.8-6.2 3.9-6.5 18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1.3 5.1 3.6 3.9 6.5"/></svg>
</a>
<a href="https://muo.gg/twitter" target="_blank" rel="noopener" title="@modernuo" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M459.4 151.7c.3 4.5.3 9.1.3 13.6 0 138.7-105.6 298.6-298.6 298.6-59.5 0-114.7-17.2-161.1-47.1 8.4 1 16.6 1.3 25.3 1.3 49.1 0 94.2-16.6 130.3-44.8-46.1-1-84.8-31.2-98.1-72.8 6.5 1 13 1.6 19.8 1.6 9.4 0 18.8-1.3 27.6-3.6-48.1-9.7-84.1-52-84.1-103v-1.3c14 7.8 30.2 12.7 47.4 13.3-28.3-18.8-46.8-51-46.8-87.4 0-19.5 5.2-37.4 14.3-53C87.4 130.8 165 172.4 252.1 176.9c-1.6-7.8-2.6-15.9-2.6-24C249.5 95.1 296.3 48 354.4 48c30.2 0 57.5 12.7 76.7 33.1 23.7-4.5 46.5-13.3 66.6-25.3-7.8 24.4-24.4 44.8-46.1 57.8 21.1-2.3 41.6-8.1 60.4-16.2-14.3 20.8-32.2 39.3-52.6 54.3"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs", "navigation.instant"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>