<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://g1r-mp.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Scripting_limits</id>
	<title>Scripting limits - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://g1r-mp.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Scripting_limits"/>
	<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Scripting_limits&amp;action=history"/>
	<updated>2026-09-19T06:21:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Scripting_limits&amp;diff=862&amp;oldid=prev</id>
		<title>QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Scripting_limits&amp;diff=862&amp;oldid=prev"/>
		<updated>2026-09-12T11:51:30Z</updated>

		<summary type="html">&lt;p&gt;Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Scripting limits}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c33;padding:0.7em 1em;background:#fff5f5&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;CURRENT IN UPDATE 0.1.3 — expanded-budget BUILD81 (2026-09-12).&amp;#039;&amp;#039;&amp;#039; Earlier 0.1.3 binaries have smaller capacities. Update the server and the complete client/launcher package before relying on the expanded limits.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This reference lists the current developer-facing Lua, resource, API, queue and configuration limits audited in source. It distinguishes &amp;#039;&amp;#039;&amp;#039;fixed capacities&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;compiled defaults&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;operator-configurable bounds&amp;#039;&amp;#039;&amp;#039;. It does not treat every internal rendering/physics constant as a scripting limit or guarantee that the maximum workload will run smoothly on every machine.&lt;br /&gt;
&lt;br /&gt;
* [[Server configuration limits|All 84 numeric server settings: default, minimum, maximum and units]]&lt;br /&gt;
* [[Player statistic limits|All 59 player statistic ranges]]&lt;br /&gt;
* [[Lua API catalogs|Allowed appearance, equipment, monster and other catalog keys]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Units:&amp;#039;&amp;#039;&amp;#039; KiB = 1024 bytes; MiB = 1024 KiB; GiB = 1024 MiB. String limits count bytes unless a separate Unicode-codepoint limit is stated. Most position-based Lua functions use metres; &amp;#039;&amp;#039;&amp;#039;server sync-distance configuration and voice range use centimetres&amp;#039;&amp;#039;&amp;#039;. Times are milliseconds unless stated otherwise. Coordinates must be finite; numeric validity is not a promise that playable terrain exists at that position.&lt;br /&gt;
&lt;br /&gt;
== Lua VM and execution ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Limit !! Client !! Server !! Scope / behaviour&lt;br /&gt;
|-&lt;br /&gt;
| Lua VM allocation budget || 1024 MiB || 1024 MiB default; configurable 4..4096 MiB || Per resource/VM. Allocated on demand, not reserved on resource startup. This is not a cap on total process/native allocations, textures, audio or database buffers.&lt;br /&gt;
|-&lt;br /&gt;
| Instruction budget || 10000000 || 10000000 default; configurable 10000..1000000000 || Reset on each protected script chunk/callback invocation. Exceeding it raises a Lua error.&lt;br /&gt;
|-&lt;br /&gt;
| Execution timeout || 5000 ms || 5000 ms default; configurable 10..60000 ms || Cooperative Lua-hook check, not an OS watchdog and not preemption of a blocking native API call.&lt;br /&gt;
|-&lt;br /&gt;
| Hook interval || 10000 instructions || 10000 default; configurable 100..1000000 || Budgets are checked in samples; execution can pass a nominal boundary before the next check.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Server settings are &amp;lt;code&amp;gt;lua.memoryLimitMB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lua.instructionLimit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lua.timeoutMs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lua.hookInstructionInterval&amp;lt;/code&amp;gt;. They &amp;#039;&amp;#039;&amp;#039;do not propagate to the client&amp;#039;&amp;#039;&amp;#039;. An existing configuration retaining older values overrides the new server defaults. The production and bundled GothicRP-test configuration templates now use the expanded Lua/DB defaults.&lt;br /&gt;
&lt;br /&gt;
Lua is the sandboxed LuaJIT/Lua 5.1 environment with JIT disabled. Base, table, string and math libraries are exposed; general filesystem/OS/module-loading access is not. &amp;lt;code&amp;gt;dofile&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;load&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;loadfile&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;loadstring&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getfenv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setfenv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;collectgarbage&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;newproxy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;coroutine&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;io&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;os&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;package&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ffi&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;string.dump&amp;lt;/code&amp;gt; are unavailable. Lua bytecode is rejected. Increasing capacity does not weaken sandbox, hash, ownership, path or network validation.&lt;br /&gt;
&lt;br /&gt;
== Timers, handlers and commands ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Capacity !! Client, per resource !! Server&lt;br /&gt;
|-&lt;br /&gt;
| Timers || 8192 (previously 256) || No additional fixed timer-count cap in the server Lua API; still subject to memory and execution cost.&lt;br /&gt;
|-&lt;br /&gt;
| Timer callbacks selected per tick || 256 (previously 32), oldest deadline first || No matching fixed per-tick callback-count cap. Due timers are processed by the server runtime.&lt;br /&gt;
|-&lt;br /&gt;
| Event handlers, total || 8192 (previously 256) || No additional fixed count cap in the registration API.&lt;br /&gt;
|-&lt;br /&gt;
| Handlers for one event || 512 (previously 32) || No matching fixed per-event count cap.&lt;br /&gt;
|-&lt;br /&gt;
| Declared remote event names || 4096 (previously 256) || No additional fixed registration-count cap.&lt;br /&gt;
|-&lt;br /&gt;
| Key bindings || 1024 (previously 128) || Client-only feature.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both timer APIs require an interval of at least &amp;#039;&amp;#039;&amp;#039;10 ms&amp;#039;&amp;#039;&amp;#039;; interval and repeat-count parameters are unsigned 32-bit values. Repeat count &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; means repeat indefinitely. This is not a precision guarantee: timer dispatch follows runtime ticks, and missed intervals are not replayed in an unlimited catch-up loop. Client timers and key bindings accept at most &amp;#039;&amp;#039;&amp;#039;32 callback arguments&amp;#039;&amp;#039;&amp;#039;. Cancelled client timers leave their storage slots when the tick removes cancelled entries. Client &amp;lt;code&amp;gt;setTimer&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on rejection; handler/key-binding registration returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Check return values.&lt;br /&gt;
&lt;br /&gt;
Client selection is deadline-ordered and snapshots timer IDs before callbacks. Large batches of fast repeating timers therefore do not permanently starve later timers; callbacks may still be delayed by load. Do not use thousands of 10-ms timers as a substitute for batching work.&lt;br /&gt;
&lt;br /&gt;
Server local event dispatch has a recursion-depth limit of &amp;#039;&amp;#039;&amp;#039;32&amp;#039;&amp;#039;&amp;#039;; nested command execution has a depth limit of &amp;#039;&amp;#039;&amp;#039;16&amp;#039;&amp;#039;&amp;#039;. Command names are nonempty and at most &amp;#039;&amp;#039;&amp;#039;64 bytes&amp;#039;&amp;#039;&amp;#039;. &amp;lt;code&amp;gt;executeCommandHandler&amp;lt;/code&amp;gt; accepts at most &amp;#039;&amp;#039;&amp;#039;32 arguments&amp;#039;&amp;#039;&amp;#039; with at most &amp;#039;&amp;#039;&amp;#039;2048 bytes&amp;#039;&amp;#039;&amp;#039; of converted argument text in total. These recursion guards are not capacities for how many independent events/commands a gamemode can declare.&lt;br /&gt;
&lt;br /&gt;
== Network events and IPC ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Fixed limit&lt;br /&gt;
|-&lt;br /&gt;
| Resource name in an event envelope || 96 bytes&lt;br /&gt;
|-&lt;br /&gt;
| Event name || 128 bytes&lt;br /&gt;
|-&lt;br /&gt;
| Arguments per serialized resource event || 32&lt;br /&gt;
|-&lt;br /&gt;
| One event string || 32 KiB&lt;br /&gt;
|-&lt;br /&gt;
| Complete serialized resource event || 64 KiB, including headers, names and all arguments&lt;br /&gt;
|-&lt;br /&gt;
| Client IPC payload || 64 KiB&lt;br /&gt;
|-&lt;br /&gt;
| IPC buffered bytes / queued frames || 256 KiB / 256 frames; separate guards&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Values transported directly are nil, boolean, integer/number and string, &amp;#039;&amp;#039;&amp;#039;not Lua tables, functions or userdata&amp;#039;&amp;#039;&amp;#039;. Client local event argument conversion also uses the 32-argument/32-KiB-string guards. Server-local callbacks should not be confused with serialized network messages. Lua numbers do not represent every 64-bit integer exactly: keep large opaque identifiers as strings where the API specifies strings.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A 1-MiB JSON document cannot be sent as one event string.&amp;#039;&amp;#039;&amp;#039; The expanded JSON limit is for local serialization/storage; the event envelope is unchanged. For bulk application data, use bounded application-level chunks or appropriate resource/HTTP/database facilities. Validate sender permissions, payloads and request rates. Packet/IP budgets in [[Server configuration limits]] still apply to the connection as a whole.&lt;br /&gt;
&lt;br /&gt;
== Resource files and downloads ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Capacity !! BUILD81 value !! Previous value&lt;br /&gt;
|-&lt;br /&gt;
| One Lua source file || 128 MiB || 64 MiB&lt;br /&gt;
|-&lt;br /&gt;
| One resource file || 256 MiB || 64 MiB&lt;br /&gt;
|-&lt;br /&gt;
| All files in the client download catalog || 32 GiB || 8 GiB&lt;br /&gt;
|-&lt;br /&gt;
| Catalog file count || 262144 || 65536&lt;br /&gt;
|-&lt;br /&gt;
| Serialized catalog document || 128 MiB || 64 MiB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The download totals cover client/shared scripts and declared files, not server-only scripts. Server-only Lua files still have their individual Lua source-file cap. Server, launcher and client share these constants. A resource exceeding the old client limits will not work with old launchers simply because the server was updated.&lt;br /&gt;
&lt;br /&gt;
Client catalog relative paths are at most &amp;#039;&amp;#039;&amp;#039;512 bytes&amp;#039;&amp;#039;&amp;#039;, with at most &amp;#039;&amp;#039;&amp;#039;128 bytes per segment&amp;#039;&amp;#039;&amp;#039;; file URLs are at most &amp;#039;&amp;#039;&amp;#039;2048 bytes&amp;#039;&amp;#039;&amp;#039;. Resource names used across the whole scripting/network stack should fit the stricter &amp;#039;&amp;#039;&amp;#039;96-byte event-name envelope field&amp;#039;&amp;#039;&amp;#039; even though filesystem-side validators allow longer names. Paths must stay inside the resource, use the accepted relative-path syntax and refer to declared files; absolute paths and traversal are not enabled by larger file budgets.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&amp;lt;code&amp;gt;toJSON&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;fromJSON&amp;lt;/code&amp;gt; now allow &amp;#039;&amp;#039;&amp;#039;1 MiB&amp;#039;&amp;#039;&amp;#039;, nesting depth &amp;#039;&amp;#039;&amp;#039;64&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;65536 cumulative entries&amp;#039;&amp;#039;&amp;#039; across the document (previously 32 KiB / 16 / 2048). Object keys remain at most &amp;#039;&amp;#039;&amp;#039;256 bytes&amp;#039;&amp;#039;&amp;#039;. Arrays must use contiguous positive indices; mixed array/object key tables, cyclic references and non-finite numbers are rejected. Failure returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; plus an error description. The byte cap applies to the serialized document, not to the full native/Lua memory consumed while processing it.&lt;br /&gt;
&lt;br /&gt;
== Database and password work ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Compiled default !! BUILD81 value !! Configuration / scope&lt;br /&gt;
|-&lt;br /&gt;
| DB workers || 8 || Global worker pool&lt;br /&gt;
|-&lt;br /&gt;
| DB connections || 16 || Per resource&lt;br /&gt;
|-&lt;br /&gt;
| Pending DB queries || 1024 || Per resource&lt;br /&gt;
|-&lt;br /&gt;
| SQL statement || 4 MiB || Per query&lt;br /&gt;
|-&lt;br /&gt;
| DB result || 50000 rows and 64 MiB || Per result, both guards apply&lt;br /&gt;
|-&lt;br /&gt;
| DB timeouts || connect 5000 / read 15000 / write 15000 ms || Connection options may reduce, but not exceed, configured timeouts; minimum 100 ms&lt;br /&gt;
|-&lt;br /&gt;
| Blocking dbPoll || 100 ms maximum || Configurable; negative timeout becomes non-blocking and excessive timeout is clamped&lt;br /&gt;
|-&lt;br /&gt;
| Password workers / queue / pending per resource || 4 / 1024 / 256 || Password hashing/verifying service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All configurable ranges are listed in [[Server configuration limits]]. Result overflow is reported as a database error (client result-limit error &amp;#039;&amp;#039;&amp;#039;90001&amp;#039;&amp;#039;&amp;#039;), not a successful partial result. Free/poll results and avoid unbounded result retention; use SQL pagination. MariaDB/MySQL can impose additional server-side limits, including its packet and connection settings, which this application does not automatically change.&lt;br /&gt;
&lt;br /&gt;
Passwords for hash/verify are at most &amp;#039;&amp;#039;&amp;#039;256 bytes&amp;#039;&amp;#039;&amp;#039;; encoded hashes at most &amp;#039;&amp;#039;&amp;#039;512 bytes&amp;#039;&amp;#039;&amp;#039;. Default Argon2id parameters remain &amp;#039;&amp;#039;&amp;#039;65536 KiB memory, 3 iterations, parallelism 1&amp;#039;&amp;#039;&amp;#039;; larger queue capacity does not weaken hash security. DB multi-statements, multi-queries, local infile and automatic reconnect are not enabled as a side effect of this update.&lt;br /&gt;
&lt;br /&gt;
== requestRemote ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Limit !! Value&lt;br /&gt;
|-&lt;br /&gt;
| Workers / queued work / pending per resource || 8 / 256 / 32 (compiled defaults)&lt;br /&gt;
|-&lt;br /&gt;
| URL || 2048 bytes&lt;br /&gt;
|-&lt;br /&gt;
| Request body / response body || 4 MiB / 8 MiB&lt;br /&gt;
|-&lt;br /&gt;
| Request headers / response headers || 128 / 256&lt;br /&gt;
|-&lt;br /&gt;
| Aggregate header bytes || 64 KiB&lt;br /&gt;
|-&lt;br /&gt;
| Header name / username / password || 128 / 512 / 512 bytes&lt;br /&gt;
|-&lt;br /&gt;
| Connection attempts || 1..3; default 1&lt;br /&gt;
|-&lt;br /&gt;
| Connect timeout || 500..10000 ms; default 5000&lt;br /&gt;
|-&lt;br /&gt;
| Total timeout || 1000..30000 ms; default 15000&lt;br /&gt;
|-&lt;br /&gt;
| Redirect count || 0..3; default 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Allowed methods are GET, POST, PUT, PATCH, DELETE, HEAD and OPTIONS. Only the supported HTTP/HTTPS destinations are accepted. Loopback/private-address restrictions, DNS and redirect validation stay enabled in production. Capacity or validation rejection returns an error; asynchronous transfers also report completion errors. Keep callbacks short. The larger download-catalog file limit is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; the requestRemote response limit.&lt;br /&gt;
&lt;br /&gt;
== World entities and text ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feature !! Fixed capacity / range&lt;br /&gt;
|-&lt;br /&gt;
| Active world items || 16384 globally (previously 4096); quantity 1..1000 per spawn&lt;br /&gt;
|-&lt;br /&gt;
| Active NPCs || 8192 globally (previously 2048)&lt;br /&gt;
|-&lt;br /&gt;
| Active monsters || 4096 globally (previously 1024)&lt;br /&gt;
|-&lt;br /&gt;
| NPC route || 1..1024 points (previously 256); each wait 0..3600000 ms; speed 0.1..12 m/s&lt;br /&gt;
|-&lt;br /&gt;
| NPC scripted movement arrival radius || 0.01..5 m&lt;br /&gt;
|-&lt;br /&gt;
| Monster scripted movement || speedScale &amp;gt;0 and &amp;lt;=1; Lua arrivalRadius 0.01..5 m&lt;br /&gt;
|-&lt;br /&gt;
| Monster max health / attack damage || max health &amp;gt;0 and &amp;lt;=1000000; damage 0..100000&lt;br /&gt;
|-&lt;br /&gt;
| NPC name || 3..16 bytes, without control characters&lt;br /&gt;
|-&lt;br /&gt;
| Monster/nameplate display text || At most 96 UTF-8 bytes and 48 codepoints&lt;br /&gt;
|-&lt;br /&gt;
| 3D text objects || 1024 per resource / 8192 globally (previously 256 / 2048)&lt;br /&gt;
|-&lt;br /&gt;
| 3D text content || Nonempty, at most 256 bytes AND 128 Unicode codepoints; no control characters/newlines&lt;br /&gt;
|-&lt;br /&gt;
| 3D text draw distance / scale || 1..1000 m / 0.25..5&lt;br /&gt;
|-&lt;br /&gt;
| Scripted world positions || Finite coordinates within +/-1000000 m per axis where the Lua position validator is used&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Global capacities are shared across resources. Creation above a capacity is rejected; it does not expand the cap or authorize mutation of another resource&amp;#039;s entities. More accepted entities do not mean that placing all of them in one visible area is performant. Navigation, authoritative sync distance, client streaming and actual hardware still matter.&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
The compiled custom-collision capacities are &amp;#039;&amp;#039;&amp;#039;16384 blockers globally / 4096 per owner&amp;#039;&amp;#039;&amp;#039; (previously 4096 / 1024). The internal settings validator permits global capacity up to &amp;#039;&amp;#039;&amp;#039;65536&amp;#039;&amp;#039;&amp;#039;, with owner capacity positive and no greater than global capacity. These are not extra numeric &amp;lt;code&amp;gt;serverconf.cfg&amp;lt;/code&amp;gt; options.&lt;br /&gt;
&lt;br /&gt;
* Lua custom blocker coordinates: +/-100000 m; size/height dimensions 0.01..10000 m; polygons 3..16 vertices and must pass geometry validation.&lt;br /&gt;
* Navigation artifact: at most 256 MiB and 200000 baked blockers (previously 64 MiB / 50000); polygon cap 16 vertices.&lt;br /&gt;
* Compiled search defaults remain grid cell 50 cm, detour margin 1200 cm, maximum slope 45 degrees, maximum path distance 30000 cm (300 m), maximum search nodes 120000.&lt;br /&gt;
* Internal settings bounds: grid cell 5..1000 cm; detour margin 0..50000 cm; slope &amp;gt;=0 and &amp;lt;89 degrees; path distance &amp;gt;=grid cell and &amp;lt;=1000000 cm; search nodes 64..1000000.&lt;br /&gt;
* Navigation failure/search exhaustion is not permission to cross blockers. See [[NPC and monster navigation collision]].&lt;br /&gt;
&lt;br /&gt;
== Player state, appearance and nameplates ==&lt;br /&gt;
* Player names: 3..16 bytes, accepted player-name character set. Appearance, armor, weapons, spells, skills and tattoo selection use validated catalogs, not arbitrary game asset paths; see [[Lua API catalogs]].&lt;br /&gt;
* Skin RGB and display RGBA components: integers 0..255. Tattoo catalog: 12 presets. These are valid value ranges, not gamemode capacity budgets, and were not expanded.&lt;br /&gt;
* Inventory give/remove amount: 1..1000 per call. Server-controlled cumulative count: ammunition at most 65535, other supported items at most 100000. Ownership and item-specific rules still apply.&lt;br /&gt;
* Consumable grant count: 1..100; persistent consumable commit keys at most 96 bytes. This does not authorize trusting client-submitted permanent stats.&lt;br /&gt;
* All 59 stat ranges: [[Player statistic limits]]. Common HP/STR/DEX values cap at 100000; max-health minimum is 1. Level caps at 1000, magician level at 6; other stats have their own bounds.&lt;br /&gt;
* Scripted player damage amount: positive, at most 100000. Unconscious duration: 0 or 250..3600000 ms; configured health arguments must fit the relevant player-health range. Life-state checks still apply.&lt;br /&gt;
* Player/nameplate text: at most 96 UTF-8 bytes and 48 codepoints. Nameplate height offset is within +/-100 m.&lt;br /&gt;
* Observer-specific nameplates: defaults 250000 pairs globally and per resource; per-resource mutation budget 4096/s with burst 8192. Configurable ranges: [[Server configuration limits]]. These are directed observer/target overrides, not persistent database rows. Throttle bulk restore operations and handle rejected mutations.&lt;br /&gt;
* Nearby-player radius: 0..100000 m. Focus-query maximum distance: 0.1..1000 m; field of view: 1..180 degrees.&lt;br /&gt;
* Lua chat output: nonempty and at most 2048 bytes; chat RGB values are clamped to 0..255. Administrative &amp;lt;code&amp;gt;say&amp;lt;/code&amp;gt; has its separate 512-byte message cap.&lt;br /&gt;
* Animation API uses the 27-key validated animation catalog. &amp;lt;code&amp;gt;startAnim&amp;lt;/code&amp;gt; blend argument range is 0..2 seconds. Catalog keys are not raw montage paths.&lt;br /&gt;
* Account binding key: 3..24 bytes with its validated identifier syntax; serial: 32 hexadecimal characters. Kick/ban reason: nonempty, at most 160 bytes, valid text without controls. Ban duration: 0 (permanent) or at most 5256000 minutes.&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
Camera safety/representation ranges were not changed by this capacity update. &amp;#039;&amp;#039;&amp;#039;There is no 100-metre distance-from-player restriction.&amp;#039;&amp;#039;&amp;#039; Keep engine streaming and server relevance in mind; coordinate acceptance alone cannot guarantee valid/rendered terrain everywhere. See [[Scripted camera]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Limit&lt;br /&gt;
|-&lt;br /&gt;
| Camera command document || 24 KiB&lt;br /&gt;
|-&lt;br /&gt;
| Position/focus/path/orbit envelope || Finite coordinates within +/-1000000 m per axis&lt;br /&gt;
|-&lt;br /&gt;
| Path points || 1..32&lt;br /&gt;
|-&lt;br /&gt;
| FOV || 15..150 degrees&lt;br /&gt;
|-&lt;br /&gt;
| Rotation / orbit starting angle || Absolute value &amp;lt;=360000 degrees&lt;br /&gt;
|-&lt;br /&gt;
| Orbit sweep || Absolute value &amp;lt;=3600 degrees&lt;br /&gt;
|-&lt;br /&gt;
| Orbit radius / height offset || 0.1..50 m / absolute value &amp;lt;=50 m&lt;br /&gt;
|-&lt;br /&gt;
| Command duration || At most 600000 ms&lt;br /&gt;
|-&lt;br /&gt;
| Each path point || Duration 1..600000 ms; hold 0..600000 ms; sum of all durations and holds &amp;lt;=600000 ms per cycle&lt;br /&gt;
|-&lt;br /&gt;
| Orbit duration || 100..600000 ms&lt;br /&gt;
|-&lt;br /&gt;
| Reset blend || 0..10000 ms&lt;br /&gt;
|-&lt;br /&gt;
| Camera state document || At most 4096 bytes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Looped paths/orbits can repeat; the per-cycle duration bound is not a total lifetime cap. Invalid commands are rejected, not silently replaced by a different camera path. Resource ownership and cleanup still apply.&lt;br /&gt;
&lt;br /&gt;
== Client audio and UI ==&lt;br /&gt;
* Audio: &amp;#039;&amp;#039;&amp;#039;128 sound handles per resource / 512 globally&amp;#039;&amp;#039;&amp;#039; (previously 32 / 128). Declared join-time &amp;lt;code&amp;gt;.ogg&amp;lt;/code&amp;gt; resource files only. Stop unused handles; an accepted handle is not a promise that hundreds of simultaneously mixed sounds are cheap.&lt;br /&gt;
* Sound volume 0..1; finite 3D coordinates +/-1000000 m; minimum distance &amp;gt;=0.01 m, maximum distance greater than minimum and &amp;lt;=10000 m. Audio paths must also satisfy the catalog&amp;#039;s stricter relative-path bounds.&lt;br /&gt;
* UI texture files: at most &amp;#039;&amp;#039;&amp;#039;256 MiB&amp;#039;&amp;#039;&amp;#039; encoded (previously 64 MiB); decoded width and height remain at most &amp;#039;&amp;#039;&amp;#039;8192 pixels each&amp;#039;&amp;#039;&amp;#039;. This is not a VRAM allocation guarantee.&lt;br /&gt;
* UI attribute name: 1..64 bytes with safe-name validation; attribute value at most &amp;#039;&amp;#039;&amp;#039;16384 bytes&amp;#039;&amp;#039;&amp;#039; (previously 4096). Event-handler attribute injection remains prohibited.&lt;br /&gt;
* GUI append-text retains at most &amp;#039;&amp;#039;&amp;#039;1000 child lines&amp;#039;&amp;#039;&amp;#039; per target element (previously 200), removing older children. This is not a cap on all elements in an RML document.&lt;br /&gt;
* No separate fixed document-count or general &amp;lt;code&amp;gt;setInnerRML&amp;lt;/code&amp;gt; byte cap was found in the exposed UI API. Resource ownership, file limits, Lua/native memory and rendering cost still apply; this does not mean unlimited capacity.&lt;br /&gt;
&lt;br /&gt;
== Voice ==&lt;br /&gt;
Voice remains a separate real-time stream: 48000 Hz, 960 samples/20-ms frame, two channels; encoded frame at most 512 bytes and voice datagram at most 768 bytes. Default sender budgets are 55 frames/s and 65536 bytes/s; see [[Server configuration limits]] for ranges.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Voice range values use centimetres&amp;#039;&amp;#039;&amp;#039;, including &amp;lt;code&amp;gt;setPlayerVoiceRange&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;getPlayerVoiceRange&amp;lt;/code&amp;gt;. A positive finite custom range is normalized to 50 cm..configured &amp;lt;code&amp;gt;voice.maxRange&amp;lt;/code&amp;gt;; defaults are whisper 500 cm (5 m), normal 1800 cm (18 m), shout 3500 cm (35 m), maximum 10000 cm (100 m). Voice volume is 0..2; channel ID 0..4294967295. Increasing Lua capacity does not alter voice gain, codec timing or anti-abuse limits.&lt;br /&gt;
&lt;br /&gt;
== Source audit and practical use ==&lt;br /&gt;
Audit date: &amp;#039;&amp;#039;&amp;#039;2026-09-12&amp;#039;&amp;#039;&amp;#039;; expanded-budget &amp;#039;&amp;#039;&amp;#039;0.1.3 BUILD81&amp;#039;&amp;#039;&amp;#039;, protocol &amp;#039;&amp;#039;&amp;#039;34&amp;#039;&amp;#039;&amp;#039;. Changes increase capacities, not packet layouts. Main sources:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;shared/resource_limits.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_event_protocol.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;client_ipc_protocol.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scripting/LuaJson.hpp&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.cpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CameraProtocol.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PlayerProgressionCatalog.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PlayerAnimationCatalog.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NameplateValidation.hpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;server/src/config/ServerConfig.cpp&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;server/src/scripting/ScriptRuntime.cpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;server/src/resources/ResourceManager.cpp&amp;lt;/code&amp;gt;, resource catalog/manifest, database, HTTP, voice and world implementations, &amp;lt;code&amp;gt;server/enet_server.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;client-runtime/src/scripting/ClientScriptRuntime.cpp&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;app/ClientRuntimeMain.cpp&amp;lt;/code&amp;gt;, catalog, audio and UI implementations.&lt;br /&gt;
&lt;br /&gt;
The test suite executes the real Lua runtimes with 8192 client timers / 8193 server timers, expanded handler/remote-event/key-binding capacities, JSON boundary and overflow cases, client timer fairness and restart/cleanup. Capacity boundaries are not a full in-game performance benchmark. Use staged loading, staggered timers, asynchronous DB/HTTP, pagination and explicit cleanup even on fast computers. Always check API results and the runtime logs.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
</feed>