<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://g1r-mp.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=QCherry</id>
	<title>Wiki G1R-MP G1 Remake Multiplayer - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://g1r-mp.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=QCherry"/>
	<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Special:Contributions/QCherry"/>
	<updated>2026-11-03T20:15:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=1689</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=1689"/>
		<updated>2026-10-20T13:30:30Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#111611; color:#eee7d5; border:1px solid #8f7338; border-top:4px solid #c6a251; padding:1.6rem 1.8rem; margin-bottom:1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#c6a251; font-size:0.78rem; font-weight:bold; letter-spacing:0.08em; text-transform:uppercase;&amp;quot;&amp;gt;Gothic 1 Remake Multiplayer&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:2.25rem; font-weight:bold; line-height:1.1; margin:0.25rem 0 0.55rem;&amp;quot;&amp;gt;G1R:MP Scripting Wiki&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;max-width:58rem; color:#cfc8b8; font-size:1.02rem; line-height:1.55;&amp;quot;&amp;gt;Build multiplayer resources and gamemodes with Lua 5.1. This wiki documents the server, client, networking, gameplay, database, and RmlUi APIs exposed by G1R:MP.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:1rem; color:#e1c36d; font-size:0.9rem;&amp;quot;&amp;gt;Lua 5.1 &amp;amp;bull; server and client resources &amp;amp;bull; authoritative gameplay &amp;amp;bull; RmlUi&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #b28a3d; border-left:4px solid #b28a3d; background:#faf9f5; padding:0.9rem 1rem; margin:0 0 1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Current public release: G1R:MP 0.1.9 / BUILD264 / Protocol 42.&#039;&#039;&#039; Windows client and Windows/Linux dedicated servers are available on the [https://g1r-mp.com/download/ Download page]. Update both client and server; Protocol 41 and older cannot join. See [[Update 0.1.9]] for changes and compatibility notes.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- upcoming019:start --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #6f8461; background:#f5f8f2; padding:0.9rem 1rem; margin-bottom:1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;New in [[Update 0.1.9|0.1.9]].&#039;&#039;&#039; See the guides below for APIs, examples and scope.&lt;br /&gt;
* [[Item type stats|Server-controlled item statistics]], jewelry/consumables/rune settings and positive-mana casting recovery.&lt;br /&gt;
* [[Armor upgrades|Armor bases, upgrade pieces and full sets]]; [[Female identities|corrected female identities]].&lt;br /&gt;
* [[Activity animations|844 added activity aliases and fishing]] (962 total), with the [[Activity animation catalog|complete list]].&lt;br /&gt;
* [[Interactive map objects|94 editor prefabs]], [[World model removal|original-world inspection/removal]], shared placed doors and [[Custom keys|custom native keys with server APIs/callbacks]].&lt;br /&gt;
* [[Native crafting UI|Crafting-window visibility]] and [[Weather|extended weather]] with the [[Weather catalog|43-setting catalog]].&lt;br /&gt;
* [[Discord Rich Presence|Optional Discord Rich Presence]]: eight server Lua functions, status callback and [[Discord Presence configuration|server-owner configuration]], from 0.1.9.&lt;br /&gt;
See each guide for availability, current limits and remaining visual qualification. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- upcoming019:end --&amp;gt;&lt;br /&gt;
[[Armor upgrades|Also available from 0.1.9: armor upgrade slots and full sets]], with the [[Armor catalog|26-base catalog]], [[Armor upgrade catalog|84-part catalog]] and eight server Lua functions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- dimensions018:start --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #6f8461; background:#f5f8f2; padding:0.9rem 1rem; margin-bottom:1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Also available since [[Update 0.1.8|0.1.8]].&#039;&#039;&#039; [[Character dimensions]] for players, NPCs and monsters: six server-side Lua functions, three events and private character-creator examples. Also includes UI rendering fixes and automatic completion of multiplayer loading screens when loading is finished.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- dimensions018:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- g1r-upcoming017-game-audio:start --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #b89a50; padding:0.85rem 1rem; margin:1rem 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Also available (since [[Update 0.1.7|0.1.7]]).&#039;&#039;&#039; [[Native HUD and menus]]: 5 client Lua functions and a result event, resource-owned HUD/menu control and multiplayer save/load protection. [[Game audio|Built-in game audio]]: 11 client functions and a result event. [[Server TTS|Optional server TTS]]: 33 server functions and 4 events, reusable recordings and remote 3D/NPC speech. English guides: [[TTS configuration|Windows/Linux setup]] and [[TTS voices|own/downloaded voice samples and presets]]. Also: NPC crowd optimizations, melee skill tiers, remote acrobatics, climbing/ladder transitions, torch synchronization, identity accessory and gate-streaming fixes.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- g1r-upcoming017-game-audio:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- upcoming016:start --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #6f8461; background:#f5f8f2; padding:0.9rem 1rem; margin-bottom:1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Also included (since [[Update 0.1.6|0.1.6]]).&#039;&#039;&#039; Four new server-side functions: [[Area notifications|custom area notifications]] and [[Mounts|player-owned rideable scavengers]]. Also includes mounted nameplate/recovery fixes, smoother ordinary doors and pickup performance/animation improvements. See the guides for remaining in-game validation.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- upcoming016:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #6f8461; background:#f5f8f2; padding:0.9rem 1rem; margin-bottom:1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Also included (since [[Update 0.1.5|0.1.5]]).&#039;&#039;&#039; [[NPC scripting|NPC combat and scripting]], walk/run pursuit, identity, skin colour, tattoos, player weapon modes and events. Also includes crouch synchronization, melee presentation and knockdown recovery improvements.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #6f8461; background:#f5f8f2; padding:0.9rem 1rem; margin-bottom:1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Also included (since [[Update 0.1.4|0.1.4]]).&#039;&#039;&#039; See [[MySQL connection recovery]], [[Weapon control]], [[Mouse capture]], [[UpdateCameraPose]], [[Map editor]], [[World objects]] and [[Player animation catalog|118 player animations]] for released tools and scripting APIs. Also see [[RmlUi images|WebP images]], [[os.time]] and [[getEventClient|remote event security]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; gap:1rem; margin-bottom:1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 22rem; border:1px solid #c9c2b2; border-left:4px solid #b28a3d; padding:1rem 1.15rem; background:#faf9f5;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.35rem; font-weight:bold; margin-bottom:0.45rem;&amp;quot;&amp;gt;Start here&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#555; margin-bottom:0.6rem;&amp;quot;&amp;gt;Find the right entry point for your first resource.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin:0.35rem 0 0 1.25rem; line-height:1.75;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Lua API|Lua API overview]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Lua Functions|Complete function catalog]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Lua events|Complete event and callback catalog]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Scripting limits|Lua, resource and API limits]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Lua API catalogs|Validated skin, monster, equipment, and gameplay keys]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[NPC and monster navigation collision|NPC and monster navigation collision]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Client audio|Client audio and synchronized 3D playback]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Game audio|Built-in game audio (since 0.1.7)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Game dialogue catalog|Complete dialogue catalog (since 0.1.7)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Server TTS|Server TTS (since 0.1.7)]] — [[TTS configuration|setup]] · [[TTS voices|voice samples and presets]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Native HUD and menus|Native HUD/menu control and custom key bindings]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Scripted camera|Scripted camera and moving login backgrounds]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Map editor|Map editor: controls, save and reopen (0.1.4)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Interactive map objects|Interactive seats and lights (since 0.1.9)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Item type stats|Item statistics and armor protection (since 0.1.9)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Map scene deployment|Load exported objects for players (0.1.4)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Player animation catalog|Player animations: work, sitting, sleep and gestures (expanded in 0.1.4)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Player customization|Identity, skin color and tattoos]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Character dimensions|Character dimensions and private creators (since 0.1.8)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Chapter screens|Custom chapter title cards]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Area notifications|Custom area notifications (since 0.1.6)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Mounts|Rideable scavengers and ownership (since 0.1.6)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Observer nameplates|Observer-specific labels and acquaintance presentation]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Resource Functions|Resource lifecycle functions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Lua Examples|Lua examples]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Hosting a G1R:MP dedicated server|Hosting a dedicated server]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Known issues|Known issues and GPU crash workarounds]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Experimental Lua API|Experimental API status]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 22rem; border:1px solid #c9c2b2; border-left:4px solid #6f8461; padding:1rem 1.15rem; background:#faf9f5;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.35rem; font-weight:bold; margin-bottom:0.45rem;&amp;quot;&amp;gt;Reference by execution side&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#555; margin-bottom:0.6rem;&amp;quot;&amp;gt;Check where a function is available before using it.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin:0.35rem 0 0 1.25rem; line-height:1.75;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Server Functions|Server-side functions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Client Functions|Client-side functions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Audio Functions|Audio functions (client / server)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Shared Functions|Shared functions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Server Events|Server-side events]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Client Events|Client-side events]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Event Functions|Event functions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[:Category:Network Functions|Network functions]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; gap:1rem; margin-bottom:1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 22rem; border:1px solid #c9c2b2; padding:1rem 1.15rem; background:#fff;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.25rem; font-weight:bold; border-bottom:1px solid #ded8ca; padding-bottom:0.45rem; margin-bottom:0.6rem;&amp;quot;&amp;gt;Gameplay&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:grid; grid-template-columns:repeat(auto-fit,minmax(10rem,1fr)); gap:0.4rem 1rem; line-height:1.65;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Player Functions|Players]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Spatial Functions|Position and spawn]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Progression Functions|Progression]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Inventory Functions|Inventory]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Equipment Functions|Equipment]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Magic Functions|Magic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Life State Functions|Health and life state]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:World Functions|World time and weather]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Monster Functions|Monsters]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Navigation Functions|AI navigation]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Interaction Functions|Interactions]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 22rem; border:1px solid #c9c2b2; padding:1rem 1.15rem; background:#fff;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.25rem; font-weight:bold; border-bottom:1px solid #ded8ca; padding-bottom:0.45rem; margin-bottom:0.6rem;&amp;quot;&amp;gt;Scripting systems&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:grid; grid-template-columns:repeat(auto-fit,minmax(10rem,1fr)); gap:0.4rem 1rem; line-height:1.65;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:GUI Functions|RmlUi and GUI]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Database Functions|Database]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[MySQL connection recovery|Connection recovery (0.1.4)]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Timer Functions|Timers]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Command Functions|Commands]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Chat Functions|Chat]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Animation Functions|Animations]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[Client audio|Client audio and OGG playback]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[:Category:Camera Functions|Camera]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;[[Lua events|Events and callbacks]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your first server script ==&lt;br /&gt;
&lt;br /&gt;
The following example welcomes a joining player and places them at an authoritative spawn point:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onPlayerJoin&amp;quot;, root, function(playerId)&lt;br /&gt;
    setPlayerName(playerId, &amp;quot;Newcomer&amp;quot;)&lt;br /&gt;
    spawnPlayer(playerId, 12.0, 24.0, 2.0, 90)&lt;br /&gt;
    outputChatBox(&amp;quot;Welcome to G1R:MP!&amp;quot;, playerId, 225, 195, 110)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[onPlayerJoin]], [[AddEventHandler|addEventHandler]], [[SetPlayerName|setPlayerName]], [[SpawnPlayer|spawnPlayer]], and [[OutputChatBox|outputChatBox]] for parameter details and additional examples.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; gap:1rem; margin-top:1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 22rem; border-top:3px solid #b28a3d; background:#f5f2e9; padding:1rem 1.15rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.2rem; font-weight:bold; margin-bottom:0.4rem;&amp;quot;&amp;gt;Community&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin:0.35rem 0 0 1.25rem; line-height:1.7;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://g1r-mp.com/ G1R:MP website]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://g1r-mp.com/forum/ Community forum]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://g1r-mp.com/forum/member.php?action=profile&amp;amp;uid=1 Project lead: QCherry]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 22rem; border-top:3px solid #6f8461; background:#f5f2e9; padding:1rem 1.15rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.2rem; font-weight:bold; margin-bottom:0.4rem;&amp;quot;&amp;gt;Documentation status&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;line-height:1.6;&amp;quot;&amp;gt;Browse functions and events by topic above. Each API page identifies its version and execution side. See [[Update 0.1.9]] for the current release and [[Update 0.1.8]] for the previous release. APIs marked [[:Category:Experimental Lua API|experimental]] may change. Historical release notices remain on their dedicated reference pages.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=WorldObjects.request&amp;diff=1688</id>
		<title>WorldObjects.request</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=WorldObjects.request&amp;diff=1688"/>
		<updated>2026-10-20T13:30:23Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= WorldObjects.request =&lt;br /&gt;
&#039;&#039;&#039;Since 0.1.4.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Client Functions.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
requestIdOrFalse = WorldObjects.request(command)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Submits a validated command table. Returns a numeric request ID or false; a request ID is not completion. See the full command schemas, result JSON, limits and lifecycle below.&lt;br /&gt;
&lt;br /&gt;
See [[World objects]] for parameters, examples, failure handling and limits.&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Client Functions]]&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- worldmodels019:start --&amp;gt;&lt;br /&gt;
== Original world model operations from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[World model removal#Developer API and diagnostics|World model removal]] documents world_pick, world_nearby, world_select, world_set and world_restore_all, layer ownership and result handling. Existing create/delete operations still concern the caller&#039;s own static objects. Original-world hiding is reversible and does not edit terrain or NPC obstacle maps. A native live layer is not server authorization/replication: use trusted server state and the supplied editor/deployment workflow. Shared placed doors instead use server [[setWorldDoors]].&lt;br /&gt;
&amp;lt;!-- worldmodels019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=1687</id>
		<title>World objects</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=1687"/>
		<updated>2026-10-20T13:30:20Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= World objects =&lt;br /&gt;
&#039;&#039;&#039;Client-side; since 0.1.4.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[WorldObjects.request]] submits asynchronous commands for resource-owned static meshes. It is generic gameplay-resource API, not restricted to the map editor. There is no engine global named CreateModel or MapEditor.CreateObject; [[MapEditor helpers|MapEditor helpers]] are Lua functions inside the editor resource only.&lt;br /&gt;
&lt;br /&gt;
== Function and events ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
requestIdOrFalse = WorldObjects.request(command)&lt;br /&gt;
-- Events on the calling resource:&lt;br /&gt;
-- onClientWorldObjectResult(requestId, ok, reason, json)&lt;br /&gt;
-- onClientWorldObjectsReset()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supply a table. A numeric request ID means &#039;&#039;&#039;queued&#039;&#039;&#039;, not spawned/applied. &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; means immediate validation/readiness/capacity/IPC rejection. Match the ID in [[onClientWorldObjectResult]] before committing Lua state. The result&#039;s JSON argument is a &#039;&#039;&#039;string&#039;&#039;&#039;; decode it with &amp;lt;code&amp;gt;fromJSON&amp;lt;/code&amp;gt;. Never expose native pointers to Lua.&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! op !! Required fields and effect&lt;br /&gt;
|-&lt;br /&gt;
| create || &amp;lt;code&amp;gt;id, mesh, x,y,z, pitch,yaw,roll, sx,sy,sz, hidden,collision,selected&amp;lt;/code&amp;gt;. Creates a new instance; an existing ID fails with id-already-exists.&lt;br /&gt;
|-&lt;br /&gt;
| update || &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, all nine transform numbers and all three booleans. Updates an existing instance. &#039;&#039;&#039;Full state, not a partial patch.&#039;&#039;&#039; Does not replace the mesh: delete/create to change the asset.&lt;br /&gt;
|-&lt;br /&gt;
| delete || &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Removes the caller&#039;s instance; an absent ID also succeeds.&lt;br /&gt;
|-&lt;br /&gt;
| clear || Only &amp;lt;code&amp;gt;op&amp;lt;/code&amp;gt;. Removes the caller&#039;s created instances; from 0.1.9 also releases its original-world removal claims. It never destroys original world actors or releases another resource&#039;s claims.&lt;br /&gt;
|-&lt;br /&gt;
| pick || &amp;lt;code&amp;gt;op&amp;lt;/code&amp;gt;. Traces from the native player-controller view through the OS cursor, up to 1000 m. Requires usable game focus/viewport.&lt;br /&gt;
|-&lt;br /&gt;
| raycast || &amp;lt;code&amp;gt;x,y,z,tx,ty,tz&amp;lt;/code&amp;gt;, start and end in metres, length at most 1000 m.&lt;br /&gt;
|-&lt;br /&gt;
| lease || Only &amp;lt;code&amp;gt;op&amp;lt;/code&amp;gt;. Registers/renews ownership without creating a mesh; the host also renews ownership automatically.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Object IDs: 1-64 ASCII letters, digits, underscores or hyphens, scoped to the calling resource. Mesh must be a valid installed static-mesh object path like &amp;lt;code&amp;gt;/Game/Directory/Asset.Asset&amp;lt;/code&amp;gt;, at most 512 characters, not an OBJ filename or filesystem path. The editor additionally restricts choices to its shipped catalog. A syntactically valid path can still fail to load.&lt;br /&gt;
&lt;br /&gt;
Position: metres, each coordinate +/-100000. Rotation: pitch/yaw/roll in degrees, each +/-36000. Scale: sx/sy/sz in [0.01,100]. All numbers must be finite. The three booleans are required even when false. &amp;lt;code&amp;gt;selected&amp;lt;/code&amp;gt; requests custom-depth selection presentation; it does not guarantee an outline without matching post-processing. Names and editor locks belong to the Lua document, not the native command schema.&lt;br /&gt;
&lt;br /&gt;
== Result contract ==&lt;br /&gt;
Successful mutations return JSON containing their &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;; clear/lease return an empty JSON object. Successful traces return &amp;lt;code&amp;gt;{&amp;quot;hit&amp;quot;:false}&amp;lt;/code&amp;gt; or a hit containing &amp;lt;code&amp;gt;hit,x,y,z,nx,ny,nz,id&amp;lt;/code&amp;gt;. The coordinates are metres, normals unitless. A hit ID is populated only for a recognized object owned by the caller; it is empty for ordinary world surfaces or unrecognized/foreign instances. Do not access hit coordinates when hit=false. Traces depend on collision; use the editor hierarchy to select non-colliding objects.&lt;br /&gt;
&lt;br /&gt;
Typical failure reasons include &amp;lt;code&amp;gt;world-not-ready&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;native-dependencies-pending&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mesh-load-or-spawn-failed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;id-already-exists&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;owner-limit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object-invalid-or-transform-failed&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;raycast-unavailable&amp;lt;/code&amp;gt;. The former fixed-count &amp;lt;code&amp;gt;object-limit&amp;lt;/code&amp;gt; failure is removed in BUILD124. An unanswered host request reports &amp;lt;code&amp;gt;native-timeout&amp;lt;/code&amp;gt; after 10 seconds. A timeout does not prove a mutation was never applied: do not blindly retry it. Reconcile/reload the owned scene.&lt;br /&gt;
&lt;br /&gt;
== Example: complete create command ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function requestMesh(meshPath, x, y, z)&lt;br /&gt;
    return WorldObjects.request({&lt;br /&gt;
        op=&amp;quot;create&amp;quot;, id=&amp;quot;example_rock&amp;quot;, mesh=meshPath,&lt;br /&gt;
        x=x, y=y, z=z, pitch=0, yaw=0, roll=0,&lt;br /&gt;
        sx=1, sy=1, sz=1,&lt;br /&gt;
        hidden=false, collision=true, selected=false&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
-- Supply an actual installed mesh path and your desired coordinates.&lt;br /&gt;
-- Call after gameplay readiness; wait for onClientWorldObjectResult.&lt;br /&gt;
-- Reusing example_rock while it exists fails: assign unique IDs per instance.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example: asynchronous deletion ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local pending = {}&lt;br /&gt;
addEventHandler(&amp;quot;onClientWorldObjectResult&amp;quot;, resourceRoot,&lt;br /&gt;
    function(requestId, ok, reason, json)&lt;br /&gt;
        local id = pending[requestId]&lt;br /&gt;
        if not id then return end&lt;br /&gt;
        pending[requestId] = nil&lt;br /&gt;
        if ok then&lt;br /&gt;
            outputDebugString(&amp;quot;Deleted owned object: &amp;quot; .. id)&lt;br /&gt;
        else&lt;br /&gt;
            outputDebugString(&amp;quot;Delete not confirmed: &amp;quot; .. tostring(reason), 1)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
function deleteOwnedObject(id)&lt;br /&gt;
    local requestId = WorldObjects.request({op=&amp;quot;delete&amp;quot;, id=id})&lt;br /&gt;
    if not requestId then return false end&lt;br /&gt;
    pending[requestId] = id&lt;br /&gt;
    return true -- accepted only; completion is handled above&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For full scene creation, use the supplied &amp;lt;code&amp;gt;map_scene/client.lua&amp;lt;/code&amp;gt; loader and [[Map scene deployment]]. It includes startup readiness retries and reconstruction, which a one-shot on-start create call would miss.&lt;br /&gt;
&lt;br /&gt;
== Lifetime, limits and multiplayer ==&lt;br /&gt;
&#039;&#039;&#039;No fixed instance-count, pending-request-count or requests/second cap in this API since BUILD124 (0.1.4).&#039;&#039;&#039; The former 512 instances, 32 pending requests and 80 requests/second checks have been removed, not replaced with higher count caps. The editor and map_scene loader likewise no longer impose 500 objects.&lt;br /&gt;
&lt;br /&gt;
Commands still encode to at most 4096 bytes and at most 16 owning resources are supported. Shared IPC transport queues remain bounded (256 frames per queue); a full queue can cause immediate request rejection even though the WorldObjects-specific pending-count ceiling is gone. Check false returns, pace submissions and await completion. Do not submit an entire huge scene in a tight loop: native mesh loading/creation runs on the game thread. The supplied loader continues to load sequentially. RAM/VRAM/CPU, asset complexity, Lua/resource memory and JSON document limits remain practical bounds, not a guarantee of unlimited performance.&lt;br /&gt;
&lt;br /&gt;
The native ownership lease is 15 seconds and the host sends renewals every second. Stop/disconnect/world changes clear owned instances. Handle [[onClientWorldObjectsReset]] to discard stale IDs/pending state and reconstruct deliberately; the event has no arguments. Readiness, ownership, duplicate-ID checks, validation and timeout/cleanup safety have not been removed.&lt;br /&gt;
&lt;br /&gt;
This API creates client-local static actors, not synchronized interactive doors, inventory items, server collision geometry or networked physics. Sending the same trusted static map resource to every player, as map_scene does, reconstructs the same layout for late joiners. Dynamic multiplayer edits require their own server-authorized state distribution.&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- worldmodels019:start --&amp;gt;&lt;br /&gt;
== Original world model operations from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[World model removal#Developer API and diagnostics|World model removal]] documents world_pick, world_nearby, world_select, world_set and world_restore_all, layer ownership and result handling. Existing create/delete operations still concern the caller&#039;s own static objects. Original-world hiding is reversible and does not edit terrain or NPC obstacle maps. A native live layer is not server authorization/replication: use trusted server state and the supplied editor/deployment workflow. Shared placed doors instead use server [[setWorldDoors]].&lt;br /&gt;
&amp;lt;!-- worldmodels019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=World_model_removal&amp;diff=1686</id>
		<title>World model removal</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=World_model_removal&amp;diff=1686"/>
		<updated>2026-10-20T13:30:18Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= World model removal =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; The [[Map editor]] can inspect and reversibly hide supported original world objects, then publish a saved removal set to players. This does not destructively edit the installed map.&lt;br /&gt;
&lt;br /&gt;
== Inspect and select ==&lt;br /&gt;
# Open your authorized editor session and scroll to &#039;&#039;&#039;Original world objects&#039;&#039;&#039;. Click &#039;&#039;&#039;Inspect world / edit objects&#039;&#039;&#039;, then click the model in the viewport.&lt;br /&gt;
# The inspector shows the object/component class, model, position/transform when available, provenance, selection status and persistent placement ID. The ID field can be selected/copied.&lt;br /&gt;
# If several models overlap, select the exact candidate from the list. Use &#039;&#039;&#039;Nearby (50 m)&#039;&#039;&#039; for loaded models that cannot be reached by a collision trace, including some bushes/decorations. Allow the initial bounded scan to finish, then refresh if needed.&lt;br /&gt;
# Click &#039;&#039;&#039;Hide model (preview)&#039;&#039;&#039; and confirm. It affects your local preview only. Use Undo/Redo or the removed-model list to restore it.&lt;br /&gt;
&lt;br /&gt;
Supported adapters cover eligible standalone environment models, individual grouped decoration/foliage instances, authored doors, lights, interactive objects and ladders. A ladder is selected as one whole object, not separate rungs. A successful group selection does not authorize hiding all its neighbours. Group highlighting is deliberately limited to avoid highlighting unrelated models.&lt;br /&gt;
&lt;br /&gt;
Characters, terrain, world controllers and baked distant HLOD aggregates remain protected. An unresolved/ambiguous target must be inspected or selected more precisely; the editor does not guess a nearby replacement. This is not a promise that every engine object can safely be deleted.&lt;br /&gt;
&lt;br /&gt;
== Preview, save and apply ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Action !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| Hide/restore preview || Only this editor&#039;s local presentation changes; other players keep their current live state.&lt;br /&gt;
|-&lt;br /&gt;
| Save / Open || Stores/loads the draft and removal IDs. Save alone does not publish anything.&lt;br /&gt;
|-&lt;br /&gt;
| Apply removals + doors LIVE || Replaces the editor resource&#039;s entire saved live removal list and placed-door set for everyone, then closes the local editor. Static additions are not deployed by this button.&lt;br /&gt;
|-&lt;br /&gt;
| Clear live removals + doors || Releases this resource&#039;s live removals &#039;&#039;&#039;and removes its placed doors&#039;&#039;&#039;. Other resources&#039; objects/claims are not cleared.&lt;br /&gt;
|-&lt;br /&gt;
| Export Lua / map_scene || Deploys supported saved data using the complete updated [[Map scene deployment|map_scene]] resource. Do not run the same map through both live editor deployment and map_scene.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Save first and wait for acknowledgement before Apply LIVE. Applying another saved map replaces the current editor-owned live set rather than merging it. Concurrent stale revisions are rejected; refresh and deliberately reconfirm. A map containing non-door interactive prefabs cannot be deployed through this live door path: seats, lights and placed ladders still have local native tests only.&lt;br /&gt;
&lt;br /&gt;
Closing the editor releases preview, not the saved live set. If an object remains hidden after local restoration, another preview/live owner may still request its removal. Owners combine; releasing one does not override another.&lt;br /&gt;
&lt;br /&gt;
== Identity, restart and streaming ==&lt;br /&gt;
Placement IDs are derived from the authored world placement and validated model/layout, not a transient runtime index. Generated world-cell names displayed in the inspector are not names you should invent or rename. IDs are intended to survive unload/reload and restart with the &#039;&#039;&#039;same supported game data&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Version-3 documents store &amp;lt;code&amp;gt;catalog&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;removals&amp;lt;/code&amp;gt; separately from newly placed objects. Catalog/layout mismatches after game-data changes are rejected rather than silently hiding a different model. Reinspect and migrate deliberately after such an update; persistence is not a guarantee across arbitrary game versions.&lt;br /&gt;
&lt;br /&gt;
Server storage under &amp;lt;code&amp;gt;resources/map_editor/.storage&amp;lt;/code&amp;gt; includes &amp;lt;code&amp;gt;data-map_NAME.json&amp;lt;/code&amp;gt; for drafts and &amp;lt;code&amp;gt;data-world_applied.json&amp;lt;/code&amp;gt; for the saved live removal/door set. Atomic writes retain a previous backup generation. Back up this directory before replacing resources. Starting the editor resource again reapplies its saved live set. Door placements return, but door open/closed state starts closed after resource/server restart; that transient state is not a durable door-state journal.&lt;br /&gt;
&lt;br /&gt;
Only matching loaded world cells are altered. The system does not force distant cells to load or keep the whole world resident. The desired removal remains recorded and is applied when the placement is encountered again; joining clients receive the live list. This still requires representative streaming/late-join tests on your map.&lt;br /&gt;
&lt;br /&gt;
== Collision, interactions and performance ==&lt;br /&gt;
Removal hides the selected object&#039;s supported visuals and its own collision. Authored interactive adapters also suppress the associated interaction and relevant light/fire/audio presentation. Busy interactions wait for native release and a short exit-settle period rather than interrupting an occupied object. Restoration respects previously disabled states and current synchronized fire state.&lt;br /&gt;
&lt;br /&gt;
Grouped models may require rebuilding their shared render/collision component when the removal set changes. This is not a rebuild every frame, but a large group can still hitch. First-use asset loading and bounded nearby scanning also have costs. Check adjacent models, collision and restoration when using a new group type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The server NPC/monster obstacle map is intentionally not changed.&#039;&#039;&#039; Server authors must update their own obstacle/navigation data if their layout needs it. Baked lighting/shadows and distant HLOD representations are not regenerated, so a distant baked representation can remain visible. No map-file deletion, mesh-wide replacement or arbitrary runtime-object destruction API is provided.&lt;br /&gt;
&lt;br /&gt;
== Developer API and diagnostics ==&lt;br /&gt;
The editor uses the existing client [[WorldObjects.request]] channel with these additional commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! op !! Additional fields / behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world_pick&amp;lt;/code&amp;gt; || None; inspect the original world under the cursor.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world_nearby&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;x,y,z,offset&amp;lt;/code&amp;gt;; finite metre coordinates in +/-100000 and integer pagination offset 0..1000000. Lists loaded nearby candidates.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world_select&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;; approved placement ID, or empty string to deselect.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world_set&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;id,catalog,layer,hidden&amp;lt;/code&amp;gt;; exact compatible catalog, approved placement ID, layer &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;live&amp;lt;/code&amp;gt;, boolean hidden. No transform or arbitrary class/path is accepted.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world_restore_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;; release the calling resource&#039;s claims in that layer only.&lt;br /&gt;
|}&lt;br /&gt;
The layer name &amp;lt;code&amp;gt;live&amp;lt;/code&amp;gt; is local native bookkeeping, &#039;&#039;&#039;not server permission or automatic replication&#039;&#039;&#039;. Use the supplied trusted server/resource workflow for global changes. Do not accept arbitrary client-provided removal sets, identities or permission claims.&lt;br /&gt;
&lt;br /&gt;
Request IDs mean queued. Match [[onClientWorldObjectResult]]; its JSON can describe accepted/pending reconciliation, not necessarily already invisible geometry. Handle [[onClientWorldObjectsReset]] and reapply authoritative state. Missing, unsafe or changed native contracts fail instead of reporting completed removal.&lt;br /&gt;
&lt;br /&gt;
Repeated selected grouped-object hide/restore has been confirmed in game; all object classes, occupied cases, collision, streaming and two-client combinations have not been individually certified. Test your actual map, save/restart, restore and a late join before production use.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Lua Tutorials]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=World_door_prefab_catalog&amp;diff=1685</id>
		<title>World door prefab catalog</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=World_door_prefab_catalog&amp;diff=1685"/>
		<updated>2026-10-20T13:30:17Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
7 approved door aliases for [[setWorldDoors]]. Query [[getWorldDoorPrefabs]] for the running server. Each uses original native scale and collision; this is not the static mesh catalog. Not every alias has individual in-game visual qualification.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;io_oc_room_door&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;io_mf_room_door&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;io_nc_mages_door&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;io_merchant_door&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;io_prison_door&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;io_prison_door_02&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;io_xt_door&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua catalogs]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Weather_catalog&amp;diff=1684</id>
		<title>Weather catalog</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Weather_catalog&amp;diff=1684"/>
		<updated>2026-10-20T13:30:16Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Weather catalog =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
All 43 canonical settings exposed by [[getWeatherTypes]] in 0.1.9: five original biome-aware modes and 38 explicit game presets. See [[Weather]] for Lua, configuration, synchronization and qualification. A catalog entry is not individual in-game visual certification.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Canonical name !! Family&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sunny&amp;lt;/code&amp;gt; || Native biome&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rain1&amp;lt;/code&amp;gt; || Native biome&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rain2&amp;lt;/code&amp;gt; || Native biome&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rain3&amp;lt;/code&amp;gt; || Native biome&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cloudy&amp;lt;/code&amp;gt; || Native biome&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;snow1&amp;lt;/code&amp;gt; || Snow&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;snow2&amp;lt;/code&amp;gt; || Snow&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;snow3&amp;lt;/code&amp;gt; || Snow&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;foggy&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;partly_cloudy&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;overcast&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;clear_skies&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cloudy_global&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rain_light_global&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rain_global&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;thunderstorm&amp;lt;/code&amp;gt; || Sky / fog / rain&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sandstorm1&amp;lt;/code&amp;gt; || Sand / dust&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sandstorm2&amp;lt;/code&amp;gt; || Sand / dust&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sandstorm3&amp;lt;/code&amp;gt; || Sand / dust&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;desert_sunny&amp;lt;/code&amp;gt; || Desert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;desert_cloudy&amp;lt;/code&amp;gt; || Desert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forest_sunny&amp;lt;/code&amp;gt; || Forest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forest_cloudy&amp;lt;/code&amp;gt; || Forest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forest_rain1&amp;lt;/code&amp;gt; || Forest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forest_rain2&amp;lt;/code&amp;gt; || Forest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forest_rain3&amp;lt;/code&amp;gt; || Forest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;upland_sunny&amp;lt;/code&amp;gt; || Upland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;upland_cloudy&amp;lt;/code&amp;gt; || Upland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;upland_rain1&amp;lt;/code&amp;gt; || Upland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;upland_rain2&amp;lt;/code&amp;gt; || Upland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;upland_rain3&amp;lt;/code&amp;gt; || Upland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wetland_sunny&amp;lt;/code&amp;gt; || Wetland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wetland_cloudy&amp;lt;/code&amp;gt; || Wetland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wetland_rain1&amp;lt;/code&amp;gt; || Wetland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wetland_rain2&amp;lt;/code&amp;gt; || Wetland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wetland_rain3&amp;lt;/code&amp;gt; || Wetland&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tundra_sunny&amp;lt;/code&amp;gt; || Tundra&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tundra_cloudy&amp;lt;/code&amp;gt; || Tundra&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tundra_snow1&amp;lt;/code&amp;gt; || Tundra&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tundra_snow2&amp;lt;/code&amp;gt; || Tundra&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tundra_snow3&amp;lt;/code&amp;gt; || Tundra&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;orccity_dust2&amp;lt;/code&amp;gt; || Orccity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;orccity_dust3&amp;lt;/code&amp;gt; || Orccity&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Aliases ==&lt;br /&gt;
Names are case-insensitive. [[getWeather]] and callbacks return the canonical name, not the alias supplied by the caller.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Alias !! Canonical name&lt;br /&gt;
|-&lt;br /&gt;
| clear || sunny&lt;br /&gt;
|-&lt;br /&gt;
| clouds || cloudy&lt;br /&gt;
|-&lt;br /&gt;
| light_rain || rain1&lt;br /&gt;
|-&lt;br /&gt;
| rain || rain2&lt;br /&gt;
|-&lt;br /&gt;
| storm || rain3&lt;br /&gt;
|-&lt;br /&gt;
| snow, snow_normal || snow2&lt;br /&gt;
|-&lt;br /&gt;
| snow_light || snow1&lt;br /&gt;
|-&lt;br /&gt;
| blizzard, snow_blizzard || snow3&lt;br /&gt;
|-&lt;br /&gt;
| fog || foggy&lt;br /&gt;
|-&lt;br /&gt;
| sandstorm, dust || sandstorm2&lt;br /&gt;
|}&lt;br /&gt;
The original aliases keep their biome-dependent meaning. Use &amp;lt;code&amp;gt;thunderstorm&amp;lt;/code&amp;gt; for the explicit global preset, not &amp;lt;code&amp;gt;storm&amp;lt;/code&amp;gt;. These are names, not raw asset paths or stable numeric indices. Snow coverage depends on compatible world materials.&lt;br /&gt;
[[Category:Lua catalogs]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Weather&amp;diff=1683</id>
		<title>Weather</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Weather&amp;diff=1683"/>
		<updated>2026-10-20T13:30:14Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Weather =&lt;br /&gt;
&#039;&#039;&#039;Extended presets and getWeatherTypes are available from 0.1.9.&#039;&#039;&#039; Existing weather/time functions remain available in earlier releases with their earlier catalog. Use matching updated server and clients.&lt;br /&gt;
&lt;br /&gt;
== Available weather ==&lt;br /&gt;
[[Weather catalog]] lists &#039;&#039;&#039;43 canonical settings&#039;&#039;&#039;: the original five biome-aware modes and 38 explicit presets provided by the game. These include light/normal snow, blizzard, fog, clouds, rain/thunderstorm, sand/dust storms and regional variations. They are not 43 different precipitation effects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sunny&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cloudy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rain1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rain2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rain3&amp;lt;/code&amp;gt; keep the native biome-dependent behavior. Explicit presets select their settings independently of that automatic biome choice. Returning to a legacy name releases the explicit override. No game assets or map files are edited.&lt;br /&gt;
&lt;br /&gt;
== Server Lua ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[getWeatherTypes]] || New in 0.1.9: fresh array of supported canonical names.&lt;br /&gt;
|-&lt;br /&gt;
| [[setWeather]] || Select server weather, optionally with transition milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| [[getWeather]] || Read the canonical server target, not the client&#039;s rendered image.&lt;br /&gt;
|-&lt;br /&gt;
| [[getWeatherRevision]] / [[getWeatherTransitionDuration]] || Inspect authoritative revision and requested transition duration.&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerWeatherSync]] || Inspect one client&#039;s latest acknowledgement and freshness.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Run these calls in trusted server resource code, after applying your own administration/gameplay permissions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local modes = getWeatherTypes()&lt;br /&gt;
for _, name in ipairs(modes) do&lt;br /&gt;
    outputDebugString(name)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Choose one when your gameplay requires it:&lt;br /&gt;
local accepted = setWeather(&amp;quot;snow2&amp;quot;, 5000)&lt;br /&gt;
if not accepted then&lt;br /&gt;
    outputDebugString(&amp;quot;Weather change rejected&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
-- Later: setWeather(&amp;quot;foggy&amp;quot;, 3000)&lt;br /&gt;
-- Later: setWeather(&amp;quot;sandstorm3&amp;quot;, 3000)&lt;br /&gt;
-- Restore biome weather: setWeather(&amp;quot;sunny&amp;quot;, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optional transition is an integer from 0 to 300000 milliseconds, default 3000; zero requests immediate application. Names are case-insensitive and aliases normalize to canonical names. Unknown names and arbitrary asset paths are rejected. A true return means server acceptance, not completed client rendering. Avoid competing weather timers in different resources: there is one global server weather target, not separate player/dimension weather.&lt;br /&gt;
&lt;br /&gt;
== Callback ==&lt;br /&gt;
The existing [[onWeatherChange]] event includes the new canonical names without a new signature:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onWeatherChange&amp;quot;, root,&lt;br /&gt;
    function(previousWeather, currentWeather, transitionMs, sourceName)&lt;br /&gt;
        outputDebugString(previousWeather .. &amp;quot; -&amp;gt; &amp;quot; .. currentWeather)&lt;br /&gt;
    end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This is a server notification after acceptance, not a client transition-completion event. Lua changes identify their resource; administrative changes use their administrative source.&lt;br /&gt;
&lt;br /&gt;
== Configuration and console ==&lt;br /&gt;
In the server configuration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[world]&lt;br /&gt;
weather=snow2&lt;br /&gt;
weatherTransitionMs=5000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use the same canonical names or aliases in the existing server console/RCON command:&lt;br /&gt;
&amp;lt;pre&amp;gt;weather list&lt;br /&gt;
weather snow3 5000&lt;br /&gt;
weather sunny 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
These are administrative console commands, not automatically installed player chat commands. Examples do not grant players permission to change the weather.&lt;br /&gt;
&lt;br /&gt;
== Synchronization and transitions ==&lt;br /&gt;
The existing reliable world-environment synchronization is retained. Connected clients receive the target; joining clients apply the current target directly instead of replaying an obsolete transition. Explicit-preset transitions blend cloud, precipitation, lightning, wind, fog, dust and supported surface-coverage settings. Changing to a different preset mid-transition starts from the current blend; repeated snapshots of the same target do not restart it. Returning to a legacy mode uses the existing native weather path.&lt;br /&gt;
&lt;br /&gt;
The same server target does not mean identical particles or lightning timing on all machines. Regional legacy modes and local indoor/weather occlusion can also affect appearance. Snow and sand presets do not start the multiplayer rain-audio loop. The update does not add a separately synchronized snow-sound or sandstorm-sound API.&lt;br /&gt;
&lt;br /&gt;
== Verification and limits ==&lt;br /&gt;
The preset catalog, validation, state replay and transition logic have automated coverage. &#039;&#039;&#039;The new presets still require visual qualification in the running game&#039;&#039;&#039;, including another player, late join, indoor areas and returning to ordinary weather. A client ACK or status &amp;lt;code&amp;gt;ok&amp;lt;/code&amp;gt; confirms command/override acceptance, not proof that snow, fog or dust rendered correctly.&lt;br /&gt;
&lt;br /&gt;
Snow coverage affects only compatible game materials; it does not convert the whole world into a winter map. Terrain, navigation and collision are unchanged. This is a preset API, not arbitrary particle spawning, numeric weather-field editing, seasonal simulation or per-player weather. Test the presets your server intends to use before enabling them in gameplay.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:World Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ValidateWorldDoors&amp;diff=1682</id>
		<title>ValidateWorldDoors</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ValidateWorldDoors&amp;diff=1682"/>
		<updated>2026-10-20T13:30:13Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= validateWorldDoors =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Server Lua. Part of [[Custom keys|custom keys and shared placed doors]].&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ok, error = validateWorldDoors(doors)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
Same complete array, limits and compatibility checks as [[setWorldDoors]], without applying placements, locks or state. A later state change can invalidate an earlier successful check.&lt;br /&gt;
== Returns ==&lt;br /&gt;
true, empty error when valid now; false, error string otherwise. No objects are created.&lt;br /&gt;
== Examples and security ==&lt;br /&gt;
See [[Custom keys]] for complete registration, copy issuance, placement, persistence and callback examples. These are server functions, not client RPC endpoints. Do not forward untrusted client arguments without gameplay authorization.&lt;br /&gt;
[[Category:Lua Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=UpdatePlayerDiscordPresence&amp;diff=1681</id>
		<title>UpdatePlayerDiscordPresence</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=UpdatePlayerDiscordPresence&amp;diff=1681"/>
		<updated>2026-10-20T13:30:11Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= updatePlayerDiscordPresence =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server-side only.&#039;&#039;&#039; Part of [[Discord Rich Presence]]. See [[Discord Presence configuration]] for the optional server-owner resource.&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local ok, reason = updatePlayerDiscordPresence(playerId, {state=&amp;quot;At the Old Camp&amp;quot;, smallImage=false, smallText=false})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
Connected numeric game player ID and a flat patch table. Requires an existing profile owned by this resource. Unspecified fields stay unchanged; false removes a field, while nil is absent and cannot remove it. The merged profile is validated atomically, including paired link/party/timestamp constraints. Uses this resource&#039;s currently configured Application ID.&lt;br /&gt;
== Returns ==&lt;br /&gt;
Boolean success and empty reason, or false with an error string (including presence-not-set or presence-owned-by-another-resource). True means queued, not publicly visible. No partial changes on rejection.&lt;br /&gt;
== Examples, lifecycle and safety ==&lt;br /&gt;
See [[Discord Rich Presence]] for complete initialization, location/job updates, field removal, timestamps, counts, buttons and callback examples. Player launcher opt-in is off by default and cannot be overridden. No bot or token is needed; no Discord account identity is returned. Do not forward arbitrary client input to this server API.&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Update_0.1.9&amp;diff=1680</id>
		<title>Update 0.1.9</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Update_0.1.9&amp;diff=1680"/>
		<updated>2026-10-20T13:30:10Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Update 0.1.9 =&lt;br /&gt;
&#039;&#039;&#039;Released: G1R:MP 0.1.9 / BUILD264 / Protocol 42.&#039;&#039;&#039; The Windows client and Windows/Linux dedicated servers are available on the [https://g1r-mp.com/download/ Download page]. Update both client and server. Experimental features and remaining qualification limits are identified below.&lt;br /&gt;
&lt;br /&gt;
== Server-controlled item statistics ==&lt;br /&gt;
[[Item type stats]] introduces eight server Lua functions:&lt;br /&gt;
* [[getItemTypes]], [[getItemStats]], [[getItemStatDefinitions]]&lt;br /&gt;
* [[setItemStats]], [[setItemStatsBatch]], [[resetItemStats]]&lt;br /&gt;
* [[getItemStatsProfile]], [[replaceItemStatsProfile]]&lt;br /&gt;
&lt;br /&gt;
One profile changes every copy of the same item type on that server, not individual inventory instances. Supported fields cover weapon and ammunition damage, seven damage/protection channels, armor and jewelry bonuses, equipment requirements, consumable restoration/regeneration, appropriate rune settings, and available common metadata such as value and stack size. See [[Item stat properties]] for exact support and ranges.&lt;br /&gt;
&lt;br /&gt;
Changes are validated atomically, resource-owned, reversible and replayed to compatible joining clients. Profiles can be saved/restored by Lua. [[onPlayerItemStatsReport]] reports client application diagnostics; it is not authoritative proof of damage, inventory or gameplay success.&lt;br /&gt;
&lt;br /&gt;
The bundled GothicRP generated native-item metadata follows configured value/weight/stack-size values; separately authored gamemode item/shop definitions remain the gamemode&#039;s responsibility. Changing stack size does not delete or rearrange existing quantities.&lt;br /&gt;
&lt;br /&gt;
== Armor, jewelry and NPCs ==&lt;br /&gt;
Ordinary armor defense values can be configured directly, independently for cutting, blunt, piercing, fire, wind, ice and energy damage. Armor/player bases and bonuses are kept separate. Raising maxima does not heal/refill; lowering them clamps current values when needed.&lt;br /&gt;
&lt;br /&gt;
Explicit armor HP/mana/strength/dexterity bonuses also affect equipped scripted NPCs. NPC maximum setters use base values; getters return effective values. Combat-config dexterity remains a base value, and [[getNpcData]] exposes the new breakdown. Profile refresh does not intentionally reload ammunition or restart accepted attacks/casts. See [[NPC scripting]] and [[Item type stats]].&lt;br /&gt;
&lt;br /&gt;
Numeric ring/amulet overrides support the normal inventory equip/remove workflow and two owned identical rings. Reset-while-worn and multi-client lifecycle cases remain under qualification; NPC jewelry is not introduced.&lt;br /&gt;
&lt;br /&gt;
== Rune settings and mana recovery ==&lt;br /&gt;
Appropriate implemented runes support damage, range, duration and magic-circle requirements. A custom &amp;lt;code&amp;gt;manaCost&amp;lt;/code&amp;gt; is a fixed cost per accepted release; zero means free and resetting restores original cost rules. It preserves other spell eligibility checks. &#039;&#039;&#039;Custom paid/free/reset casting still requires final in-game qualification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The client also corrects a stale out-of-mana state after a successful positive mana assignment. This addresses cases where mana was visible in the HUD but casting remained blocked until restarting the game. The baseline Fire Bolt/Light and empty/refill sequence has been confirmed in game without restarting. The fix does not grant spells or bypass circle, ownership or equipment requirements. Scroll support is not added.&lt;br /&gt;
&lt;br /&gt;
== Interactive map-editor objects ==&lt;br /&gt;
The experimental [[Interactive map objects]] extension adds a searchable catalogue of &#039;&#039;&#039;94 entries: 18 seats, 48 lights/flames, 7 doors and 21 ladder sizes&#039;&#039;&#039;, editor placement/transforms, duplicate/history, prefab-aware save/open/export, initial light state and local native testing. [[Interactive prefab catalog]] lists all entries.&lt;br /&gt;
&lt;br /&gt;
[[MapEditor.CreateInteractiveObject]] is a new editor-resource client helper. Preview/local-test transform alignment and deferred seat cleanup were corrected; cleanup waits for native release and a 1-metre clearance. These additions are distinct from the existing static-object API.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approved doors now have shared server-owned deployment&#039;&#039;&#039;, through Apply removals + doors LIVE or the complete updated [[Map scene deployment|map_scene]] loader. Test native remains local; seats, lights and placed ladders are not yet shared deployed interactions. Beds, workshops and quest mechanisms are not enabled by this feature. The updated loader accepts formats 1/2/3 for supported static objects, doors and original-world removals.&lt;br /&gt;
&lt;br /&gt;
== Scope and release status ==&lt;br /&gt;
Ordinary armor protection and [[Armor upgrades|armor-upgrade-slot effects]] are implemented; see the armor guide for catalog coverage and remaining visual qualification. Special haste/orc-spore/joint effects, critical-hit multipliers, stagger damage and NPC toughness are not advertised as writable. Consult [[getItemStatDefinitions]] rather than assuming all engine fields are supported.&lt;br /&gt;
&lt;br /&gt;
In-game tests have confirmed selected potion and life-jewelry scenarios, not every item, tooltip, equipped-reset case or remote/late-join lifecycle. Experimental features remain marked as such until qualification is complete. The release is BUILD264 / Protocol 42. Use matching 0.1.9 client/server packages; publication does not remove the qualification limits above.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- armor019:start --&amp;gt;&lt;br /&gt;
== Armor bases and upgrade pieces (from 0.1.9) ==&lt;br /&gt;
Available from 0.1.9. [[Armor catalog]] lists all 26 bases (24 existing plus Royal Guard and Judge additions); [[Armor upgrade catalog]] lists all 84 authored parts and exact family presets. [[Armor upgrades]] explains ownership, full sets, individual slots, players/NPCs, numeric protection and persistence.&lt;br /&gt;
&lt;br /&gt;
Eight new server functions: [[getArmorUpgrades]], [[getArmorUpgradePresets]], [[getPlayerArmorUpgrades]], [[setPlayerArmorUpgrades]], [[setPlayerArmorPreset]], [[getNpcArmorUpgrades]], [[setNpcArmorUpgrades]], [[setNpcArmorPreset]]. Local-player and NPC checks are reported working; remote-human/late-join visual qualification remains pending. &lt;br /&gt;
&amp;lt;!-- armor019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- female019:start --&amp;gt;&lt;br /&gt;
== Female identity presentation ==&lt;br /&gt;
The existing &amp;lt;code&amp;gt;syra&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;velaya&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;seraphia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chani&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;natalia&amp;lt;/code&amp;gt; identities receive corrected facial proportions, addressing stretched faces on female characters, including while wearing armor. The correction covers local players, remote human players and scripted human NPCs.&lt;br /&gt;
&lt;br /&gt;
A matching identity without armor displays its full authored female body/outfit; an equipped armor keeps its original shape and selected pieces with the corrected female head. Facial expression is currently neutral. Existing [[setPlayerIdentity]] and [[setNpcIdentity]] APIs are used; no separate female API is introduced. See [[Female identities]] for usage, skin/tattoo limits and synchronization expectations. This is included from 0.1.9.&lt;br /&gt;
&amp;lt;!-- female019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- activities019:start --&amp;gt;&lt;br /&gt;
== Expanded activity animations and fishing ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; Both the server and observing clients need the matching update.&lt;br /&gt;
&#039;&#039;&#039;844 additional aliases; 962 total.&#039;&#039;&#039; The existing 118 remain available. New entries include gathering, rice/herb processing, crafting/work variations, sitting/rest, daily activities, carrying, poses and gestures. Many entries address sections/variants of the same animation rather than separate full animations.&lt;br /&gt;
&lt;br /&gt;
Fishing adds idle, reeling and four held direction poses, with corrected rod size, hand attachment and orientation. Cosmetic props cover local players, relevant observers and scripted human NPCs; they are not inventory grants. There is no verified casting animation or complete fishing minigame.&lt;br /&gt;
&lt;br /&gt;
Existing [[startAnim]], [[stopAnim]], [[startNpcAnim]] and [[stopNpcAnim]] calls are retained. [[getPlayerAnimationInfo]] adds catalogIndex, assetKind, since and verifiedInGame; [[getPlayerAnimationNames]] enumerates the expanded catalog. See [[Activity animations]] for Lua examples and limits, and [[Activity animation catalog]] for every new alias. New aliases are asset-audited, not all visually confirmed; local corrected fishing appearance was reported working, while complete observer/late-join visual qualification remains pending.&lt;br /&gt;
&amp;lt;!-- activities019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- customkeys019:start --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Custom native keys and shared placed doors ==&lt;br /&gt;
[[Custom keys]] adds independent native key types, names/descriptions, approved model/icon reuse, multiple copies and normal authoritative drop/pickup. Server-owned door rules check canonical key quantities; wrong/local-only keys do not authorize shared operations. Includes definition/query/placement/lock APIs and lifecycle callbacks. [[World door prefab catalog]] lists the supported door aliases. Persistence/economy remain gamemode responsibilities. &lt;br /&gt;
&amp;lt;!-- customkeys019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- weather019:start --&amp;gt;&lt;br /&gt;
== Extended weather ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Weather]] adds 38 explicit game presets alongside five legacy biome-aware modes: 43 names including snow/blizzard, fog, sky/rain and sand/dust/regional variants. [[Weather catalog]] lists every name and alias. New [[getWeatherTypes]] plus the existing set/get/revision/sync functions and [[onWeatherChange]]; shared snapshots and late join are retained. New preset rendering still requires in-game qualification; an ACK is not visual proof, and snow coverage depends on map materials.&lt;br /&gt;
&amp;lt;!-- weather019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- crafting019:start --&amp;gt;&lt;br /&gt;
== Native crafting-window visibility ==&lt;br /&gt;
[[Native crafting UI]] adds the crafting key to [[setNativeHudComponentVisible]] and includes it in [[showNativeHud]]. Recipe/progress windows can be hidden while station interaction and normal exit remain. Hidden new recipe starts are guarded; running crafts are not deliberately cancelled. This is client presentation control, not a recipe API or server authorization. New getNativeUiState diagnostics and existing asynchronous result event are documented. Available from 0.1.9; full station qualification remains pending.&lt;br /&gt;
&amp;lt;!-- crafting019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- worldmodels019:start --&amp;gt;&lt;br /&gt;
== Original-world inspection and reversible removal ==&lt;br /&gt;
[[World model removal]] adds object/model inspection, candidate/Nearby selection, original-world hide/restore with collision/interaction handling, undo/redo, persistent placement identities, format-3 save/export and server-guarded live publication/replay. Supported adapters include standalone and grouped models, foliage, authored doors, lights and whole ladders. Busy interactions wait for native release. Terrain, characters, world controllers and baked distant HLOD remain protected; NPC obstacle data is intentionally unchanged. Matching game/catalog data is required after restart/update.&lt;br /&gt;
&lt;br /&gt;
[[Interactive prefab catalog]] also includes 21 native ladder lengths (7..25, 28 and 30 steps) and all seven approved door prefabs. Local preview/native alignment and moving-door initialization were corrected. Shared doors use the original mechanism synchronization path, server interaction ownership, streamed construction and late-join state. See [[Interactive map objects]] for limits and production checks.&lt;br /&gt;
&amp;lt;!-- worldmodels019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- discord019:start --&amp;gt;&lt;br /&gt;
== Optional Discord Rich Presence ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Discord Rich Presence]] adds eight server Lua functions and [[onPlayerDiscordPresenceStatus]] for public server/location/job text, artwork, timers, displayed counts and two HTTPS buttons. [[Discord Presence configuration]] includes the complete optional Windows/Linux server resource and application setup. Player launcher opt-in is off by default. Resource ownership, coalescing and automatic cleanup are built in; no bot/token/account linking or automatic Join/Spectate. Real Discord visibility still requires owner-application acceptance testing. &lt;br /&gt;
&amp;lt;!-- discord019:end --&amp;gt;&lt;br /&gt;
== Installation and compatibility ==&lt;br /&gt;
* Install the matching &#039;&#039;&#039;0.1.9 / BUILD264 / Protocol 42&#039;&#039;&#039; client and dedicated server. Protocol 41 and older clients/servers are incompatible.&lt;br /&gt;
* Windows and Linux each have two dedicated-server downloads: &#039;&#039;&#039;with TTS&#039;&#039;&#039; includes the CPU speech runtime/models; &#039;&#039;&#039;without TTS&#039;&#039;&#039; is smaller. TTS is optional and disabled by default in both variants. See [[TTS configuration]] before enabling it.&lt;br /&gt;
* Distribution configurations contain no operator passwords or private state. Back up and preserve your own serverconf.cfg, database credentials, keys, maps and resource .storage when upgrading; merge new settings and updated bundled resources instead of overwriting your data.&lt;br /&gt;
* Optional [[Discord Rich Presence]] requires server-owner configuration and a separate player opt-in. It is disabled by default.&lt;br /&gt;
* Back up single-player saves before using the mod; multiplayer use may remove save files.&lt;br /&gt;
&lt;br /&gt;
== Remote head and upper-body look direction ==&lt;br /&gt;
Native look direction is forwarded for remote head/neck/upper-body presentation. No new Lua command is required. Missing native look data falls back to neutral, and interaction/combat/climbing and other full-body activities take priority. This does not change gameplay aiming or damage. Full multi-player visual qualification remains pending.&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=StopNpcAnim&amp;diff=1679</id>
		<title>StopNpcAnim</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=StopNpcAnim&amp;diff=1679"/>
		<updated>2026-10-20T13:30:06Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= stopNpcAnim =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.5&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.5 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stops the NPC scripted animation.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
stopNpcAnim(npcId)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || Server-assigned NPC ID returned by spawnNpc; not a player ID.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns true when accepted, false for a rejected request. Acceptance is not proof of a rendered animation, projectile release or hit.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
stopNpcAnim(npcId)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only. Mutations require the NPC to belong to the calling resource; getters do not grant control.&lt;br /&gt;
* The function was introduced in 0.1.5. Use matching supported client/server versions; new 0.1.9 aliases require that update on both.&lt;br /&gt;
* Use matching updated client and server. See [[NPC scripting]] for lifecycle, defaults, combat examples and collision limitations.&lt;br /&gt;
* Idempotent stop; original route/goal can resume without catching up suspended wait time.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- activities019:start --&amp;gt;&lt;br /&gt;
== Activity cleanup from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; Both the server and observing clients need the matching update.&lt;br /&gt;
Use &amp;lt;code&amp;gt;stopNpcAnim(npcId)&amp;lt;/code&amp;gt; for the new work/fishing/rest loops and held poses. It cleans up their animation-owned props without deleting NPC equipment or scenery. Resource ownership and route-resumption behavior remain unchanged. See [[Activity animations]].&lt;br /&gt;
&amp;lt;!-- activities019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=StopAnim&amp;diff=1678</id>
		<title>StopAnim</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=StopAnim&amp;diff=1678"/>
		<updated>2026-10-20T13:30:05Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= stopAnim =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in earlier releases and has corrected or expanded behavior in G1R:MP 0.1.2 and later. The contract below describes the updated behavior.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stops the tracked scripted visual animation for a connected player and synchronizes the stop with relevant clients.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool stopAnim(int playerId)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected player identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the server records or retransmits the authoritative stopped state and attempts reliable delivery. This is not a client or transport acknowledgement. Returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid player or inactive player session.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Stop a scripted animation:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
stopAnim(playerId)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Since 0.1.4 BUILD127, this also stops the new entries in the [[Player animation catalog]] and retires their owned cosmetic props. It does not delete equipped weapons, inventory items or unrelated world objects.&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* This stops only the scripted animation tracked by &amp;lt;code&amp;gt;startAnim&amp;lt;/code&amp;gt;; it does not issue a global montage stop and does not cancel normal replicated locomotion, combat, interaction, hit, or death state.&lt;br /&gt;
* Calling &amp;lt;code&amp;gt;stopAnim&amp;lt;/code&amp;gt; after an accepted start also supersedes any still-pending client asset load for that older animation state.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Animation Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- activities019:start --&amp;gt;&lt;br /&gt;
== Activity cleanup from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; Both the server and observing clients need the matching update.&lt;br /&gt;
Also ends the new [[Activity animations|activity animations and held fishing poses]] and retires their animation-owned cosmetic props. Use &amp;lt;code&amp;gt;stopAnim(playerId)&amp;lt;/code&amp;gt;; no new argument is required. It does not remove inventory rods/weapons, furniture or unrelated world objects.&lt;br /&gt;
&amp;lt;!-- activities019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=StartNpcAnim&amp;diff=1677</id>
		<title>StartNpcAnim</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=StartNpcAnim&amp;diff=1677"/>
		<updated>2026-10-20T13:30:02Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= startNpcAnim =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.5&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.5 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starts a catalog animation on an NPC.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
startNpcAnim(npcId, alias, looped=false, blendSeconds=0.15)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || Server-assigned NPC ID returned by spawnNpc; not a player ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Supported alias from [[Player animation catalog]], not an asset path.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;looped&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || no || Optional; default false.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;blendSeconds&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Optional blend-out time in seconds, 0..2; default 0.15.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns true when accepted, false for a rejected request. Acceptance is not proof of a rendered animation, projectile release or hit.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNpcWeaponMode(npcId, &amp;quot;none&amp;quot;)&lt;br /&gt;
startNpcAnim(npcId, &amp;quot;pray&amp;quot;, true, 0.15)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only. Mutations require the NPC to belong to the calling resource; getters do not grant control.&lt;br /&gt;
* The function was introduced in 0.1.5. Use matching supported client/server versions; new 0.1.9 aliases require that update on both.&lt;br /&gt;
* Use matching updated client and server. See [[NPC scripting]] for lifecycle, defaults, combat examples and collision limitations.&lt;br /&gt;
* Requires living NPC with holstered weapon. Suspends route/goal/wait progress. One-shot ends on its timeline; a loop requires stopNpcAnim. Does not replace the original route.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- activities019:start --&amp;gt;&lt;br /&gt;
== Activity aliases from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; Both the server and observing clients need the matching update.&lt;br /&gt;
Uses the same expanded catalog as [[startAnim]]: 962 aliases, including 844 additions. Example: &amp;lt;code&amp;gt;startNpcAnim(npcId, &amp;quot;pickrice_loop02&amp;quot;, true, 0.15)&amp;lt;/code&amp;gt;. Fishing includes the cosmetic rod. Existing resource ownership, living-NPC and holstered-weapon requirements remain. See [[Activity animations]] for examples and [[Activity animation catalog]] for modes and visual-qualification status.&lt;br /&gt;
&amp;lt;!-- activities019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=StartAnim&amp;diff=1676</id>
		<title>StartAnim</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=StartAnim&amp;diff=1676"/>
		<updated>2026-10-20T13:30:00Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= startAnim =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in earlier releases and has corrected or expanded behavior in G1R:MP 0.1.2 and later. The contract below describes the updated behavior.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starts an allowlisted scripted visual animation for a connected player and synchronizes it with relevant clients.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool startAnim(int playerId, string animation [, bool looped = false, number blendSeconds = 0.15])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected player identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;animation&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || A case-insensitive alias from the [[Player animation catalog]]. Raw Unreal asset paths are not accepted.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;looped&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || no || Whether to hold and replay the animation from its catalog loop point. The compatible default remains false, even for aliases whose authored mode is &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;blendSeconds&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Requested owning-player native montage transition/stop duration from 0 to 2 seconds; defaults to 0.15. When this request replaces an existing scripted animation, it controls that outgoing montage and is then retained for a later stop of the new animation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the server validates the request, records the authoritative animation state, and attempts reliable delivery. This is not a client playback or transport acknowledgement. Returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid player, alias, argument, or inactive player session.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Hold the allowlisted prayer animation until it is stopped:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
if not startAnim(playerId, &amp;quot;pray&amp;quot;, true, 0.2) then&lt;br /&gt;
    outputDebugString(&amp;quot;Prayer animation request was rejected&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* [[Player animation catalog]] documents the earlier 118 aliases. From 0.1.9, [[Activity animation catalog]] adds 844 entries (962 total), including route/gesture variants; these additions are not all individually visually confirmed. Use [[getPlayerAnimationNames]] and [[getPlayerAnimationInfo]] to enumerate the running server catalog and recommended modes. Selected introduction/loop/exit playback retains the existing signature and default looped=false.&lt;br /&gt;
* The optional &amp;lt;code&amp;gt;looped&amp;lt;/code&amp;gt; argument explicitly controls the request. Omitting it always requests a one-shot animation; the catalog mode is an authored recommendation, not an implicit override.&lt;br /&gt;
* Starting another scripted animation replaces the player&#039;s current scripted animation. Normal replicated gameplay actions retain their own presentation rules.&lt;br /&gt;
* Use &amp;lt;code&amp;gt;stopAnim&amp;lt;/code&amp;gt; to end the tracked scripted animation. Clients use bounded loading and presentation retries for the newest accepted revision; a terminal miss is written to the animation diagnostic log instead of retrying forever.&lt;br /&gt;
* The requested blend is applied to the owning player&#039;s exact native montage. Remote proxy handoff is immediate and does not guarantee an interpolated blend.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Animation Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- activities019:start --&amp;gt;&lt;br /&gt;
== Activity aliases from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; Both the server and observing clients need the matching update.&lt;br /&gt;
Use the existing call, for example &amp;lt;code&amp;gt;startAnim(playerId, &amp;quot;fishing&amp;quot;, true, 0.15)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;startAnim(playerId, &amp;quot;pickcrouch&amp;quot;, false, 0.15)&amp;lt;/code&amp;gt;. See [[Activity animations]] and the full [[Activity animation catalog]]. Animation-owned rods/tools are cosmetic, not inventory grants; rewards and interaction validation belong to your server script. Acceptance is not a visual acknowledgement.&lt;br /&gt;
&amp;lt;!-- activities019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SpawnItem&amp;diff=1675</id>
		<title>SpawnItem</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SpawnItem&amp;diff=1675"/>
		<updated>2026-10-20T13:29:58Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= spawnItem =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;IMPROVED FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in earlier releases and has corrected or expanded behavior in G1R:MP 0.1.3 and later. The contract below describes the updated behavior.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spawns an allowlisted, server-authoritative synchronized pickup near a player or at an exact world position.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool spawnItem(int playerId, string itemKey [, number heightOffset])&lt;br /&gt;
bool spawnItem(int playerId, string itemKey, number x, number y, number z [, number yaw [, bool snapToGround]])&lt;br /&gt;
bool spawnItem(string itemKey, number x, number y, number z [, number yaw [, bool snapToGround]])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || no || Required by the near-player and player-attributed exact-position overloads. Omit it only for a purely server-owned exact-position spawn.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itemKey&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || A verified public world-item key or inventory key from the server catalog allowlist, for example &amp;lt;code&amp;gt;apple&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;itfo_apple&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;heightOffset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Optional finite vertical offset in metres from -100 through 100. Values outside this range are rejected. Omit it to request ground snapping; an explicit 0 keeps the player&#039;s snapshot height without ground snapping.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Exact world X coordinate in metres. The exact-position overload requires &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; together.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Exact world Y coordinate in metres. The exact-position overload requires &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; together.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Exact world Z coordinate in metres. The exact-position overload requires &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; together.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;yaw&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Optional finite world yaw in degrees for an exact-position spawn. Defaults to 0 and is normalized by the authoritative world-item system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;snapToGround&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || no || Whether an exact-position spawn requests ground snapping. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; after the server accepts and creates the item; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Example 1 ===&lt;br /&gt;
Spawn an allowlisted apple near the invoking player:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;spawnitem&amp;quot;, function(playerId)&lt;br /&gt;
    if not spawnItem(playerId, &amp;quot;itfo_apple&amp;quot;) then&lt;br /&gt;
        outputChatBox(&amp;quot;The item could not be spawned.&amp;quot;, playerId)&lt;br /&gt;
    end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Example 2 ===&lt;br /&gt;
Spawn other verified food, weapon, and rune entries:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
spawnItem(playerId, &amp;quot;ItFo_Loaf&amp;quot;)&lt;br /&gt;
spawnItem(playerId, &amp;quot;ItMw_1H_Axe_01&amp;quot;)&lt;br /&gt;
spawnItem(playerId, &amp;quot;ItAr_Rune_FireBolt&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Example 3 ===&lt;br /&gt;
Spawn at exact positions, either attributed to a connected player or owned only by the server:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
spawnItem(playerId, &amp;quot;itfo_loaf&amp;quot;, 125.5, -42.0, 18.25, 90, true)&lt;br /&gt;
spawnItem(&amp;quot;itfo_apple&amp;quot;, 125.5, -42.0, 18.25)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Example 4 ===&lt;br /&gt;
Observe only pickups that the server has accepted and already granted:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onWorldItemPickup&amp;quot;, root, function(objectId, playerId, itemKey, quantity, serverTimeMs)&lt;br /&gt;
    outputDebugString(getPlayerName(playerId) .. &amp;quot; picked up &amp;quot; .. quantity .. &amp;quot;x &amp;quot; .. itemKey)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* This function was introduced in update 0.1.2. Update 0.1.3 adds the two exact-position overloads without changing the original near-player signature.&lt;br /&gt;
* The legacy overload spawns exactly one item 0.7 metres in front of the connected player&#039;s latest replicated position and facing direction.&lt;br /&gt;
* Exact-position &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; inputs use metres. [[onWorldItemSpawn]] exposes the published packet coordinates in Unreal centimetres.&lt;br /&gt;
* The player-attributed exact overload reports that connected player as &amp;lt;code&amp;gt;sourcePlayerId&amp;lt;/code&amp;gt;. The server-owned exact overload reports &amp;lt;code&amp;gt;sourcePlayerId = 0&amp;lt;/code&amp;gt; and does not require a player snapshot.&lt;br /&gt;
* The update 0.1.2 catalog contains 681 structurally verified world-item entries. Item codes are case-insensitive; the server canonicalizes every accepted value before replication.&lt;br /&gt;
* The [https://www.nexusmods.com/gothic1remake/articles/8 Gothic Remake item-code reference] is useful when looking up candidate codes. A code is spawnable only when it also exists in the current server catalog; unsupported codes return &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The server owns the item identity, revision, visibility, pickup validation, inventory award, and late-join state.&lt;br /&gt;
* [[onWorldItemPickup]] runs only after an authoritative pickup is accepted, the inventory grant is applied, and the reliable picked-up tombstone removes the item from active late-join state. It is an observation event; do not grant the same item again in its handler.&lt;br /&gt;
* Only entries mapped by the verified world-item catalog may be spawned; arbitrary asset names and paths are rejected.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:World Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- customkeys019:start --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Registered custom keys ==&lt;br /&gt;
This existing API also accepts the canonical item string from [[registerKeyDefinition]] in 0.1.9. Server registration, active definition and appropriate presentation readiness are required for mutations; use [[isPlayerKeyDefinitionReady]]. Do not pass the donor model alias as the custom item identity. Existing call shapes and limits remain; [[spawnItem]] creates one world item per call, whereas give/remove counts can manage copies. See [[Custom keys]] for safe server-side issuance, drop, pickup and persistence.&lt;br /&gt;
&amp;lt;!-- customkeys019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ShowNativeHud&amp;diff=1674</id>
		<title>ShowNativeHud</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ShowNativeHud&amp;diff=1674"/>
		<updated>2026-10-20T13:29:55Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= showNativeHud =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.7&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.7 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set this client resource&#039;s visibility policy for the six original native HUD groups; from 0.1.9 also crafting presentation. It does not disable the four native management menus.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
requestId = showNativeHud(visible)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || yes || false hides all HUD groups; true releases this resource&#039;s HUD restrictions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Positive numeric request ID if queued, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; if rejected. This is not an application acknowledgement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local requestId = showNativeHud(false)&lt;br /&gt;
-- Later, restore only this resource&#039;s HUD policy:&lt;br /&gt;
showNativeHud(true)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Client-side only; the original API exists since 0.1.7. Crafting extensions require 0.1.9; use matching updated client/server versions.&lt;br /&gt;
* See [[Native HUD and menus]] for asynchronous acknowledgements, resource ownership, input and restoration.&lt;br /&gt;
* A positive request ID means queued, not applied. Listen for [[onClientNativeUiResult]] and inspect [[getNativeUiState]].&lt;br /&gt;
* Register the handler before submitting. Rapid changes coalesce: track the latest request ID, not every intermediate ID.&lt;br /&gt;
* false restricts; true releases only the calling resource&#039;s restriction. Other resources remain respected.&lt;br /&gt;
* This does not change inventory data, player attributes or custom RmlUi documents. Native save/load cannot be re-enabled.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Client Functions]]&lt;br /&gt;
[[Category:GUI Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- crafting019:start --&amp;gt;&lt;br /&gt;
== Crafting presentation from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Native crafting UI]] documents the new crafting component, recipe/progress windows, preserved station entry/exit and prevention of invisible recipe starts. It is not a setNativeMenuEnabled key or a custom recipe API. getNativeUiState gains components.crafting, craftingReady, craftingGuardReady, craftingWidgets and craftingObserved; HUD bit 64 is appended, older bits unchanged. Existing resource ownership, asynchronous result handling and restoration still apply. Full station-by-station in-game qualification remains pending.&lt;br /&gt;
&amp;lt;!-- crafting019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetWorldDoors&amp;diff=1673</id>
		<title>SetWorldDoors</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetWorldDoors&amp;diff=1673"/>
		<updated>2026-10-20T13:29:49Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setWorldDoors =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Server Lua. Part of [[Custom keys|custom keys and shared placed doors]].&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ok, error = setWorldDoors(doors)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
doors is the complete 1-based array for the calling resource. Each row has exactly id, prefab, x, y, z, yaw; coordinates are metres, yaw degrees. Empty table removes all owned doors. Omitted rows are removed. Does not change another resource&#039;s set. See [[Custom keys#Shared door placement and access|replacement and key-binding lifecycle]].&lt;br /&gt;
== Returns ==&lt;br /&gt;
true, empty error on acceptance; false, error string on validation/compatibility/limit failure. Acceptance is not a visual acknowledgement. Requires updated connected clients.&lt;br /&gt;
== Examples and security ==&lt;br /&gt;
See [[Custom keys]] for complete registration, copy issuance, placement, persistence and callback examples. These are server functions, not client RPC endpoints. Do not forward untrusted client arguments without gameplay authorization.&lt;br /&gt;
[[Category:Lua Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetWorldDoorLocked&amp;diff=1672</id>
		<title>SetWorldDoorLocked</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetWorldDoorLocked&amp;diff=1672"/>
		<updated>2026-10-20T13:29:47Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setWorldDoorLocked =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Server Lua. Part of [[Custom keys|custom keys and shared placed doors]].&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ok, error = setWorldDoorLocked(id, locked)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
id identifies an owned placed door with an assigned key; locked is a boolean. false disables the requirement while retaining the assignment; true enables it again. No binding means failure.&lt;br /&gt;
== Returns ==&lt;br /&gt;
true, empty error on success; false, error string otherwise. Idempotent setters do not emit duplicate lock-change events.&lt;br /&gt;
== Examples and security ==&lt;br /&gt;
See [[Custom keys]] for complete registration, copy issuance, placement, persistence and callback examples. These are server functions, not client RPC endpoints. Do not forward untrusted client arguments without gameplay authorization.&lt;br /&gt;
[[Category:Lua Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetWorldDoorKey&amp;diff=1671</id>
		<title>SetWorldDoorKey</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetWorldDoorKey&amp;diff=1671"/>
		<updated>2026-10-20T13:29:46Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setWorldDoorKey =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Server Lua. Part of [[Custom keys|custom keys and shared placed doors]].&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ok, error = setWorldDoorKey(id, item)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
id identifies an owned placed door. item is an active canonical custom key from this or another resource. Assigns the key and enables its lock. One key type can open multiple doors; at least one authoritative copy is required and is not consumed.&lt;br /&gt;
== Returns ==&lt;br /&gt;
true, empty error on success; false, error string otherwise. Locking does not close an open door. An actual rule change queues [[onWorldDoorLockChange]].&lt;br /&gt;
== Examples and security ==&lt;br /&gt;
See [[Custom keys]] for complete registration, copy issuance, placement, persistence and callback examples. These are server functions, not client RPC endpoints. Do not forward untrusted client arguments without gameplay authorization.&lt;br /&gt;
[[Category:Lua Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetWeather&amp;diff=1670</id>
		<title>SetWeather</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetWeather&amp;diff=1670"/>
		<updated>2026-10-20T13:29:44Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- This page is generated automatically from the function definition: setWeather. --&amp;gt;&lt;br /&gt;
= setWeather =&lt;br /&gt;
Changes the authoritative weather and replicates it to every connected player.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setWeather(string weather [, int transitionMs = 3000])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;weather&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Earlier releases: sunny, cloudy, rain1, rain2 or rain3. From 0.1.9: any canonical name or alias in [[Weather catalog]], including snow, fog and sandstorms; query [[getWeatherTypes]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;transitionMs&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || no || Transition duration from 0 to 300000 milliseconds. Defaults to 3000; 0 applies an immediate transition.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the weather name and transition are accepted; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Example 1 ===&lt;br /&gt;
Create a five-second transition into a storm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
if not setWeather(&amp;quot;rain3&amp;quot;, 5000) then&lt;br /&gt;
    outputDebugString(&amp;quot;The server rejected the weather change&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Example 2 ===&lt;br /&gt;
Register a simple sunny-weather command:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;sunny&amp;quot;, function(playerId)&lt;br /&gt;
    if setWeather(&amp;quot;sunny&amp;quot;, 3000) then&lt;br /&gt;
        outputChatBox(&amp;quot;Clear weather enabled.&amp;quot;, playerId)&lt;br /&gt;
    end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* The new state is retained for late joiners.&lt;br /&gt;
* A successful change increments the weather revision and triggers &amp;lt;code&amp;gt;onWeatherChange&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:World Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- weather019:start --&amp;gt;&lt;br /&gt;
== Extended weather from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This existing API retains its call shape; the catalog is extended, not restricted to five names. See [[Weather]] and [[Weather catalog]]. Server target/revision and client acknowledgement are not proof of the final rendered image. The new presets still require in-game visual qualification; use compatible clients and test late join, indoor areas and returning to ordinary weather.&lt;br /&gt;
&amp;lt;!-- weather019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerMana&amp;diff=1669</id>
		<title>SetPlayerMana</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerMana&amp;diff=1669"/>
		<updated>2026-10-20T13:29:43Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- This page is generated automatically from the function definition: setPlayerMana. --&amp;gt;&lt;br /&gt;
= setPlayerMana =&lt;br /&gt;
Sets a player&#039;s authoritative current mana value.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setPlayerMana(int playerId, number value)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected player to update.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || yes || The new current mana value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the value is accepted; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Set a player&#039;s current mana:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setPlayerMana(playerId, 50)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* This is a convenience wrapper around &amp;lt;code&amp;gt;setPlayerStat(playerId, &amp;quot;mana&amp;quot;, value)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Progression Functions]]&lt;br /&gt;
[[Category:Player Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- upcoming019:start --&amp;gt;&lt;br /&gt;
== Mana-state correction (from 0.1.9) ==&lt;br /&gt;
The 0.1.9 client clears a stale out-of-mana condition after a successful, verified positive mana assignment. This addresses casting remaining blocked despite the updated mana display, without requiring a game restart. Zero/insufficient mana still blocks ordinary paid casts; rune ownership, equipment, circle and other eligibility checks remain. This improves the existing mana setter; it is not a new Lua function. Separate custom rune manaCost profiles are described in [[Item type stats]] and remain under in-game qualification.&lt;br /&gt;
&amp;lt;!-- upcoming019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerIdentity&amp;diff=1668</id>
		<title>SetPlayerIdentity</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerIdentity&amp;diff=1668"/>
		<updated>2026-10-20T13:29:41Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerIdentity =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;IMPROVED FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in earlier releases and has corrected or expanded behavior in G1R:MP 0.1.3 and later. The contract below describes the updated behavior.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selects a named identity while preserving equipped armor and independent cosmetic overrides. See [[Female identities]] for the expanded female body/outfit presentation from 0.1.9.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setPlayerIdentity(int playerId, string identityKey)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected player identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;identityKey&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || A stable key returned by &amp;lt;code&amp;gt;getPlayerIdentityNames&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the server accepts the validated identity state; returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an unavailable player, invalid key or rejected change. Success is not confirmation that every client has finished rendering it.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Select Milten&#039;s head/face without equipping armor or changing the body:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
if not setPlayerIdentity(playerId, &amp;quot;milten&amp;quot;) then&lt;br /&gt;
    outputChatBox(&amp;quot;The identity could not be applied.&amp;quot;, playerId)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* This existing API has improved behavior in 0.1.3; it was not introduced in that release. Use a key from &amp;lt;code&amp;gt;getPlayerIdentityNames&amp;lt;/code&amp;gt;, including &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; to select the default identity.&lt;br /&gt;
* In 0.1.8, the client applies a head-only identity layer with supported face/hair/beard geometry. From 0.1.9, the five [[Female identities|supported female identities]] also display their full authored outfit when no armor is equipped and body/head selections match. With armor equipped, the corrected female head is shown with the native armor. This is not a general body-shape or arbitrary model replacement API.&lt;br /&gt;
* The identity layers are committed together in server state. Native asset loading and visual reconstruction are asynchronous, so a successful call does not promise an immediately complete image on every client.&lt;br /&gt;
* Equipped armor remains controlled independently by &amp;lt;code&amp;gt;setPlayerArmor&amp;lt;/code&amp;gt;. This call does not equip or remove items, change HP/progression, or reset &amp;lt;code&amp;gt;setPlayerSkinColor&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;setPlayerTattoo&amp;lt;/code&amp;gt; overrides.&lt;br /&gt;
* Test the identities, armor, exposed skin, materials and LODs used by your resource on local and remote clients; not every authored combination or material permutation is guaranteed to render identically.&lt;br /&gt;
* Reliable server-owned state is replayed on relevance entry and late join. Resources must perform their own authorization before exposing this setter to player requests.&lt;br /&gt;
* Accepted changes emit existing compatibility events for the layers that changed: &amp;lt;code&amp;gt;onPlayerFaceChange&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;onPlayerBodyChange&amp;lt;/code&amp;gt; for the legacy face/body state, and &amp;lt;code&amp;gt;onPlayerHeadChange&amp;lt;/code&amp;gt; for the head state. These are state-change events, not notifications that visual reconstruction has finished; the female outfit presentation from 0.1.9 does not add a new event.&lt;br /&gt;
* See [[Player customization]], [[Player identity catalog]] and [[Player tattoo catalog]] for the independent appearance layers and supported catalogs.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Player Functions]]&lt;br /&gt;
[[Category:Appearance Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- female019:start --&amp;gt;&lt;br /&gt;
== Female presentation improved from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Improved from 0.1.9.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;setPlayerIdentity(playerId, &amp;quot;syra&amp;quot;)&amp;lt;/code&amp;gt; selects the matched identity; the same applies to &amp;lt;code&amp;gt;velaya&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;seraphia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chani&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;natalia&amp;lt;/code&amp;gt;. Identity selection remains an existing API. See [[Female identities]] for full-outfit/armor behavior, neutral facial expression and supported customization. The call does not remove armor, change protection or clear tint/tattoos.&lt;br /&gt;
&amp;lt;!-- female019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerDiscordPresence&amp;diff=1667</id>
		<title>SetPlayerDiscordPresence</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerDiscordPresence&amp;diff=1667"/>
		<updated>2026-10-20T13:29:40Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerDiscordPresence =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server-side only.&#039;&#039;&#039; Part of [[Discord Rich Presence]]. See [[Discord Presence configuration]] for the optional server-owner resource.&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local ok, reason = setPlayerDiscordPresence(playerId, {details=&amp;quot;My Gothic RP&amp;quot;, state=&amp;quot;Exploring the Colony&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
playerId: a connected game player ID, numeric integer 1..4294967295. Second argument: the complete flat profile table described in [[Discord Rich Presence#Profile fields|profile fields]]. First configure the calling resource&#039;s Application ID. Replaces all previous fields and claims ownership when unowned; another resource&#039;s ownership is rejected. An empty table is a basic Playing activity, not clear.&lt;br /&gt;
== Returns ==&lt;br /&gt;
Boolean success and empty reason, or false and an error string. True means queued on the server, not visible on Discord. Invalid input/ownership leaves the previous profile unchanged.&lt;br /&gt;
== Examples, lifecycle and safety ==&lt;br /&gt;
See [[Discord Rich Presence]] for complete initialization, location/job updates, field removal, timestamps, counts, buttons and callback examples. Player launcher opt-in is off by default and cannot be overridden. No bot or token is needed; no Discord account identity is returned. Do not forward arbitrary client input to this server API.&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerArmorUpgrades&amp;diff=1666</id>
		<title>SetPlayerArmorUpgrades</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerArmorUpgrades&amp;diff=1666"/>
		<updated>2026-10-20T13:29:38Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerArmorUpgrades =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replaces all three selected armor-upgrade slots for a player.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted = setPlayerArmorUpgrades(playerId, parts)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || yes || Existing connected player ID: finite integer 1..4294967295, not a numeric string.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;parts&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || String keys top/mid/bottom only, with compatible part-key string values. Omitted slots, empty strings or none clear a slot. {} clears all parts.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Boolean: true when accepted; false for invalid arguments/selection, unavailable character, wrong family/slot, or failed ownership/requirements. Invalid selections are rejected before equipment mutation.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local presets = getArmorUpgradePresets(&amp;quot;mercenary&amp;quot;)&lt;br /&gt;
if presets and presets.heavy_2 then&lt;br /&gt;
    -- Player already wears mercenary and owns these parts.&lt;br /&gt;
    assert(setPlayerArmorUpgrades(playerId, presets.heavy_2))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only; available from 0.1.9.&lt;br /&gt;
* See [[Armor upgrades]], [[Armor catalog]] and [[Armor upgrade catalog]].&lt;br /&gt;
* The player must own the equipped base and every selected part, and satisfy the server equipment requirements. No items or attributes are granted.&lt;br /&gt;
* Uses the already equipped base; never selects a different base. The part must match its family and slot.&lt;br /&gt;
* true confirms server acceptance, not completed native rendering. No automatic healing/refill or database save.&lt;br /&gt;
* Treat remote requests as untrusted; authorize the action in your server resource.&lt;br /&gt;
* This is replacement, NOT a partial patch. Read the current table and modify one field to preserve the other slots. Values are keys, not item IDs; unknown table fields and non-string values reject the request.&lt;br /&gt;
* Equivalent alias: SetPlayerArmorUpgrades.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerArmorPreset&amp;diff=1665</id>
		<title>SetPlayerArmorPreset</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerArmorPreset&amp;diff=1665"/>
		<updated>2026-10-20T13:29:37Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerArmorPreset =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selects an authored armor preset for the currently equipped base.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted = setPlayerArmorPreset(playerId, preset)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || yes || Existing connected player ID: finite integer 1..4294967295, not a numeric string.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;preset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || light_1, light_2, medium_1, medium_2, heavy_1, heavy_2, or none to clear selected parts.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Boolean: true when accepted; false for invalid/unavailable ID, unknown/inapplicable preset, or failed validation/ownership/requirements. none clears parts without removing the base.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
-- Player already wears mercenary and owns the heavy_2 parts.&lt;br /&gt;
assert(setPlayerArmorPreset(playerId, &amp;quot;heavy_2&amp;quot;))&lt;br /&gt;
-- Keep the base, remove all selected parts:&lt;br /&gt;
assert(setPlayerArmorPreset(playerId, &amp;quot;none&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only; available from 0.1.9.&lt;br /&gt;
* See [[Armor upgrades]], [[Armor catalog]] and [[Armor upgrade catalog]].&lt;br /&gt;
* The player must own the equipped base and every selected part, and satisfy the server equipment requirements. No items or attributes are granted.&lt;br /&gt;
* Uses the already equipped base; never selects a different base. The part must match its family and slot.&lt;br /&gt;
* true confirms server acceptance, not completed native rendering. No automatic healing/refill or database save.&lt;br /&gt;
* Treat remote requests as untrusted; authorize the action in your server resource.&lt;br /&gt;
* Sparse families use only existing parts up to the requested tier, so different presets may select the same pieces. Query getArmorUpgradePresets first.&lt;br /&gt;
* Equivalent alias: SetPlayerArmorPreset.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerArmor&amp;diff=1664</id>
		<title>SetPlayerArmor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerArmor&amp;diff=1664"/>
		<updated>2026-10-20T13:29:35Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerArmor =&lt;br /&gt;
Equips or clears a player&#039;s authoritative armor slot.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setPlayerArmor(int playerId, string itemKey)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected player identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itemKey&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || A key returned by &amp;lt;code&amp;gt;getPlayerArmorNames&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; to clear the slot.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the equipment change is accepted and replicated; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Example 1 ===&lt;br /&gt;
Give an item and equip it in the armor slot:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local itemKey = &amp;quot;water_robe&amp;quot;&lt;br /&gt;
if givePlayerItem(playerId, itemKey) then&lt;br /&gt;
    setPlayerArmor(playerId, itemKey)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Example 2 ===&lt;br /&gt;
Clear the armor slot:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setPlayerArmor(playerId, &amp;quot;none&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* The player must own at least one copy of a non-empty item before it can be equipped.&lt;br /&gt;
* The selected appearance is reliably synchronized and included in late-join state.&lt;br /&gt;
* Gothic Remake character variants have identity-specific armor support. Not every identity/armor combination exists or renders correctly; test every combination exposed by a resource.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Player Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- armor019:start --&amp;gt;&lt;br /&gt;
== Armor parts (from 0.1.9) ==&lt;br /&gt;
Available from 0.1.9. [[Armor catalog]] lists the 26 bases; [[Armor upgrade catalog]] lists all 84 pieces. This existing function/guide is not newly introduced in 0.1.9. The new [[Armor upgrades|upgrade system]] adds per-character top/mid/bottom selections, full presets and separate player/NPC setters. A different base clears the old parts; choosing the same base keeps compatible selections. Identity, skin tint and tattoos remain separate. See the guide for requirements, safe replacement and synchronization validation.&lt;br /&gt;
&amp;lt;!-- armor019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcMaxMana&amp;diff=1663</id>
		<title>SetNpcMaxMana</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcMaxMana&amp;diff=1663"/>
		<updated>2026-10-20T13:29:30Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNpcMaxMana =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.5&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.5 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets NPC maximum mana.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
setNpcMaxMana(npcId, maxMana)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || Server-assigned NPC ID returned by spawnNpc; not a player ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;maxMana&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || yes || Finite 0..100000; clamps current mana, does not refill it.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns true when accepted, false for a rejected request. Acceptance is not proof of a rendered animation, projectile release or hit.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNpcMaxMana(npcId, 100)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only. Mutations require the NPC to belong to the calling resource; getters do not grant control.&lt;br /&gt;
* Since 0.1.5. Use the matching 0.1.5 client and server (Protocol 37).&lt;br /&gt;
* Use matching updated client and server. See [[NPC scripting]] for lifecycle, defaults, combat examples and collision limitations.&lt;br /&gt;
* May cancel pending preparation; increasing maximum does not refill current mana.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- upcoming019:start --&amp;gt;&lt;br /&gt;
== Item-type armor bonuses (from 0.1.9) ==&lt;br /&gt;
[[Item type stats]] adds explicit armor bonusHealth/bonusMana/bonusStrength/bonusDexterity contributions for equipped scripted NPCs, plus the armor protection profile. Unconfigured native bonuses do not silently change existing NPC balance. Base stats and bonuses are separate; raising maxima does not heal/refill and lowering maxima clamps current values without reviving dead NPCs.&lt;br /&gt;
&lt;br /&gt;
setNpcMaxHealth/setNpcMaxMana set BASE maxima; getNpcMaxHealth/getNpcMaxMana return EFFECTIVE maxima. setNpcCombatConfig/getNpcCombatConfig dexterity is BASE dexterity. getNpcData adds baseMaxHealth, baseMaxMana, baseDexterity, mana, maxMana, dexterity, armorHealthBonus, armorManaBonus, armorStrengthBonus and armorDexterityBonus.&lt;br /&gt;
&lt;br /&gt;
NPC melee includes explicit armor strength and ranged combat uses effective dexterity. Numeric refresh preserves accepted attack/projectile snapshots; it does not reload ammo or restart prepared casts. NPC toughness and NPC jewelry are not implemented by this addition. These are extensions to existing APIs, not new names or a replacement for their earlier contracts.&lt;br /&gt;
&amp;lt;!-- upcoming019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcMaxHealth&amp;diff=1662</id>
		<title>SetNpcMaxHealth</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcMaxHealth&amp;diff=1662"/>
		<updated>2026-10-20T13:29:28Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNpcMaxHealth =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.5&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.5 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets NPC maximum health.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
setNpcMaxHealth(npcId, maxHealth)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || Server-assigned NPC ID returned by spawnNpc; not a player ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;maxHealth&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || yes || Finite 1..100000; lowering clamps current HP, raising does not heal.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns true when accepted, false for a rejected request. Acceptance is not proof of a rendered animation, projectile release or hit.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNpcMaxHealth(npcId, 100)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only. Mutations require the NPC to belong to the calling resource; getters do not grant control.&lt;br /&gt;
* Since 0.1.5. Use the matching 0.1.5 client and server (Protocol 37).&lt;br /&gt;
* Use matching updated client and server. See [[NPC scripting]] for lifecycle, defaults, combat examples and collision limitations.&lt;br /&gt;
* Changing maxHP does not automatically heal. Script HP is separate from armor protection.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- upcoming019:start --&amp;gt;&lt;br /&gt;
== Item-type armor bonuses (from 0.1.9) ==&lt;br /&gt;
[[Item type stats]] adds explicit armor bonusHealth/bonusMana/bonusStrength/bonusDexterity contributions for equipped scripted NPCs, plus the armor protection profile. Unconfigured native bonuses do not silently change existing NPC balance. Base stats and bonuses are separate; raising maxima does not heal/refill and lowering maxima clamps current values without reviving dead NPCs.&lt;br /&gt;
&lt;br /&gt;
setNpcMaxHealth/setNpcMaxMana set BASE maxima; getNpcMaxHealth/getNpcMaxMana return EFFECTIVE maxima. setNpcCombatConfig/getNpcCombatConfig dexterity is BASE dexterity. getNpcData adds baseMaxHealth, baseMaxMana, baseDexterity, mana, maxMana, dexterity, armorHealthBonus, armorManaBonus, armorStrengthBonus and armorDexterityBonus.&lt;br /&gt;
&lt;br /&gt;
NPC melee includes explicit armor strength and ranged combat uses effective dexterity. Numeric refresh preserves accepted attack/projectile snapshots; it does not reload ammo or restart prepared casts. NPC toughness and NPC jewelry are not implemented by this addition. These are extensions to existing APIs, not new names or a replacement for their earlier contracts.&lt;br /&gt;
&amp;lt;!-- upcoming019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcIdentity&amp;diff=1661</id>
		<title>SetNpcIdentity</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcIdentity&amp;diff=1661"/>
		<updated>2026-10-20T13:29:26Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNpcIdentity =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.5&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.5 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selects the matched head/identity profile of an NPC.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
setNpcIdentity(npcId, identity)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || NPC ID returned by spawnNpc; not a player ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;identity&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Named identity from getNpcIdentityNames, or default. ASCII case-insensitive, at most 48 bytes; not an asset path.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
true when accepted, false when invalid, unavailable or owned by another resource.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNpcIdentity(npcId, &amp;quot;milten&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only. Mutations require the resource that owns this NPC; getters do not grant control.&lt;br /&gt;
* Available from update 0.1.5. See [[NPC scripting#NPC appearance since 0.1.5]].&lt;br /&gt;
* The authoritative state is replayed for relevance entry/late join. Rendering is asynchronous; acceptance does not mean the mesh has finished rebuilding.&lt;br /&gt;
* Does not change authoritative HP, weapons, armor, routes or combat configuration. No automatic persistent database storage.&lt;br /&gt;
* Upper-initial alias SetNpcIdentity is also supported.&lt;br /&gt;
* Use default to explicitly restore the Nameless Hero identity. Preserves armor, skin-color and tattoo overrides. In 0.1.8 it does not replace the whole NPC outfit. From 0.1.9, the five supported female identities can show their full authored outfit without armor; see [[Female identities]]. Existing setNpcSkin remains a separate legacy preset.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;br /&gt;
[[Category:Appearance Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- female019:start --&amp;gt;&lt;br /&gt;
== Female presentation improved from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Improved from 0.1.9.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;setNpcIdentity(npcId, &amp;quot;syra&amp;quot;)&amp;lt;/code&amp;gt; selects a matching female identity for a resource-owned human NPC. The same correction covers &amp;lt;code&amp;gt;velaya&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;seraphia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chani&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;natalia&amp;lt;/code&amp;gt;. Without armor the matching identity shows its authored female outfit; with armor it retains the native armor and corrected head. Face expression remains neutral. See [[Female identities]] for examples and material limits. This improves the existing API, available since 0.1.5; it does not introduce a new NPC setter.&lt;br /&gt;
&amp;lt;!-- female019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcCombatConfig&amp;diff=1660</id>
		<title>SetNpcCombatConfig</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcCombatConfig&amp;diff=1660"/>
		<updated>2026-10-20T13:29:24Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNpcCombatConfig =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.5&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.5 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Updates NPC projectile combat configuration atomically.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
setNpcCombatConfig(npcId, settings)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || Server-assigned NPC ID returned by spawnNpc; not a player ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;settings&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || Partial configuration table; unknown fields and invalid values reject the whole change. See details below.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns true when accepted, false for a rejected request. Acceptance is not proof of a rendered animation, projectile release or hit.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNpcCombatConfig(npcId, {range=3, aimTimeMs=600, consumeMana=true})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only. Mutations require the NPC to belong to the calling resource; getters do not grant control.&lt;br /&gt;
* Introduced in 0.1.5. Use matching client/server versions; the meleeSkillTier extension below requires 0.1.7.&lt;br /&gt;
* Use matching updated client and server. See [[NPC scripting]] for lifecycle, defaults, combat examples and collision limitations.&lt;br /&gt;
* Fields: range (metres 1..40, default 15), dexterity (0..100000, default 10), skillTier (integer 0..2, default 0), aimTimeMs (integer 150..30000, default 600), cooldownMs (integer 360..60000, default 1000), consumeAmmo/consumeMana (booleans, default true). Spell range/cooldown still apply. Configuration changes interrupt pending preparation. Disabling consumption still requires sufficient initial resources.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- melee017:start --&amp;gt;&lt;br /&gt;
== NPC melee skill tiers (since 0.1.7) ==&lt;br /&gt;
The functions themselves remain available since 0.1.5. &#039;&#039;&#039;Only the additions below are new in 0.1.7&#039;&#039;&#039;; they require matching 0.1.7 client/server support.&lt;br /&gt;
&lt;br /&gt;
* [[setNpcCombatConfig]] accepts optional &amp;lt;code&amp;gt;meleeSkillTier&amp;lt;/code&amp;gt;: integer 0 (untrained, default), 1 (trained) or 2 (master). [[getNpcCombatConfig]] includes this field in its result table.&lt;br /&gt;
* &amp;lt;code&amp;gt;skillTier&amp;lt;/code&amp;gt; remains the separate ranged-combat tier. Changing the melee tier does not overwrite ranged settings. Omitted fields keep their existing values; invalid/unknown fields reject the entire change.&lt;br /&gt;
* This selects ordinary melee presentation/timing for the NPC&#039;s equipped family, not its weapon or damage. It does not enable combat, select a target or increase strength/damage. Existing resource ownership and combat controls still apply.&lt;br /&gt;
* A strike already admitted keeps its captured animation/impact deadline. A melee-only or unchanged update does not restart unrelated projectile preparation; changing ranged settings still affects that separate configuration.&lt;br /&gt;
* Use matching updated client/server support to see the new tier presentation, including observers and late join. Players continue using the existing [[setPlayerSkill]] API; no new setPlayerCombatStyle function was added.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- npcId is an existing NPC owned by this server resource.&lt;br /&gt;
local ok = setNpcCombatConfig(npcId, {meleeSkillTier=2})&lt;br /&gt;
if ok then&lt;br /&gt;
    local config = getNpcCombatConfig(npcId)&lt;br /&gt;
    if config then outputDebugString(&amp;quot;NPC melee tier: &amp;quot; .. config.meleeSkillTier) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- melee017:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- upcoming019:start --&amp;gt;&lt;br /&gt;
== Item-type armor bonuses (from 0.1.9) ==&lt;br /&gt;
[[Item type stats]] adds explicit armor bonusHealth/bonusMana/bonusStrength/bonusDexterity contributions for equipped scripted NPCs, plus the armor protection profile. Unconfigured native bonuses do not silently change existing NPC balance. Base stats and bonuses are separate; raising maxima does not heal/refill and lowering maxima clamps current values without reviving dead NPCs.&lt;br /&gt;
&lt;br /&gt;
setNpcMaxHealth/setNpcMaxMana set BASE maxima; getNpcMaxHealth/getNpcMaxMana return EFFECTIVE maxima. setNpcCombatConfig/getNpcCombatConfig dexterity is BASE dexterity. getNpcData adds baseMaxHealth, baseMaxMana, baseDexterity, mana, maxMana, dexterity, armorHealthBonus, armorManaBonus, armorStrengthBonus and armorDexterityBonus.&lt;br /&gt;
&lt;br /&gt;
NPC melee includes explicit armor strength and ranged combat uses effective dexterity. Numeric refresh preserves accepted attack/projectile snapshots; it does not reload ammo or restart prepared casts. NPC toughness and NPC jewelry are not implemented by this addition. These are extensions to existing APIs, not new names or a replacement for their earlier contracts.&lt;br /&gt;
&amp;lt;!-- upcoming019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcArmorUpgrades&amp;diff=1659</id>
		<title>SetNpcArmorUpgrades</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcArmorUpgrades&amp;diff=1659"/>
		<updated>2026-10-20T13:29:22Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNpcArmorUpgrades =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replaces all three selected armor-upgrade slots for a resource-owned NPC.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted = setNpcArmorUpgrades(npcId, parts)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || yes || Existing scripted human NPC ID: finite integer 1..4294967295, not a numeric string.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;parts&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || String keys top/mid/bottom only, with compatible part-key string values. Omitted slots, empty strings or none clear a slot. {} clears all parts.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Boolean: true when accepted; false for invalid arguments/selection, unavailable character, wrong family/slot, or failed ownership/requirements. Invalid selections are rejected before equipment mutation.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
-- NPC already wears mercenary and belongs to this resource.&lt;br /&gt;
local presets = getArmorUpgradePresets(&amp;quot;mercenary&amp;quot;)&lt;br /&gt;
if presets and presets.heavy_2 then&lt;br /&gt;
    assert(setNpcArmorUpgrades(npcId, presets.heavy_2))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only; available from 0.1.9.&lt;br /&gt;
* See [[Armor upgrades]], [[Armor catalog]] and [[Armor upgrade catalog]].&lt;br /&gt;
* Only the resource owning the NPC may change its parts. No player-inventory or player-requirement check is applied to NPCs.&lt;br /&gt;
* Uses the already equipped base; never selects a different base. The part must match its family and slot.&lt;br /&gt;
* true confirms server acceptance, not completed native rendering. No automatic healing/refill or database save.&lt;br /&gt;
* Treat remote requests as untrusted; authorize the action in your server resource.&lt;br /&gt;
* This is replacement, NOT a partial patch. Read the current table and modify one field to preserve the other slots. Values are keys, not item IDs; unknown table fields and non-string values reject the request.&lt;br /&gt;
* Equivalent alias: SetNpcArmorUpgrades.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcArmorPreset&amp;diff=1658</id>
		<title>SetNpcArmorPreset</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcArmorPreset&amp;diff=1658"/>
		<updated>2026-10-20T13:29:21Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNpcArmorPreset =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selects an authored armor preset for the currently equipped base.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted = setNpcArmorPreset(npcId, preset)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || yes || Existing scripted human NPC ID: finite integer 1..4294967295, not a numeric string.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;preset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || light_1, light_2, medium_1, medium_2, heavy_1, heavy_2, or none to clear selected parts.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Boolean: true when accepted; false for invalid/unavailable ID, unknown/inapplicable preset, or failed validation/ownership/requirements. none clears parts without removing the base.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
-- npcId is an existing human NPC created by this resource.&lt;br /&gt;
assert(setNpcArmor(npcId, &amp;quot;mercenary&amp;quot;))&lt;br /&gt;
assert(setNpcArmorPreset(npcId, &amp;quot;heavy_2&amp;quot;))&lt;br /&gt;
local parts = getNpcArmorUpgrades(npcId)&lt;br /&gt;
if parts then outputDebugString(parts.top) end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Server-side only; available from 0.1.9.&lt;br /&gt;
* See [[Armor upgrades]], [[Armor catalog]] and [[Armor upgrade catalog]].&lt;br /&gt;
* Only the resource owning the NPC may change its parts. No player-inventory or player-requirement check is applied to NPCs.&lt;br /&gt;
* Uses the already equipped base; never selects a different base. The part must match its family and slot.&lt;br /&gt;
* true confirms server acceptance, not completed native rendering. No automatic healing/refill or database save.&lt;br /&gt;
* Treat remote requests as untrusted; authorize the action in your server resource.&lt;br /&gt;
* Sparse families use only existing parts up to the requested tier, so different presets may select the same pieces. Query getArmorUpgradePresets first.&lt;br /&gt;
* Equivalent alias: SetNpcArmorPreset.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcArmor&amp;diff=1657</id>
		<title>SetNpcArmor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcArmor&amp;diff=1657"/>
		<updated>2026-10-20T13:29:19Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- This page is generated automatically from the function definition: setNpcArmor. --&amp;gt;&lt;br /&gt;
= setNpcArmor =&lt;br /&gt;
Changes the authoritative armor of a resource-owned scripted NPC.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setNpcArmor(int npcId, string itemKey)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;npcId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The server-assigned NPC identifier returned by &amp;lt;code&amp;gt;spawnNpc&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;getNpcs&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itemKey&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || A validated key returned by &amp;lt;code&amp;gt;getPlayerArmorNames&amp;lt;/code&amp;gt;; armor and weapon accept &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; to clear the slot.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the validated change is accepted and replicated; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Change an NPC&#039;s armor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNpcArmor(npcId, &amp;quot;none&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* The state is sent reliably to current viewers and replayed on relevance entry and late join.&lt;br /&gt;
* Raw Unreal object paths are never accepted from Lua.&lt;br /&gt;
* Use &amp;lt;code&amp;gt;getPlayerArmorNames&amp;lt;/code&amp;gt; to enumerate supported keys.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:World Functions]]&lt;br /&gt;
[[Category:NPC Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- npc-appearance015:start --&amp;gt;&lt;br /&gt;
== Appearance API since 0.1.5 ==&lt;br /&gt;
From 0.1.5 [[setNpcIdentity]], [[setNpcSkinColor]] and [[setNpcTattoo]] remain independent of armor. Changing or removing armor does not clear these values. Covered skin/tattoo regions naturally remain hidden by garments.&lt;br /&gt;
&amp;lt;!-- npc-appearance015:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- armor019:start --&amp;gt;&lt;br /&gt;
== Armor parts (from 0.1.9) ==&lt;br /&gt;
Available from 0.1.9. [[Armor catalog]] lists the 26 bases; [[Armor upgrade catalog]] lists all 84 pieces. This existing function/guide is not newly introduced in 0.1.9. The new [[Armor upgrades|upgrade system]] adds per-character top/mid/bottom selections, full presets and separate player/NPC setters. A different base clears the old parts; choosing the same base keeps compatible selections. Identity, skin tint and tattoos remain separate. See the guide for requirements, safe replacement and synchronization validation.&lt;br /&gt;
&amp;lt;!-- armor019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNativeHudComponentVisible&amp;diff=1656</id>
		<title>SetNativeHudComponentVisible</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNativeHudComponentVisible&amp;diff=1656"/>
		<updated>2026-10-20T13:29:17Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNativeHudComponentVisible =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.7&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This function is available in G1R:MP 0.1.7 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hide or release one native HUD group without removing the native UI root.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
requestId = setNativeHudComponentVisible(component, visible)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;component&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || bars, crosshair, interaction, hotbar, notifications, combat_markers, or all (case-sensitive). From 0.1.9: also crafting; all includes it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || yes || false hides the group; true releases this resource&#039;s restriction.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Positive numeric request ID if queued, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; if rejected. This is not an application acknowledgement. Unknown component keys return &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNativeHudComponentVisible(&amp;quot;bars&amp;quot;, false)&lt;br /&gt;
setNativeHudComponentVisible(&amp;quot;interaction&amp;quot;, false)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Client-side only; the original API exists since 0.1.7. Crafting extensions require 0.1.9; use matching updated client/server versions.&lt;br /&gt;
* See [[Native HUD and menus]] for asynchronous acknowledgements, resource ownership, input and restoration.&lt;br /&gt;
* A positive request ID means queued, not applied. Listen for [[onClientNativeUiResult]] and inspect [[getNativeUiState]].&lt;br /&gt;
* Register the handler before submitting. Rapid changes coalesce: track the latest request ID, not every intermediate ID.&lt;br /&gt;
* false restricts; true releases only the calling resource&#039;s restriction. Other resources remain respected.&lt;br /&gt;
* This does not change inventory data, player attributes or custom RmlUi documents. Native save/load cannot be re-enabled.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Client Functions]]&lt;br /&gt;
[[Category:GUI Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- crafting019:start --&amp;gt;&lt;br /&gt;
== Crafting presentation from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Native crafting UI]] documents the new crafting component, recipe/progress windows, preserved station entry/exit and prevention of invisible recipe starts. It is not a setNativeMenuEnabled key or a custom recipe API. getNativeUiState gains components.crafting, craftingReady, craftingGuardReady, craftingWidgets and craftingObserved; HUD bit 64 is appended, older bits unchanged. Existing resource ownership, asynchronous result handling and restoration still apply. Full station-by-station in-game qualification remains pending.&lt;br /&gt;
&amp;lt;!-- crafting019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetItemStatsBatch&amp;diff=1655</id>
		<title>SetItemStatsBatch</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetItemStatsBatch&amp;diff=1655"/>
		<updated>2026-10-20T13:29:14Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setItemStatsBatch =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9. See the scope and validation notes below.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Patches several item types in one validated transaction.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted, error, revision = setItemStatsBatch(items)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || Map of item keys to property/value tables, not an array of item records.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Three values: accepted (boolean), error (string; empty on success), revision (decimal string). Check accepted before using the revision. Success means server acceptance, not visual/client completion. A no-op may return the unchanged revision.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local ok, why = setItemStatsBatch({&lt;br /&gt;
    [&amp;quot;1h_sword_short_02&amp;quot;]={damage=60},&lt;br /&gt;
    mercenary={resistanceEdge=80},&lt;br /&gt;
    itfo_potion_mana_03={mana=31}&lt;br /&gt;
})&lt;br /&gt;
assert(ok, why)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available from G1R:MP 0.1.9. This documents the implemented API and its current limits. See [[Item type stats]] for scope and remaining in-game validation.&lt;br /&gt;
* Server-side only. Profiles affect every copy of the same type on this server, across dimensions; not individual item instances.&lt;br /&gt;
* Use matching supported client and server builds. Server acceptance and a client application report do not prove the native gameplay effect.&lt;br /&gt;
* Active overrides are owned per item type by the calling resource. Another resource cannot change that owned type. Resource stop removes its overrides.&lt;br /&gt;
* Validation is atomic for the submitted transaction. Unsupported fields, wrong families, invalid/non-finite values, duplicate item/property aliases or ownership conflicts reject it.&lt;br /&gt;
* A numeric 0 is an explicit value where allowed, not reset. Use resetItemStats to remove an override. Profiles are not automatically persisted.&lt;br /&gt;
* Do not expose this setter directly to untrusted remote events. See [[getItemStatDefinitions]] and [[Item stat properties]].&lt;br /&gt;
* This merges fields. Types/fields omitted from the batch retain their previous overrides; use replaceItemStatsProfile for full replacement.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:Experimental Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetItemStats&amp;diff=1654</id>
		<title>SetItemStats</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetItemStats&amp;diff=1654"/>
		<updated>2026-10-20T13:29:12Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setItemStats =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9. See the scope and validation notes below.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changes selected numeric properties of one item type.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted, error, revision = setItemStats(item, fields)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Known canonical item key or recognized alias; this is not an inventory-instance ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || Property-name to numeric value map. Omitted fields are preserved; check per-item support and ranges.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Three values: accepted (boolean), error (string; empty on success), revision (decimal string). Check accepted before using the revision. Success means server acceptance, not visual/client completion. A no-op may return the unchanged revision.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local ok, why = setItemStats(&amp;quot;mercenary&amp;quot;, {&lt;br /&gt;
    resistanceEdge=80, resistanceBlunt=60, resistancePoint=50,&lt;br /&gt;
    resistanceFire=30, bonusHealth=25&lt;br /&gt;
})&lt;br /&gt;
assert(ok, why)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available from G1R:MP 0.1.9. This documents the implemented API and its current limits. See [[Item type stats]] for scope and remaining in-game validation.&lt;br /&gt;
* Server-side only. Profiles affect every copy of the same type on this server, across dimensions; not individual item instances.&lt;br /&gt;
* Use matching supported client and server builds. Server acceptance and a client application report do not prove the native gameplay effect.&lt;br /&gt;
* Active overrides are owned per item type by the calling resource. Another resource cannot change that owned type. Resource stop removes its overrides.&lt;br /&gt;
* Validation is atomic for the submitted transaction. Unsupported fields, wrong families, invalid/non-finite values, duplicate item/property aliases or ownership conflicts reject it.&lt;br /&gt;
* A numeric 0 is an explicit value where allowed, not reset. Use resetItemStats to remove an override. Profiles are not automatically persisted.&lt;br /&gt;
* Do not expose this setter directly to untrusted remote events. See [[getItemStatDefinitions]] and [[Item stat properties]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:Experimental Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetDiscordApplicationId&amp;diff=1653</id>
		<title>SetDiscordApplicationId</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetDiscordApplicationId&amp;diff=1653"/>
		<updated>2026-10-20T13:29:11Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setDiscordApplicationId =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server-side only.&#039;&#039;&#039; Part of [[Discord Rich Presence]]. See [[Discord Presence configuration]] for the optional server-owner resource.&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local ok, reason = setDiscordApplicationId(&amp;quot;YOUR_PUBLIC_APPLICATION_ID&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
One public Discord Application ID as a decimal string, 17..20 digits, nonzero with no leading zero and within unsigned 64-bit range. Do not use a Lua number, guild/user ID, Client Secret or bot token. This setting belongs to the calling resource. It affects subsequent set/update calls; already queued profiles retain their previous ID until updated.&lt;br /&gt;
== Returns ==&lt;br /&gt;
Boolean success plus an empty string, or false plus application-id-must-be-a-decimal-string. Rejection preserves the previous configured ID.&lt;br /&gt;
== Examples, lifecycle and safety ==&lt;br /&gt;
See [[Discord Rich Presence]] for complete initialization, location/job updates, field removal, timestamps, counts, buttons and callback examples. Player launcher opt-in is off by default and cannot be overridden. No bot or token is needed; no Discord account identity is returned. Do not forward arbitrary client input to this server API.&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Server_configuration_limits&amp;diff=1652</id>
		<title>Server configuration limits</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Server_configuration_limits&amp;diff=1652"/>
		<updated>2026-10-20T13:29:10Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Server configuration 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;&#039;&#039;&#039;CURRENT IN UPDATE 0.1.3 — expanded-budget BUILD81 (2026-09-12).&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
All numeric ranges below are extracted from the production configuration parser, not guessed from a running server. Defaults are the compiled defaults; an explicit setting in your existing configuration overrides them. Invalid out-of-range values fail configuration loading instead of being silently clamped. Restart with the new server executable/configuration to apply changes. Do not overwrite your passwords, keys or other custom settings with a sample configuration.&lt;br /&gt;
&lt;br /&gt;
See [[Scripting limits]] for fixed API capacities and client limits. Server &amp;lt;code&amp;gt;[lua]&amp;lt;/code&amp;gt; settings do not propagate to the client VM.&lt;br /&gt;
&lt;br /&gt;
== Complete numeric configuration table ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Setting !! Compiled default !! Minimum !! Maximum !! Unit&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server.port&amp;lt;/code&amp;gt; || 7777 || 1 || 65535 || TCP/UDP port&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server.maxPlayers&amp;lt;/code&amp;gt; || 500 || 1 || 5000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server.tickrate&amp;lt;/code&amp;gt; || 30 || 1 || 240 || ticks/s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server.syncDistance&amp;lt;/code&amp;gt; || 15000 || 500 || 200000 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server.peerTimeoutMinimumMs&amp;lt;/code&amp;gt; || 20000 || 5000 || 60000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server.peerTimeoutMaximumMs&amp;lt;/code&amp;gt; || 40000 || 5000 || 120000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server.peerTimeoutLimit&amp;lt;/code&amp;gt; || 32 || 4 || 64 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;http.port&amp;lt;/code&amp;gt; || 7780 || 1 || 65535 || TCP/UDP port&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;http.workerThreads&amp;lt;/code&amp;gt; || 8 || 1 || 64 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;http.maxQueuedRequests&amp;lt;/code&amp;gt; || 1024 || 8 || 16384 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;http.requestsPerMinutePerIp&amp;lt;/code&amp;gt; || 1200 || 60 || 100000 || per minute&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;http.maxTrackedAddresses&amp;lt;/code&amp;gt; || 8192 || 256 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;http.readTimeoutMs&amp;lt;/code&amp;gt; || 5000 || 500 || 120000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;http.writeTimeoutMs&amp;lt;/code&amp;gt; || 30000 || 1000 || 600000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nameplates.maxPairs&amp;lt;/code&amp;gt; || 250000 || 1 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nameplates.maxPairsPerResource&amp;lt;/code&amp;gt; || 250000 || 1 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nameplates.mutationsPerSecond&amp;lt;/code&amp;gt; || 4096 || 1 || 250000 || per second&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nameplates.mutationBurst&amp;lt;/code&amp;gt; || 8192 || 1 || 250000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.port&amp;lt;/code&amp;gt; || 7778 || 1 || 65535 || TCP/UDP port&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.ticketTtlMs&amp;lt;/code&amp;gt; || 15000 || 1000 || 120000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.idleTimeoutMs&amp;lt;/code&amp;gt; || 5000 || 2000 || 120000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.heartbeatIntervalMs&amp;lt;/code&amp;gt; || 1000 || 250 || 10000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.maxFramesPerSecond&amp;lt;/code&amp;gt; || 55 || 10 || 200 || per second&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.maxBytesPerSecond&amp;lt;/code&amp;gt; || 65536 || 8192 || 1048576 || bytes/s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.maxPendingHandshakes&amp;lt;/code&amp;gt; || 128 || 1 || 4096 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.maxConnectionsPerIp&amp;lt;/code&amp;gt; || 32 || 1 || 1000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.maxTrackedAddresses&amp;lt;/code&amp;gt; || 16384 || 256 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.whisperRange&amp;lt;/code&amp;gt; || 500 || 50 || 200000 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.defaultRange&amp;lt;/code&amp;gt; || 1800 || 50 || 200000 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.shoutRange&amp;lt;/code&amp;gt; || 3500 || 50 || 200000 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;voice.maxRange&amp;lt;/code&amp;gt; || 10000 || 50 || 200000 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lua.memoryLimitMB&amp;lt;/code&amp;gt; || 1024 || 4 || 4096 || MiB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lua.instructionLimit&amp;lt;/code&amp;gt; || 10000000 || 10000 || 1000000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lua.timeoutMs&amp;lt;/code&amp;gt; || 5000 || 10 || 60000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lua.hookInstructionInterval&amp;lt;/code&amp;gt; || 10000 || 100 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;magic.projectileTickrate&amp;lt;/code&amp;gt; || 30 || 10 || 120 || ticks/s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;magic.maxCastsPerSecond&amp;lt;/code&amp;gt; || 6 || 1 || 30 || per second&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;magic.maxSnapshotAgeMs&amp;lt;/code&amp;gt; || 1000 || 100 || 10000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;magic.playerCapsuleRadius&amp;lt;/code&amp;gt; || 45 || 10 || 500 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;magic.playerCapsuleHalfHeight&amp;lt;/code&amp;gt; || 90 || 20 || 1000 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ranged.projectileTickrate&amp;lt;/code&amp;gt; || 30 || 10 || 120 || ticks/s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ranged.maxShotsPerSecond&amp;lt;/code&amp;gt; || 8 || 1 || 30 || per second&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ranged.maxSnapshotAgeMs&amp;lt;/code&amp;gt; || 1000 || 100 || 10000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ranged.developmentArrowCount&amp;lt;/code&amp;gt; || 0 || 0 || 65535 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ranged.developmentBoltCount&amp;lt;/code&amp;gt; || 0 || 0 || 65535 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ranged.playerCapsuleRadius&amp;lt;/code&amp;gt; || 45 || 10 || 500 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ranged.playerCapsuleHalfHeight&amp;lt;/code&amp;gt; || 90 || 20 || 1000 || cm (100 cm = 1 m)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rcon.port&amp;lt;/code&amp;gt; || 7781 || 1 || 65535 || TCP/UDP port&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rcon.timestampWindowSeconds&amp;lt;/code&amp;gt; || 30 || 5 || 300 || s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rcon.requestsPerMinute&amp;lt;/code&amp;gt; || 60 || 1 || 600 || per minute&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.handshakeTimeoutMs&amp;lt;/code&amp;gt; || 5000 || 1000 || 30000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.maxConnectionsPerIp&amp;lt;/code&amp;gt; || 32 || 1 || 1000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.maxPendingHandshakes&amp;lt;/code&amp;gt; || 128 || 1 || 2048 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.connectionAttemptsPerMinute&amp;lt;/code&amp;gt; || 120 || 1 || 100000 || per minute&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.preAuthPacketsPerSecond&amp;lt;/code&amp;gt; || 12 || 1 || 1000 || per second&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.authenticatedPacketsPerSecond&amp;lt;/code&amp;gt; || 240 || 30 || 10000 || per second&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.authenticatedBytesPerSecond&amp;lt;/code&amp;gt; || 524288 || 65536 || 67108864 || bytes/s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.invalidPacketsPerMinute&amp;lt;/code&amp;gt; || 16 || 1 || 10000 || per minute&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.temporaryBlockSeconds&amp;lt;/code&amp;gt; || 120 || 10 || 86400 || s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.maxTrackedAddresses&amp;lt;/code&amp;gt; || 16384 || 256 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.maxPacketBytes&amp;lt;/code&amp;gt; || 65536 || 16384 || 1048576 || bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.maxWaitingDataPerPeerBytes&amp;lt;/code&amp;gt; || 524288 || 65536 || 16777216 || bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world.day&amp;lt;/code&amp;gt; || 0 || 0 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world.hour&amp;lt;/code&amp;gt; || 8 || 0 || 23 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world.minute&amp;lt;/code&amp;gt; || 0 || 0 || 59 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world.minuteDurationMs&amp;lt;/code&amp;gt; || 1000 || 0 || 3600000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world.weatherTransitionMs&amp;lt;/code&amp;gt; || 3000 || 0 || 300000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;world.syncIntervalMs&amp;lt;/code&amp;gt; || 5000 || 500 || 60000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.workerThreads&amp;lt;/code&amp;gt; || 8 || 1 || 64 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.maxConnectionsPerResource&amp;lt;/code&amp;gt; || 16 || 1 || 128 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.maxPendingQueriesPerResource&amp;lt;/code&amp;gt; || 1024 || 1 || 100000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.maxQueryBytes&amp;lt;/code&amp;gt; || 4194304 || 1024 || 67108864 || bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.maxResultRows&amp;lt;/code&amp;gt; || 50000 || 1 || 1000000 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.maxResultBytes&amp;lt;/code&amp;gt; || 67108864 || 1024 || 536870912 || bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.connectTimeoutMs&amp;lt;/code&amp;gt; || 5000 || 100 || 120000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.readTimeoutMs&amp;lt;/code&amp;gt; || 15000 || 100 || 300000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.writeTimeoutMs&amp;lt;/code&amp;gt; || 15000 || 100 || 300000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;database.maxBlockingPollMs&amp;lt;/code&amp;gt; || 100 || 0 || 5000 || ms&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.passwordWorkerThreads&amp;lt;/code&amp;gt; || 4 || 1 || 8 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.passwordQueueCapacity&amp;lt;/code&amp;gt; || 1024 || 8 || 4096 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.passwordPendingPerResource&amp;lt;/code&amp;gt; || 256 || 1 || 512 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.passwordMemoryKiB&amp;lt;/code&amp;gt; || 65536 || 8192 || 1048576 || KiB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.passwordIterations&amp;lt;/code&amp;gt; || 3 || 1 || 10 || count / integer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;security.passwordParallelism&amp;lt;/code&amp;gt; || 1 || 1 || 4 || count / integer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Additional validation and units ==&lt;br /&gt;
* Peer timeout maximum must be at least the minimum. Voice idle timeout must be at least twice its heartbeat interval.&lt;br /&gt;
* Voice ranges must satisfy whisper &amp;lt;= default &amp;lt;= shout &amp;lt;= max. These configuration values and &amp;lt;code&amp;gt;server.syncDistance&amp;lt;/code&amp;gt; are &#039;&#039;&#039;centimetres&#039;&#039;&#039;, not the metre units used by camera, NPC route and 3D-text Lua functions.&lt;br /&gt;
* &amp;lt;code&amp;gt;world.minuteDurationMs=0&amp;lt;/code&amp;gt; pauses time. Day 0..1000000, hour 0..23 and minute 0..59 are separate limits.&lt;br /&gt;
* Enabled voice must use a different port from gameplay, resource HTTP and enabled RCON.&lt;br /&gt;
* At least one autostart resource and a nonempty navigation map filename are required. Navigation geometry settings are not exposed as numeric serverconf settings; see [[Scripting limits#Navigation]].&lt;br /&gt;
* Listing/name text: server name at most 96 UTF-8 bytes and 48 codepoints; description at most 320 bytes and 160 codepoints. Game mode is an ASCII token up to 24 bytes, region 12, version 24; at most 8 tags of 16 bytes each. Join password is at most 128 bytes.&lt;br /&gt;
* Production master-list heartbeat is fixed at 20 seconds and authorization maximum staleness at 300 seconds. These are not operator-adjustable Lua limits. Device identity verification remains mandatory.&lt;br /&gt;
* Rate controls are shared traffic budgets, not one independent allowance per Lua event. Increasing Lua storage does not disable anti-abuse controls.&lt;br /&gt;
&lt;br /&gt;
== Source audit ==&lt;br /&gt;
The numeric table above records the configuration/parser audit for 0.1.3 dated 2026-09-12; it is not a new complete configuration audit for 0.1.9. Later scoped additions are documented separately below and in their feature guides.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- weather019:start --&amp;gt;&lt;br /&gt;
== Extended weather configuration (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The world weather setting accepts the canonical names and aliases in [[Weather catalog]]. Weather transition remains 0..300000 milliseconds. Existing modes remain biome-dependent; explicit presets add snow, fog, dust and regional variations. See [[Weather]] for examples. This does not change current public-release configuration support.&lt;br /&gt;
&amp;lt;!-- weather019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- discord019:start --&amp;gt;&lt;br /&gt;
== Optional Discord presence (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Discord Presence configuration]] provides the complete server-only resource. Configure its public Application ID and presentation fields in config.lua, then append its name to your existing resources autostart list. No new [discord] INI section, bot token, Client Secret, Discord installation, Python or SDK is needed on either Windows or Linux dedicated servers. Players opt in separately in launcher Settings and rejoin. Keep existing gamemode/server settings; do not enable development QA commands publicly.&lt;br /&gt;
&amp;lt;!-- discord019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Scripting_limits&amp;diff=1651</id>
		<title>Scripting limits</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Scripting_limits&amp;diff=1651"/>
		<updated>2026-10-20T13:29:08Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&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;&#039;&#039;&#039;BASELINE: UPDATE 0.1.3 — expanded-budget BUILD81 (2026-09-12).&#039;&#039;&#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;
&#039;&#039;&#039;0.1.4 additions are explicitly marked below:&#039;&#039;&#039; [[os.time]] and resource-file/GUI security in BUILD126; static [[RmlUi images|WebP images]] in BUILD125; map-editor capacities in BUILD124. The current public release is 0.1.9 / BUILD264 / Protocol 42. Historical baseline values and version-specific additions are distinguished below.&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 &#039;&#039;&#039;fixed capacities&#039;&#039;&#039;, &#039;&#039;&#039;compiled defaults&#039;&#039;&#039; and &#039;&#039;&#039;operator-configurable bounds&#039;&#039;&#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;
&#039;&#039;&#039;Units:&#039;&#039;&#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; &#039;&#039;&#039;server sync-distance configuration and voice range use centimetres&#039;&#039;&#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 &#039;&#039;&#039;do not propagate to the client&#039;&#039;&#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;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;
=== Safe wall-clock time (since 0.1.4 BUILD126) ===&lt;br /&gt;
The &amp;lt;code&amp;gt;os&amp;lt;/code&amp;gt; table remains unavailable in 0.1.3. Since &#039;&#039;&#039;0.1.4 BUILD126&#039;&#039;&#039;, client and server resources receive a restricted table containing only [[os.time|os.time()]]. It returns Unix seconds from the local host clock and accepts no arguments (not even a date table or explicit nil). The full OS library is never opened: &amp;lt;code&amp;gt;os.execute&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;os.exit&amp;lt;/code&amp;gt;, filesystem operations, environment access and all other OS-library members remain unavailable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Seed once at resource startup, not before every draw.&lt;br /&gt;
math.randomseed(os.time())&lt;br /&gt;
local roll = math.random(1, 100)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This is ordinary, non-cryptographic randomness. Use [[getTickCount]] for elapsed time; wall-clock time can change and client clocks are not authoritative. See [[os.time]] for the complete contract.&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 &#039;&#039;&#039;10 ms&#039;&#039;&#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 &#039;&#039;&#039;32 callback arguments&#039;&#039;&#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 &#039;&#039;&#039;32&#039;&#039;&#039;; nested command execution has a depth limit of &#039;&#039;&#039;16&#039;&#039;&#039;. Command names are nonempty and at most &#039;&#039;&#039;64 bytes&#039;&#039;&#039;. &amp;lt;code&amp;gt;executeCommandHandler&amp;lt;/code&amp;gt; accepts at most &#039;&#039;&#039;32 arguments&#039;&#039;&#039; with at most &#039;&#039;&#039;2048 bytes&#039;&#039;&#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, &#039;&#039;&#039;not Lua tables, functions or userdata&#039;&#039;&#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;
&#039;&#039;&#039;A 1-MiB JSON document cannot be sent as one event string.&#039;&#039;&#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 &#039;&#039;&#039;512 bytes&#039;&#039;&#039;, with at most &#039;&#039;&#039;128 bytes per segment&#039;&#039;&#039;; file URLs are at most &#039;&#039;&#039;2048 bytes&#039;&#039;&#039;. Resource names used across the whole scripting/network stack should fit the stricter &#039;&#039;&#039;96-byte event-name envelope field&#039;&#039;&#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;
=== Download and GUI security (since 0.1.4 BUILD126) ===&lt;br /&gt;
These 0.1.4 changes enforce a shared file policy in the server manifest/catalog and client catalog/download path. They do not increase the size budgets above.&lt;br /&gt;
* Allowed extensions (case-insensitive): &amp;lt;code&amp;gt;.lua .json .xml .txt .csv .rml .html .rcss .css .png .webp .tga .jpg .jpeg .bmp .svg .ttf .otf .woff .woff2 .ogg .wav .mp3 .flac&amp;lt;/code&amp;gt;.&lt;br /&gt;
* This is a &#039;&#039;&#039;transport allowlist, not a decoder capability list&#039;&#039;&#039;. It does not enable JavaScript, arbitrary HTML-browser features, additional audio codecs or every listed image format. Existing Lua audio remains declared join-time Ogg; supported GUI image behaviour is documented in [[RmlUi images]].&lt;br /&gt;
* Executables and native modules such as &amp;lt;code&amp;gt;.exe .dll .asi .com .scr&amp;lt;/code&amp;gt;, installers, shell scripts and shortcuts are not allowed. Recognized native executable headers (MZ/PE, ELF and Mach-O) are rejected even when renamed to an allowed suffix; cached files are checked too. This is defence in depth, &#039;&#039;&#039;not an antivirus or a guarantee that arbitrary content is harmless&#039;&#039;&#039;. Historical cache files are not automatically erased.&lt;br /&gt;
* Relative path segments use ASCII letters/digits, spaces, &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;; empty/dot/traversal segments, absolute paths, backslashes, alternate data streams, Windows reserved device names and trailing dots/spaces are rejected. Case-insensitive catalog collisions are rejected. The 512-byte path and 128-byte segment limits remain.&lt;br /&gt;
* The catalog&#039;s canonical SHA-256 must match the revision obtained from the official HTTPS server listing. Launcher/supervisor and client runtime enforce this pin before accepting resource payloads. An absent or stale listing is rejected, not replaced with an untrusted HTTP fallback. After changing resources, allow the official listing to refresh before rejoining. HTTP asset transfer remains unencrypted: integrity verification is not confidentiality.&lt;br /&gt;
* RmlUi reads verified, declared GUI assets owned by the requesting resource. Arbitrary local files, other resources, scripts and undeclared files are not available through GUI references. Resource file size/hash and final resolved paths are checked, including rejection of reparse/junction redirection. The host&#039;s explicitly approved system-font fallback is separate from resource access.&lt;br /&gt;
See [[Update 0.1.4]]; use the updated server and complete client/launcher package for these protections. The complete public 0.1.4 release uses Protocol 36; update both client and server.&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 &#039;&#039;&#039;1 MiB&#039;&#039;&#039;, nesting depth &#039;&#039;&#039;64&#039;&#039;&#039; and &#039;&#039;&#039;65536 cumulative entries&#039;&#039;&#039; across the document (previously 32 KiB / 16 / 2048). Object keys remain at most &#039;&#039;&#039;256 bytes&#039;&#039;&#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 &#039;&#039;&#039;90001&#039;&#039;&#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 &#039;&#039;&#039;256 bytes&#039;&#039;&#039;; encoded hashes at most &#039;&#039;&#039;512 bytes&#039;&#039;&#039;. Default Argon2id parameters remain &#039;&#039;&#039;65536 KiB memory, 3 iterations, parallelism 1&#039;&#039;&#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 the 0.1.3 capacity update. Separately, 0.1.4 adds explicit opt-in recovery; see [[MySQL connection recovery]].&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 &#039;&#039;&#039;not&#039;&#039;&#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&#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 &#039;&#039;&#039;16384 blockers globally / 4096 per owner&#039;&#039;&#039; (previously 4096 / 1024). The internal settings validator permits global capacity up to &#039;&#039;&#039;65536&#039;&#039;&#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 catalog: 27 original aliases, 118 from 0.1.4, and 962 from 0.1.9 (844 additions). See [[Player animation catalog]] and [[Activity animation catalog]]. The blend argument range remains 0..2 seconds, default 0.15. Catalog keys are not raw asset paths; catalog size is not a simultaneous-animation capacity guarantee.&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. &#039;&#039;&#039;There is no 100-metre distance-from-player restriction.&#039;&#039;&#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: &#039;&#039;&#039;128 sound handles per resource / 512 globally&#039;&#039;&#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&#039;s stricter relative-path bounds.&lt;br /&gt;
* UI texture files: at most &#039;&#039;&#039;256 MiB&#039;&#039;&#039; encoded (previously 64 MiB); decoded width and height remain at most &#039;&#039;&#039;8192 pixels each&#039;&#039;&#039;. This is not a VRAM allocation guarantee.&lt;br /&gt;
* &#039;&#039;&#039;Since 0.1.4 BUILD125:&#039;&#039;&#039; static lossy/lossless WebP with alpha works in RML images and RCSS image decorators; PNG support is retained. Animated WebP is rejected. No new Lua image function is required. See [[RmlUi images]] for manifest/RML examples and format restrictions. BUILD126 also hardens uncompressed 24/32-bit TGA validation and resource GUI reads.&lt;br /&gt;
* UI attribute name: 1..64 bytes with safe-name validation; attribute value at most &#039;&#039;&#039;16384 bytes&#039;&#039;&#039; (previously 4096). Event-handler attribute injection remains prohibited.&lt;br /&gt;
* GUI append-text retains at most &#039;&#039;&#039;1000 child lines&#039;&#039;&#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;
&#039;&#039;&#039;Voice range values use centimetres&#039;&#039;&#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;
== Validation and practical use ==&lt;br /&gt;
Focused follow-up: &#039;&#039;&#039;2026-09-20&#039;&#039;&#039;, development &#039;&#039;&#039;0.1.4 BUILD125/126&#039;&#039;&#039;, protocol &#039;&#039;&#039;35&#039;&#039;&#039;: WebP, restricted [[os.time]], resource file policy and GUI loading. This is not a new audit of every historical numeric limit below. Earlier audit baseline follows.&lt;br /&gt;
&lt;br /&gt;
Audit date: &#039;&#039;&#039;2026-09-12&#039;&#039;&#039;; expanded-budget &#039;&#039;&#039;0.1.3 BUILD81&#039;&#039;&#039;, protocol &#039;&#039;&#039;34&#039;&#039;&#039;. Changes increase capacities, not packet layouts.&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;br /&gt;
&lt;br /&gt;
&amp;lt;!-- map-editor014:start --&amp;gt;&lt;br /&gt;
== Map editor and world objects (since 0.1.4) ==&lt;br /&gt;
* BUILD124 and updated scripts remove the fixed editor/legacy/map_scene object-count caps. Remaining document bounds: 1000000-byte transfers, shared JSON codec 1 MiB and 65536 entries (including nested fields); 200 undo commands; map names up to 48 ASCII letters/digits/_/-.&lt;br /&gt;
* WorldObjects since BUILD124: no fixed instance-count, pending-request-count or requests/second cap (former 512/32/80 removed). Still 16 owning resources, command JSON up to 4096 bytes and a 10-second result timeout. Shared IPC queues remain bounded at 256 frames each: check rejection and pace submissions. Memory/CPU/GPU limits still apply; the scene loader remains sequential.&lt;br /&gt;
* Coordinates +/-100000 metres; rotations +/-36000 degrees; scale 0.01-100 per axis; ray length up to 1000 m; object IDs up to 64 characters and asset paths up to 512.&lt;br /&gt;
* Resource storage: 1 MiB/file and 64-character keys. Pre-write admission rejects an existing directory over 64 MiB or over 512 regular files (including backups); these are not post-write hard quotas.&lt;br /&gt;
See [[Map editor]], [[World objects]], [[Resource data storage]]. Other limits documented on this page remain unchanged unless explicitly marked otherwise.&lt;br /&gt;
&amp;lt;!-- map-editor014:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- npc015:start --&amp;gt;&lt;br /&gt;
== NPC control API since 0.1.5 ==&lt;br /&gt;
See [[NPC scripting]] for the new functions. Health/damage/mana: 0..100000 (maxHP at least 1); ammo: integer 0..65535; perception: distance &amp;gt;0..1000 metres, FOV &amp;gt;0..360 degrees; projectile range 1..40 m; aim 150..30000 ms; cooldown 360..60000 ms; skillTier 0..2; animation blend-out 0..2 s. Combat walk 0.1..2.5 m/s, run 2.6..8 m/s; chase is independently configurable. These validations do not replace earlier server resource/capacity limits. Defaults and lifecycle caveats are documented on the linked function pages.&lt;br /&gt;
&amp;lt;!-- npc015:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- npc-appearance015:start --&amp;gt;&lt;br /&gt;
== NPC appearance validation since 0.1.5 ==&lt;br /&gt;
RGB: integer sRGB channels 0..255. Identity/tattoo keys: at most 48 bytes, ASCII case-insensitive closed catalogs; no arbitrary asset paths. IDs must identify a live server NPC record and mutation requires its owning resource. See [[NPC scripting#NPC appearance since 0.1.5]].&lt;br /&gt;
&amp;lt;!-- npc-appearance015:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- area016:start --&amp;gt;&lt;br /&gt;
== Area notifications (since 0.1.6) ==&lt;br /&gt;
Server-side [[ShowAreaNotification]] / [[HideAreaNotification]] and lower-camel aliases. Available since 0.1.6.&lt;br /&gt;
* Connected numeric player ID: finite integer 1..4294967295.&lt;br /&gt;
* Heading: 0..256 UTF-8 bytes; title: 1..512 UTF-8 bytes. Literal text only; malformed UTF-8, NUL, controls and line breaks are rejected.&lt;br /&gt;
* Duration: finite integer 1000..30000 ms, default 5000 ms; includes fades. Omit the optional argument rather than passing nil.&lt;br /&gt;
* One custom banner per player; latest show replaces the previous owner/timer. At most 8192 distinct tracked player IDs per resource; explicit hide/resource cleanup releases tracking.&lt;br /&gt;
* Native pending queue: 32 commands; excess commands may be discarded. Three bounded creation attempts, 500 ms apart. Server acceptance is not a visual acknowledgement.&lt;br /&gt;
See [[Area notifications]] for cleanup, per-resource ownership, Unicode and the separate automatic discovery-banner suppression. Other limits are unchanged by this addition.&lt;br /&gt;
&amp;lt;!-- area016:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- mount016:start --&amp;gt;&lt;br /&gt;
== Mounts (since 0.1.6) ==&lt;br /&gt;
Server-side [[createPlayerMount]] and [[destroyPlayerMount]]; available since 0.1.6. See [[Mounts]] for ownership, native eligibility and verification status.&lt;br /&gt;
* One active mount per player. No separate global mount-count cap in this subsystem; ordinary player/resource limits still apply.&lt;br /&gt;
* No fixed ride lifetime or two-minute age-based despawn. Disconnect, resource stop, ineligibility and explicit removal still clean up the session.&lt;br /&gt;
* Initial server observation readiness: 15 seconds; an established session is revoked after more than 20 seconds without accepted observations. These are health timeouts, not maximum riding duration.&lt;br /&gt;
* Native spawn requests have a 10-second cooldown and bounded readiness checks. Avoid repeated creation/removal loops; return values acknowledge requests, not native completion.&lt;br /&gt;
* Initial boarding/incomplete native transitions use a 6000 ms recovery grace. A lost previously confirmed seat outside a native transition uses a 500 ms debounce. A transition grace is latched for its continuous unhealthy episode; repeated phase reports do not renew it. Healthy riding has no recovery timer running.&lt;br /&gt;
* Snapshot observation is approximately 10 Hz. Server ownership/sequence/finite-value, movement and collision-registry validation remain enforced. This is not full native-world collision replication.&lt;br /&gt;
* Petting observations are bounded to 4 metres, idle gait and at most 8 seconds of montage position; native eligibility still applies. Petting availability needs final in-game confirmation.&lt;br /&gt;
* Ownership is tied to the creating resource and current connection player ID; no database persistence or ownership-transfer API.&lt;br /&gt;
The server/client safety bounds above are separate from the existing nameplate range and do not increase it.&lt;br /&gt;
&amp;lt;!-- mount016:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- game-audio017:start --&amp;gt;&lt;br /&gt;
== Game audio (since 0.1.7) ==&lt;br /&gt;
&#039;&#039;&#039;Available since update 0.1.7.&#039;&#039;&#039; These limits apply to [[Game audio]], not existing resource-file audio or voice chat.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item !! Limit / behavior&lt;br /&gt;
|-&lt;br /&gt;
| Sound key || Exact entry in the built-in catalog. No arbitrary files, URLs or native audio paths.&lt;br /&gt;
|-&lt;br /&gt;
| Volume || Finite number 0..1; default 1.&lt;br /&gt;
|-&lt;br /&gt;
| Coordinates || Each axis -200000..200000 metres; finite numbers only.&lt;br /&gt;
|-&lt;br /&gt;
| Attenuation || minDistance &amp;gt;= 0; maxDistance &amp;gt;= 0.01; minDistance &amp;lt; maxDistance &amp;lt;= 200000 metres. Defaults 1 and 30.&lt;br /&gt;
|-&lt;br /&gt;
| Options || Only volume, minDistance and maxDistance. Unknown keys are rejected.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog search || Query at most 160 bytes; categories empty, sfx, music or dialogue.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog pagination || Zero-based nonnegative integer offset; integer limit 1..200, default 50.&lt;br /&gt;
|-&lt;br /&gt;
| Active sounds || 128 per client, shared across resources, including pending/starting playbacks.&lt;br /&gt;
|-&lt;br /&gt;
| Audio resource owners || 16 per client. Resource/lifecycle cleanup releases ownership; stopping the last sound alone does not release the owner or its cache.&lt;br /&gt;
|-&lt;br /&gt;
| Prepared native cache || 64 entries per owner. Dialogue 2D and 3D variants use separate entries. Cache is released by resource/lifecycle cleanup, not by stopping one sound.&lt;br /&gt;
|-&lt;br /&gt;
| Pending requests / native work queue || 256 each per client. Rejected work must not be retried in a tight loop.&lt;br /&gt;
|-&lt;br /&gt;
| Retained sound records || Up to 512 across resources; older terminal records are evicted as new handles are created.&lt;br /&gt;
|-&lt;br /&gt;
| Loading timeout || 12 seconds for queued native preparation; 15 seconds for runtime request completion. A timed-out play request is cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| Owner heartbeat || Once per second, with a 5-second native lease. Expiry cleans up owned audio.&lt;br /&gt;
|-&lt;br /&gt;
| Playback-state observation || Approximately every 50 ms while the game is ticking; not a real-time timing guarantee.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Handles/request IDs are positive runtime-assigned numbers, not engine pointers or persistent IDs. Playback and controls are asynchronous. [[onClientGameSoundResult]] supplies results; [[getGameSoundState]] supplies the latest accumulated state, not a guaranteed full property snapshot.&lt;br /&gt;
&lt;br /&gt;
Voice preload is reported as requested, with &amp;lt;code&amp;gt;voicePreloadConfirmed=false&amp;lt;/code&amp;gt;; loaded event samples and a resolved recording do not independently confirm voice PCM loading. There is no automatic broadcast, late-join replay or precise cross-client audio clock. Cold loading is paced but is not guaranteed hitch-free.&lt;br /&gt;
&amp;lt;!-- game-audio017:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- tts017:start --&amp;gt;&lt;br /&gt;
== Server TTS (since 0.1.7) ==&lt;br /&gt;
&#039;&#039;&#039;Available since 0.1.7.&#039;&#039;&#039; See [[Server TTS]], [[TTS configuration]] and [[TTS voices]]. TTS is default-off and starts no Python/models when disabled.&lt;br /&gt;
* Text: 4000 Unicode characters and 12000 UTF-8 bytes. Output: at most 180 seconds and 8 MiB per clip.&lt;br /&gt;
* Private reference audio: WAV/OGG/FLAC, 1–30 seconds, 1–2 channels, 8–96 kHz, at most 8 MiB; relative ASCII path and lowercase SHA-256 required. Ukrainian requires a reference. No client uploads, URLs or arbitrary checkpoints.&lt;br /&gt;
* Default pending queue: 128 globally, 16 per resource (configurable); at most 2048 retained job handles. Release completed handles; this does not delete recordings.&lt;br /&gt;
* Per resource: up to 256 voices and 256 presets. Profile/named-recording identifiers: 1–64 ASCII letters/digits/underscores/hyphens.&lt;br /&gt;
* Active playback/preload handles: 128 server-side; 32 client-side. Recipient list at most 5000 entries, connected IDs only. Empty recipients reject the request.&lt;br /&gt;
* Playback volume 0..1. Spatial distances: 0.1 &amp;lt;= min &amp;lt;= max &amp;lt;= 1000 metres, defaults 1 and 30. Position is {x,y,z} metres with finite absolute components &amp;lt;= 1000000.&lt;br /&gt;
* Readiness deadline: 500..30000 ms, default 10000. A ready listener is required; slow clients do not block everyone indefinitely. Common start is normally scheduled 500 ms ahead.&lt;br /&gt;
* Default compressed server memory cache 256 MiB; persistent disk budget 2048 MiB; client decoded cache 256 MiB. These are not inference-model RAM limits.&lt;br /&gt;
* Persistent client download cache: 512 MiB / 8192 files, LRU. Deletion, eviction, corruption or unwritable storage can require another download; fresh session signatures remain mandatory.&lt;br /&gt;
* A stable saveAs name cannot silently overwrite different audio. Server disk exhaustion/corruption is an explicit error; stored recordings are not automatically erased to satisfy a new request.&lt;br /&gt;
* Generation is asynchronous but still consumes host CPU/RAM when used. Pre-render frequent dialogue and enforce permissions/quotas on player-driven requests.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- tts017:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- native-ui017:start --&amp;gt;&lt;br /&gt;
== Native HUD and menus (since 0.1.7) ==&lt;br /&gt;
* Client-side, resource-owned policy; 6 original HUD groups and 4 native menus. From 0.1.9, crafting becomes a seventh HUD group; the menu count stays four. Exact keys and bit masks: [[Native HUD and menus]] / [[getNativeUiState]].&lt;br /&gt;
* Up to 256 owner records per client session, including released records retained for safe ordering. Excess new owners can be rejected; reset is not a way to allocate unlimited new owner identities.&lt;br /&gt;
* Mutators return a positive request ID or false. Consecutive requests can coalesce into the latest complete policy; intermediate IDs are not guaranteed individual acknowledgements.&lt;br /&gt;
* Acknowledged native state is fresh for less than 6000 ms while connected. Unrenewed policies expire after 6000 ms; ordinary heartbeats renew them every 1000 ms.&lt;br /&gt;
* Native result JSON is bounded to 8192 bytes. Read the returned table or decode the result string; do not infer success merely from pending=false.&lt;br /&gt;
* false adds a restriction; true/reset releases only the caller&#039;s restriction. Stopping a resource releases ownership. Native quicksave/quickload and pause save/load restrictions cannot be re-enabled by Lua.&lt;br /&gt;
See [[onClientNativeUiResult]] and [[Native HUD and menus]] for the public contract.&lt;br /&gt;
&amp;lt;!-- native-ui017:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- dimensions018:start --&amp;gt;&lt;br /&gt;
== Character dimensions (since 0.1.8) ==&lt;br /&gt;
* Server-controlled integer dimension numbers: 0..2147483647. Default 0. Invalid/fractional/non-finite/string values fail.&lt;br /&gt;
* No independent dimension-creation pool: entity/player capacity and existing streaming distances still apply.&lt;br /&gt;
* NPC/monster setters require the owning resource. Player dimensions are gamemode-managed and are not automatically restored when the resource stops.&lt;br /&gt;
* One player transition at a time. Pending transitions/position changes, active interactions/climbing and owned mount leases can reject a change. An unchanged dimension is a no-op success.&lt;br /&gt;
* [[spawnNpc]] / [[spawnMonster]] accept &amp;lt;code&amp;gt;options.dimension&amp;lt;/code&amp;gt;. Omission preserves dimension 0; normal spawn validation still applies.&lt;br /&gt;
* This isolates characters, combat and proximity voice, not world items, doors/gates, static/custom blockers, global events or arbitrary script audio. See [[Character dimensions]] for exact scope and examples.&lt;br /&gt;
* Requires matching 0.1.8 / Protocol 40 peers.&lt;br /&gt;
&amp;lt;!-- dimensions018:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- upcoming019:start --&amp;gt;&lt;br /&gt;
== Item profiles and interactive editor objects (from 0.1.9) ==&lt;br /&gt;
Available from 0.1.9.&lt;br /&gt;
* [[Item type stats]] affects every copy of one known item type across this server, not per-instance/per-dimension variants. Item types are resource-owned while overridden. No arbitrary engine field writes or new item definitions.&lt;br /&gt;
* [[getItemStatDefinitions]] supplies exact finite-number ranges, integer rules and per-item support. See [[Item stat properties]]. Invalid/unsupported inputs and ownership conflicts reject the transaction. Resource stop resets owned overrides; persistence is explicit.&lt;br /&gt;
* Joining clients need support for active profiles. A setter/report is not proof of completed native gameplay. Revisions are strings; missing defaults are not zero.&lt;br /&gt;
* [[Interactive map objects]] provides 94 editor prefabs: 18 seats, 48 lights, seven doors and 21 ladder sizes. Test native remains local; shared placed-door deployment is separate. One native test at a time; position/yaw only, original scale/collision. Seat cleanup waits for release/exit and 1-metre clearance.&lt;br /&gt;
* The updated map_scene loader accepts formats 1/2/3 for supported static objects, server-owned doors and original-world removals. Shared seats/lights/placed ladders are still unsupported; these categories are rejected, not silently made static. Original NPC obstacle data is unchanged.&lt;br /&gt;
&amp;lt;!-- upcoming019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- armor019:start --&amp;gt;&lt;br /&gt;
== Armor-upgrade API (from 0.1.9) ==&lt;br /&gt;
Available from 0.1.9. See [[Armor upgrades]] and the complete [[Armor catalog]] / [[Armor upgrade catalog]].&lt;br /&gt;
* Server-side, known keys only: 26 bases, 84 parts, three slots top/mid/bottom. The part setter replaces all three slots; omitted slots clear. Empty strings or none clear a slot; {} clears all parts.&lt;br /&gt;
* Exact lowercase base keys and preset names. Part values are recognized catalog strings (maximum 64 bytes); non-string values/unknown fields reject the request. Character IDs must be finite integer numbers 1..4294967295. Player/NPC getters take one argument; setters take exactly two.&lt;br /&gt;
* Players need owned base/parts and must meet server requirements. NPC mutation requires the owning resource. Setters never grant items, equip a different base, raise attributes or heal/refill.&lt;br /&gt;
* Six tier presets choose only existing compatible parts; none clears. A known base without upgrades returns empty catalog/preset tables, not fabricated pieces.&lt;br /&gt;
* Selection is per character; [[Item type stats|numeric type profiles]] are server-wide. Persistence in custom gamemodes is explicit. Existing dimension/visibility rules remain.&lt;br /&gt;
&amp;lt;!-- armor019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- female019:start --&amp;gt;&lt;br /&gt;
== Female identity presentation (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Improved from 0.1.9.&#039;&#039;&#039;&lt;br /&gt;
* Supported keys for the correction: &amp;lt;code&amp;gt;syra&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;velaya&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;seraphia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chani&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;natalia&amp;lt;/code&amp;gt;; existing catalog and permission checks remain.&lt;br /&gt;
* Full authored female outfit requires matching identity body/head selections and no equipped armor. Separate head selection does not replace a separately selected body.&lt;br /&gt;
* Armor retains its native shape and protection; no automatically generated female armor variants.&lt;br /&gt;
* Neutral facial expression only; this does not introduce facial animation or lip synchronization. Skin/tattoo display remains limited to supported exposed material regions.&lt;br /&gt;
* Existing server-side setters and authoritative state are reused. Success means acceptance, not completed rendering. All viewing clients need the update. See [[Female identities]].&lt;br /&gt;
&amp;lt;!-- female019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- activities019:start --&amp;gt;&lt;br /&gt;
== Activity animation scope (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; Both the server and observing clients need the matching update.&lt;br /&gt;
* Existing player/NPC start/stop APIs and validation remain. Aliases must be in the running server&#039;s catalog; arbitrary asset paths are not accepted.&lt;br /&gt;
* Looping remains explicit: omitted looped means false. Use the mode returned by [[getPlayerAnimationInfo]] when appropriate.&lt;br /&gt;
* Cosmetic rods/tools do not grant items or rewards; furniture/workstation placement and gameplay checks remain the gamemode&#039;s responsibility.&lt;br /&gt;
* First-use loading can occur. Server acceptance is not client-render confirmation, and catalog qualification is not a live acknowledgement. See [[Activity animations]] for visual-test status and boundaries.&lt;br /&gt;
&amp;lt;!-- activities019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- customkeys019:start --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Custom keys and placed doors ==&lt;br /&gt;
See [[Custom keys#Limits, restart and qualification|complete limits]]. Keys: 64 distinct types/resource, 256/process including inactive registrations; immutable recipes, approved donor only. Doors: 1024/resource, 4096 total, six placement fields and original native scale. Deferred notifications: 4096 queued, 64/tick; one key-denial notification/player/second. Resource stop drops its queued events. No automatic database persistence or arbitrary custom weapon/armor definitions.&lt;br /&gt;
&amp;lt;!-- customkeys019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- complete019:start --&amp;gt;&lt;br /&gt;
== Weather, crafting and original-world editing from 0.1.9 ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
* [[Weather]] exposes a closed 43-name catalog, not arbitrary particle/asset paths. Transition range remains 0..300000 ms, default 3000. Weather is global server state, not per-player/dimension. Render/ACK limitations remain explicit.&lt;br /&gt;
* [[Native crafting UI]] is a seventh HUD component, not a fifth management menu, recipe executor or server authorization system. Existing resource ownership/expiry and async result contracts apply.&lt;br /&gt;
* [[Interactive map objects]] exposes 94 editor prefabs with original scale/collision and yaw rotation. Only the seven doors have shared placed-interaction authority; seats/lights/ladders remain local tests.&lt;br /&gt;
* [[World model removal]] retains command-size, owner, catalog, exact-identity and protected-object guards. It does not alter terrain, baked HLOD or NPC navigation data. Group changes and first loading can hitch; bounded work is not a zero-cost promise.&lt;br /&gt;
* Editor live application replaces its whole saved removal/door set, not a merge or arbitrary client request. Map formats 1/2/3 require the matching supplied loaders. In-game verification is still needed for each deployed scene.&lt;br /&gt;
&amp;lt;!-- complete019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- discord019:start --&amp;gt;&lt;br /&gt;
== Discord Rich Presence (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated clients and server.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
One owning resource/profile per player; 15-second latest-value coalescing and reconnect spacing, 45-second client lease fallback. Text/asset keys at most 128 bytes; button labels 32 bytes, HTTPS URLs 512 bytes, at most two links. Unix timestamp seconds 0..4102444800; displayed counts 0..1000000 with size &amp;lt;= max and paired party fields. Application ID is a 17..20-digit unsigned-64 decimal string, never a Lua number. [[Discord Rich Presence#Profile fields|Complete fields, validation and lifecycle]]. Local opt-in cannot be overridden; reports cannot authorize gameplay.&lt;br /&gt;
&amp;lt;!-- discord019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ResetItemStats&amp;diff=1650</id>
		<title>ResetItemStats</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ResetItemStats&amp;diff=1650"/>
		<updated>2026-10-20T13:29:07Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= resetItemStats =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9. See the scope and validation notes below.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Removes one property override or all overrides of one item type owned by this resource.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted, error, revision = resetItemStats(item [, property])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Known canonical item key or recognized alias; this is not an inventory-instance ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;property&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || no || Exact property name to reset. Omit to reset the whole type.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Three values: accepted (boolean), error (string; empty on success), revision (decimal string). Check accepted before using the revision. Success means server acceptance, not visual/client completion. A no-op may return the unchanged revision.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local ok, why = resetItemStats(&amp;quot;mercenary&amp;quot;, &amp;quot;resistanceEdge&amp;quot;)&lt;br /&gt;
assert(ok, why)&lt;br /&gt;
-- To reset every override of this armor instead:&lt;br /&gt;
-- local ok, why = resetItemStats(&amp;quot;mercenary&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available from G1R:MP 0.1.9. This documents the implemented API and its current limits. See [[Item type stats]] for scope and remaining in-game validation.&lt;br /&gt;
* Server-side only. Profiles affect every copy of the same type on this server, across dimensions; not individual item instances.&lt;br /&gt;
* Use matching supported client and server builds. Server acceptance and a client application report do not prove the native gameplay effect.&lt;br /&gt;
* Active overrides are owned per item type by the calling resource. Another resource cannot change that owned type. Resource stop removes its overrides.&lt;br /&gt;
* Validation is atomic for the submitted transaction. Unsupported fields, wrong families, invalid/non-finite values, duplicate item/property aliases or ownership conflicts reject it.&lt;br /&gt;
* A numeric 0 is an explicit value where allowed, not reset. Use resetItemStats to remove an override. Profiles are not automatically persisted.&lt;br /&gt;
* Do not expose this setter directly to untrusted remote events. See [[getItemStatDefinitions]] and [[Item stat properties]].&lt;br /&gt;
* Restores the multiplayer baseline for server-controlled values and the captured originals for applicable native edits. It does not heal, revive or erase equipment.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:Experimental Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ReplaceItemStatsProfile&amp;diff=1649</id>
		<title>ReplaceItemStatsProfile</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ReplaceItemStatsProfile&amp;diff=1649"/>
		<updated>2026-10-20T13:29:05Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= replaceItemStatsProfile =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.9&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;Available from 0.1.9. See the scope and validation notes below.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replaces the complete item profile owned by this resource.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
accepted, error, revision = replaceItemStatsProfile(profile)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || Map of item keys to property/value tables, such as getItemStatsProfile() returns.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Three values: accepted (boolean), error (string; empty on success), revision (decimal string). Check accepted before using the revision. Success means server acceptance, not visual/client completion. A no-op may return the unchanged revision.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local saved = readResourceData(&amp;quot;item_balance&amp;quot;)&lt;br /&gt;
if saved then&lt;br /&gt;
    local profile = fromJSON(saved)&lt;br /&gt;
    assert(type(profile) == &amp;quot;table&amp;quot;, &amp;quot;Invalid item profile&amp;quot;)&lt;br /&gt;
    local ok, why = replaceItemStatsProfile(profile)&lt;br /&gt;
    assert(ok, why)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available from G1R:MP 0.1.9. This documents the implemented API and its current limits. See [[Item type stats]] for scope and remaining in-game validation.&lt;br /&gt;
* Server-side only. Profiles affect every copy of the same type on this server, across dimensions; not individual item instances.&lt;br /&gt;
* Use matching supported client and server builds. Server acceptance and a client application report do not prove the native gameplay effect.&lt;br /&gt;
* Active overrides are owned per item type by the calling resource. Another resource cannot change that owned type. Resource stop removes its overrides.&lt;br /&gt;
* Validation is atomic for the submitted transaction. Unsupported fields, wrong families, invalid/non-finite values, duplicate item/property aliases or ownership conflicts reject it.&lt;br /&gt;
* A numeric 0 is an explicit value where allowed, not reset. Use resetItemStats to remove an override. Profiles are not automatically persisted.&lt;br /&gt;
* Do not expose this setter directly to untrusted remote events. See [[getItemStatDefinitions]] and [[Item stat properties]].&lt;br /&gt;
* Omitted old fields/types owned by this resource are reset in the same transaction as new values. Other resources are untouched. An empty table resets all of your resource&#039;s overrides.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;br /&gt;
[[Category:Equipment Functions]]&lt;br /&gt;
[[Category:Experimental Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=RemovePlayerItem&amp;diff=1648</id>
		<title>RemovePlayerItem</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=RemovePlayerItem&amp;diff=1648"/>
		<updated>2026-10-20T13:29:04Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- This page is generated automatically from the function definition: removePlayerItem. --&amp;gt;&lt;br /&gt;
= removePlayerItem =&lt;br /&gt;
Removes a known item from a player&#039;s authoritative inventory.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool removePlayerItem(int playerId, string itemKey [, int quantity = 1])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Required !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected player identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itemKey&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || A rune, armor, or melee weapon key from the server catalog.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;quantity&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || no || Number of items to remove, from 1 to 1000; defaults to 1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the complete quantity can be removed and the change is replicated; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Consume one item only when the player owns it:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
if hasPlayerItem(playerId, &amp;quot;light&amp;quot;) then&lt;br /&gt;
    removePlayerItem(playerId, &amp;quot;light&amp;quot;, 1)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in server-side resource scripts.&lt;br /&gt;
* The operation is rejected rather than allowing the inventory quantity to become negative.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Player Functions]]&lt;br /&gt;
[[Category:Inventory Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- customkeys019:start --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Registered custom keys ==&lt;br /&gt;
This existing API also accepts the canonical item string from [[registerKeyDefinition]] in 0.1.9. Server registration, active definition and appropriate presentation readiness are required for mutations; use [[isPlayerKeyDefinitionReady]]. Do not pass the donor model alias as the custom item identity. Existing call shapes and limits remain; [[spawnItem]] creates one world item per call, whereas give/remove counts can manage copies. See [[Custom keys]] for safe server-side issuance, drop, pickup and persistence.&lt;br /&gt;
&amp;lt;!-- customkeys019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=RegisterKeyDefinition&amp;diff=1647</id>
		<title>RegisterKeyDefinition</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=RegisterKeyDefinition&amp;diff=1647"/>
		<updated>2026-10-20T13:29:02Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= registerKeyDefinition =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Server Lua. Part of [[Custom keys|custom keys and shared placed doors]].&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
item, error = registerKeyDefinition(id, options)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Parameters and behavior ==&lt;br /&gt;
id is a resource-local string; options is a table with required name and optional description, model, value, weight, maxStack. See [[Custom keys#Limits, restart and qualification|exact limits/defaults]]. Ownership comes from the calling resource, never an options field. Identical registration is idempotent; conflicting metadata is rejected.&lt;br /&gt;
== Returns ==&lt;br /&gt;
Canonical item string and empty error on success; nil and an error string on failure. No inventory is granted.&lt;br /&gt;
== Examples and security ==&lt;br /&gt;
See [[Custom keys]] for complete registration, copy issuance, placement, persistence and callback examples. These are server functions, not client RPC endpoints. Do not forward untrusted client arguments without gameplay authorization.&lt;br /&gt;
[[Category:Lua Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Player_identity_catalog&amp;diff=1646</id>
		<title>Player identity catalog</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Player_identity_catalog&amp;diff=1646"/>
		<updated>2026-10-20T13:29:01Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Player identity catalog}}&lt;br /&gt;
The &#039;&#039;&#039;player identity catalog&#039;&#039;&#039; lists named player identities accepted by [[setPlayerIdentity]]. The server commits matching identity keys together. In 0.1.8, named identities use head-only presentation while retaining the game-owned body and equipped armor. From 0.1.9, the five [[Female identities|supported female identities]] can also show their full authored outfit when no armor is equipped and body/head selections match. Selecting an identity does not equip or remove armor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IMPROVED FROM UPDATE 0.1.3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Identity selection existed in earlier releases. Update 0.1.3 corrects head publication and material-mask restoration during identity/armor rebuilds, addressing overlapping heads and missing body parts. Independent skin-color and tattoo functions are new in 0.1.3; see [[Player customization]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
if not setPlayerIdentity(playerId, &amp;quot;milten&amp;quot;) then&lt;br /&gt;
    outputChatBox(&amp;quot;The identity could not be applied.&amp;quot;, playerId)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In G1R:MP 0.1 this is the only supported setter for a complete player identity. The test command &amp;lt;code&amp;gt;/identity &amp;amp;lt;key&amp;amp;gt;&amp;lt;/code&amp;gt; uses the same API. The state is server-authoritative and replayed during relevance entry and late join. Raw Unreal paths are never accepted.&lt;br /&gt;
&lt;br /&gt;
Equipment remains independent of the selected identity. The full female outfit exception from 0.1.9 is described in [[Female identities]]. Identity changes preserve the [[setPlayerSkinColor|skin-color]] and [[setPlayerTattoo|tattoo]] overrides, including when no armor is equipped. A successful setter confirms authoritative state acceptance, not completion of rendering. Validate the character/armor combinations and viewing distances used by your resource on both local and observing clients.&lt;br /&gt;
&lt;br /&gt;
== Available identities ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Key !! Composition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; || Native Nameless Hero identity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baloro&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;FM_SLD_Baloro_753&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;homer&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_BAU_Homer_935&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;horatio&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_BAU_Horatio_901&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jan&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_BAU_Jan_942&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rice_lord&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_BAU_RiceLord_900&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cronos&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_KDW_Cronos_604&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;merdarion&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_KDW_Merdarion_602&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;myxir&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_KDW_Myxir_601&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nefarius&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_KDW_Nefarius_603&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;riordian&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_KDW_Riordian_605&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;saturas&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_KDW_Saturas_600&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_isidro&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_NOV_BaalIsidro_1333&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_kagan&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_NOV_BaalKagan_1332&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;buster&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_ORG_Buster_833&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cipher&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_ORG_Cipher_873&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;drax&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_ORG_Drax_819&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lares&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_ORG_Lares_801&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lefty&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_ORG_Lefty_844&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ratford&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_ORG_Ratford_818&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wolf&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_ORG_Wolf_855&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cord&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_SLD_Cord_709&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;gorn&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_SLD_Gorn_699&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;haenno&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_SLD_Haenno_741&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jarvis&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_SLD_Jarvis_728&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lee&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;NC_SLD_Lee_700&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;gomez&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_EBR_Gomez_100&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;raven&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_EBR_Raven_105&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fletcher&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_GRD_Fletcher_255&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kirgo&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_GRD_Kirgo_251&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;orry&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_GRD_Orry_254&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;thorus&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_GRD_Thorus_200&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flex&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_IE_Flex&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lutter&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_IE_Lutter&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;unicorn&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_IE_Unicorn&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;corristo&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_KDF_Corristo_402&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;milten&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_KDF_Milten&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_parvez&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_NOV_BaalParvez_1330&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mordrag&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_ORG_Mordrag_826&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dexter&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_STT_Dexter_329&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;diego&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_STT_Diego&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fingers&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_STT_Fingers_331&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fisk&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_STT_Fisk_311&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;whistler&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_STT_Whistler_309&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dusty&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_VLK_Dusty_524&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;huno&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_VLK_Huno_538&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mud&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_VLK_Mud_574&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;snaf&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_VLK_Snaf_581&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seraphia&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_WOC_Seraphia_110&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;syra&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_WOC_Syra_109&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;velaya&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OC_WOC_Velaya_108&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bloodwyn&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OCR_GRD_Bloodwyn_233&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;scatty&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OCR_GRD_Scatty_210&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skip&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OCR_GRD_Skip_211&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_lukor&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OG_GUR_BaalLukor_1211&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ulbert&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OM_GRD_Ulbert_271&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ian&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OM_STT_Ian_301&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;aleph&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;OM_VLK_Aleph_585&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_cadar&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_BaalCadar_1208&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_namib&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_BaalNamib_1204&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_orun&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_BaalOrun_1209&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_tondral&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_BaalTondral_1203&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;baal_tyon&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_BaalTyon_1210&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cor_angar&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_CorAngar_1202&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cor_kalom&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_CorKalom_1201&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;yberion&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_GUR_YBerion_1200&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;balor&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_NOV_Balor_1304&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fortuno&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_NOV_Fortuno_1357&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lester&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_NOV_Lester&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nyras&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_NOV_Nyras_1303&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chani&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_WSC_Chani_1205&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;natalia&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;SC_WSC_Natalia_1207&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cavalorn&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;UL_STT_Cavalorn_336&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cohsel&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;UL_STT_Cohsel_337&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;xardas&amp;lt;/code&amp;gt; || GTO &amp;lt;code&amp;gt;XT_DMB_Xardas_404&amp;lt;/code&amp;gt; profile plus validated character materials and hair&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Related functions ==&lt;br /&gt;
* [[getPlayerIdentityNames]]&lt;br /&gt;
* [[getPlayerIdentity]]&lt;br /&gt;
* [[setPlayerIdentity]]&lt;br /&gt;
* [[setPlayerArmor]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Lua Catalogs]]&lt;br /&gt;
[[Category:Appearance Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- female019:start --&amp;gt;&lt;br /&gt;
== Female identities (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Improved from 0.1.9.&#039;&#039;&#039;&lt;br /&gt;
The existing keys &amp;lt;code&amp;gt;syra&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;velaya&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;seraphia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chani&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;natalia&amp;lt;/code&amp;gt; receive corrected facial proportions and matching female-body presentation. Without armor, a complete matching identity shows its authored outfit; with armor, the native armor remains visible with the corrected head. Facial expression is currently neutral. See [[Female identities]] for player/NPC examples, mixed head/body selections and limits.&lt;br /&gt;
&amp;lt;!-- female019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Player_customization&amp;diff=1645</id>
		<title>Player customization</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Player_customization&amp;diff=1645"/>
		<updated>2026-10-20T13:28:59Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Player customization}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;SKIN COLOR AND TATTOOS — AVAILABLE FROM UPDATE 0.1.3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The seven skin-color and tattoo functions below are available in G1R:MP 0.1.3 and later. [[setPlayerIdentity]] existed earlier; its head and armor handling is &#039;&#039;&#039;improved from update 0.1.3&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use these &#039;&#039;&#039;server-side Lua&#039;&#039;&#039; functions to combine a named head, a skin-color override and a tattoo preset. Cosmetic changes are independent of armor and gameplay statistics. They work with an equipped armor or an empty armor slot; clothing naturally covers the skin beneath it.&lt;br /&gt;
&lt;br /&gt;
== Function reference ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayerSkinColor]](&amp;lt;code&amp;gt;playerId, r, g, b&amp;lt;/code&amp;gt;) || Set the skin tint using integer sRGB channels from 0 to 255.&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerSkinColor]](&amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt;) || Read &amp;lt;code&amp;gt;{r = ..., g = ..., b = ...}&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when unset or unavailable.&lt;br /&gt;
|-&lt;br /&gt;
| [[resetPlayerSkinColor]](&amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt;) || Restore native skin color without changing the tattoo override.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayerTattoo]](&amp;lt;code&amp;gt;playerId, presetKey&amp;lt;/code&amp;gt;) || Apply a validated tattoo preset, or &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; to explicitly remove tattoos.&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerTattoo]](&amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt;) || Read the canonical preset key, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when unset or unavailable.&lt;br /&gt;
|-&lt;br /&gt;
| [[resetPlayerTattoo]](&amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt;) || Restore native tattoo defaults without changing the skin-color override.&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerTattooNames]]() || Enumerate all 12 accepted keys; see [[Player tattoo catalog]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All seven have equivalent PascalCase aliases, for example &amp;lt;code&amp;gt;SetPlayerSkinColor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;GetPlayerTattooNames&amp;lt;/code&amp;gt;. These aliases are the same APIs, not separate functions in the catalog.&lt;br /&gt;
&lt;br /&gt;
=== Identity: existing API, improved in 0.1.3 ===&lt;br /&gt;
* [[setPlayerIdentity]](&amp;lt;code&amp;gt;playerId, &amp;quot;gorn&amp;quot;&amp;lt;/code&amp;gt;) selects a named identity. Use &amp;lt;code&amp;gt;&amp;quot;default&amp;quot;&amp;lt;/code&amp;gt; to restore the native Nameless Hero identity.&lt;br /&gt;
* [[getPlayerIdentity]](&amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt;) reads the current key; [[getPlayerIdentityNames]]() lists supported identities.&lt;br /&gt;
* Identity changes preserve equipped armor and the independent skin-color/tattoo overrides.&lt;br /&gt;
* 0.1.8 uses head-only identity presentation. From 0.1.9, [[Female identities|five supported female identities]] additionally show their full authored body/outfit without armor when body/head selections match. Equipped armor is preserved. This is not a body-shape or morph API.&lt;br /&gt;
* Update 0.1.3 corrects head publication and material-mask restoration during identity/armor changes, including meshes with more than 64 material slots. The changes address overlapping heads and missing body parts during visual rebuilds.&lt;br /&gt;
&lt;br /&gt;
See [[Player identity catalog]] for accepted names. The deprecated [[setPlayerBody]], [[setPlayerFace]] and [[setPlayerHead]] are not substitutes for the supported identity API. The older [[setPlayerSkin]] channel is separate from these RGB and tattoo overrides.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Run this inside an authorized server handler after the player is connected and ready. The API itself does not grant or check a gamemode-specific administrator permission.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
-- playerId is the validated target of your authorized handler.&lt;br /&gt;
if not setPlayerIdentity(playerId, &amp;quot;gorn&amp;quot;) then&lt;br /&gt;
    outputDebugString(&amp;quot;Identity was rejected&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
if not setPlayerSkinColor(playerId, 180, 140, 110) then&lt;br /&gt;
    outputDebugString(&amp;quot;Skin color was rejected&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
if not setPlayerTattoo(playerId, &amp;quot;lester&amp;quot;) then&lt;br /&gt;
    outputDebugString(&amp;quot;Tattoo was rejected&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local color = getPlayerSkinColor(playerId)&lt;br /&gt;
if color then&lt;br /&gt;
    outputDebugString(&amp;quot;RGB: &amp;quot; .. color.r .. &amp;quot;, &amp;quot; .. color.g .. &amp;quot;, &amp;quot; .. color.b)&lt;br /&gt;
end&lt;br /&gt;
outputDebugString(&amp;quot;Tattoo: &amp;quot; .. tostring(getPlayerTattoo(playerId)))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each setter is independent; this sequence is not one atomic multi-function transaction. Handle a rejected operation according to the resource&#039;s own policy.&lt;br /&gt;
&lt;br /&gt;
== Reset versus removal ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Remove tattoos explicitly, even if the native model normally has them:&lt;br /&gt;
setPlayerTattoo(playerId, &amp;quot;none&amp;quot;)&lt;br /&gt;
-- getPlayerTattoo(playerId) now returns &amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
-- Restore the model&#039;s native tattoo defaults instead:&lt;br /&gt;
resetPlayerTattoo(playerId)&lt;br /&gt;
-- getPlayerTattoo(playerId) now returns false.&lt;br /&gt;
&lt;br /&gt;
-- Reset only skin color; this does not change tattoos or identity:&lt;br /&gt;
resetPlayerSkinColor(playerId)&lt;br /&gt;
&lt;br /&gt;
-- Reset only identity; this does not clear color/tattoo overrides:&lt;br /&gt;
setPlayerIdentity(playerId, &amp;quot;default&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tattoo reset does not necessarily remove tattoos.&#039;&#039;&#039; It disables the custom override and restores the native defaults. A color getter returning &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; is not black RGB; it means there is no active override, or the player is unavailable.&lt;br /&gt;
&lt;br /&gt;
== Validation and synchronization ==&lt;br /&gt;
* RGB values must be finite integers in the range 0–255. Invalid values are rejected rather than clamped. They are interpreted as sRGB and converted for the native material; final appearance also depends on skin textures, supported material regions and lighting.&lt;br /&gt;
* Tattoo keys are case-insensitive and returned in canonical lowercase. Use the exact catalog key without extra whitespace. Unknown keys and arbitrary texture paths are rejected. There is no custom texture upload API.&lt;br /&gt;
* Setters return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when the server accepts the authoritative state, not when every client has finished rendering it. Getters read that authoritative state.&lt;br /&gt;
* State is reliably sent to the owner and relevant observers, replayed on late join/relevance entry, and reapplied after supported visual rebuilds. These cosmetic functions do not change armor, inventory, HP, mana or progression statistics.&lt;br /&gt;
* Color and tattoos are independent. Their resets do not change the other override. Test the exposed face, neck, arms, hands, torso and legs used by your character/armor combinations, including another client&#039;s view.&lt;br /&gt;
* A custom resource must implement authorization and persistence. The bundled GothicRP resource persists both overrides in its existing &amp;lt;code&amp;gt;appearance_json&amp;lt;/code&amp;gt; data. This persistence is a GothicRP feature, not automatic database storage by each Lua API call.&lt;br /&gt;
&lt;br /&gt;
== Bundled GothicRP commands ==&lt;br /&gt;
These are resource commands, &#039;&#039;&#039;not additional core Lua functions&#039;&#039;&#039;. They require authentication, &amp;lt;code&amp;gt;admin.players&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;RP.Config.testTools.enabled = true&amp;lt;/code&amp;gt;. An omitted target means yourself.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/identity gorn [player name or ID]&amp;lt;/code&amp;gt; || Change identity; &amp;lt;code&amp;gt;/identity&amp;lt;/code&amp;gt; lists choices.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/skincolor 180 140 110 [player name or ID]&amp;lt;/code&amp;gt; || Set skin color.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/skincolor reset [player name or ID]&amp;lt;/code&amp;gt; || Restore native color.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/tattoo lester [player name or ID]&amp;lt;/code&amp;gt; || Set a tattoo preset.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/tattoo none [player name or ID]&amp;lt;/code&amp;gt; || Remove tattoos explicitly.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/tattoo reset [player name or ID]&amp;lt;/code&amp;gt; || Restore native tattoo defaults.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For optional manual QA, &amp;lt;code&amp;gt;/looktest start&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/looktest all&amp;lt;/code&amp;gt; saves the cosmetic baseline and starts a sequence; &amp;lt;code&amp;gt;/looktest next&amp;lt;/code&amp;gt; advances, and &amp;lt;code&amp;gt;/looktest stop&amp;lt;/code&amp;gt; restores it. End an active test before making normal cosmetic edits. The test never equips armor or changes HP/mana; manual armor changes during it are not undone by stopping. &amp;lt;code&amp;gt;/looktest armor&amp;lt;/code&amp;gt; only reads live server equipment and resources.&lt;br /&gt;
&lt;br /&gt;
== Related pages ==&lt;br /&gt;
* [[Player tattoo catalog]]&lt;br /&gt;
* [[Player identity catalog]]&lt;br /&gt;
* [[:Category:Appearance Functions]]&lt;br /&gt;
* [[Lua API catalogs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Tutorials]]&lt;br /&gt;
[[Category:Appearance Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- armor019:start --&amp;gt;&lt;br /&gt;
== Armor parts (from 0.1.9) ==&lt;br /&gt;
Available from 0.1.9. [[Armor catalog]] lists the 26 bases; [[Armor upgrade catalog]] lists all 84 pieces. This existing function/guide is not newly introduced in 0.1.9. The new [[Armor upgrades|upgrade system]] adds per-character top/mid/bottom selections, full presets and separate player/NPC setters. A different base clears the old parts; choosing the same base keeps compatible selections. Identity, skin tint and tattoos remain separate. See the guide for requirements, safe replacement and synchronization validation.&lt;br /&gt;
&amp;lt;!-- armor019:end --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- female019:start --&amp;gt;&lt;br /&gt;
== Female characters (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Improved from 0.1.9.&#039;&#039;&#039;&lt;br /&gt;
Use [[setPlayerIdentity]] with &amp;lt;code&amp;gt;syra&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;velaya&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;seraphia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chani&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;natalia&amp;lt;/code&amp;gt;. The update corrects stretched female faces, including armored characters. Complete matching identities show their female outfit without armor; equipped armor retains its original shape and takes priority. Skin tint and tattoo overrides remain independent, subject to exposed/supported skin regions. See [[Female identities]] for examples and the neutral-expression limitation. No new customization function is required.&lt;br /&gt;
&amp;lt;!-- female019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Player_animation_catalog&amp;diff=1644</id>
		<title>Player animation catalog</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Player_animation_catalog&amp;diff=1644"/>
		<updated>2026-10-20T13:28:58Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Player animation catalog}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;The original 27-entry player-animation catalog and the synchronized [[startAnim]] and [[stopAnim]] behavior are available from G1R:MP 0.1.2.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;player animation catalog&#039;&#039;&#039; lists the stable, server-validated aliases accepted by [[startAnim]]. Aliases are case-insensitive. Lua passes an alias from this table; raw Unreal asset paths are neither accepted nor exposed as API inputs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0.1.8 includes the 118-alias catalog expanded in 0.1.4.&#039;&#039;&#039; These earlier entries have been confirmed working in-game; see the tables below and [[Update 0.1.4]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From 0.1.9: 962 aliases in total, including 844 additions.&#039;&#039;&#039; See the complete [[Activity animation catalog]] and [[Activity animations|usage guide]]. The new entries include route/gesture variants and are not all individually visually confirmed. Both client and server need the matching update.&lt;br /&gt;
&lt;br /&gt;
== Request modes ==&lt;br /&gt;
The &#039;&#039;&#039;authored mode&#039;&#039;&#039; documents the safe, recommended presentation for each animation. It does not change the compatible Lua signature:&lt;br /&gt;
&lt;br /&gt;
* Omitting &amp;lt;code&amp;gt;looped&amp;lt;/code&amp;gt; from [[startAnim]] always means &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, including for entries whose authored mode is &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt;.&lt;br /&gt;
* With &amp;lt;code&amp;gt;looped = false&amp;lt;/code&amp;gt;, the animation plays once from its beginning and ends naturally. Use this for every &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; entry.&lt;br /&gt;
* With &amp;lt;code&amp;gt;looped = true&amp;lt;/code&amp;gt;, a &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; entry plays its introduction, then repeats from the catalogued loop-start time until [[stopAnim]] or a newer scripted animation supersedes it. Higher-priority gameplay presentation temporarily takes precedence; the same active scripted revision may resume afterward.&lt;br /&gt;
* The optional blend duration controls the owning player&#039;s native montage transition when the request replaces an existing scripted animation, then remains the stop blend for the new animation. Remote proxy handoff is immediate and does not guarantee an interpolated blend.&lt;br /&gt;
* A loop-start value is native catalog metadata. It is not an additional Lua argument.&lt;br /&gt;
&lt;br /&gt;
== Original aliases (since 0.1.2) ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Key !! Description !! Authored mode !! Loop start !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;crossarms&amp;lt;/code&amp;gt; || Stand with arms crossed. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3.47 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pray&amp;lt;/code&amp;gt; || Pray while standing. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6.83 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;meditate&amp;lt;/code&amp;gt; || Perform a standing meditation pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11.5 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;warmhands&amp;lt;/code&amp;gt; || Warm the hands in a cold or rainy standing pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0.93 s&amp;lt;/code&amp;gt; || Uses the stable Rain Pose 04 replacement; the unsafe original Warm Hands montage is not exposed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exhausted&amp;lt;/code&amp;gt; || Show an exhausted standing pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;9.47 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dance&amp;lt;/code&amp;gt; || Perform a standing dance. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1.97 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;smalltalk&amp;lt;/code&amp;gt; || Gesture while speaking to an audience. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4.5 s&amp;lt;/code&amp;gt; || Uses the visible Speaks Audience replacement; the original non-rendering Small Talk montage is not exposed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;guard&amp;lt;/code&amp;gt; || Hold a watchful guard pose with crossed arms. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3.47 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitground&amp;lt;/code&amp;gt; || Sit on the ground. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5.03 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepground&amp;lt;/code&amp;gt; || Lie down and sleep on the ground. || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || &amp;amp;mdash; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepstand&amp;lt;/code&amp;gt; || Doze while standing. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4.17 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;leanwall&amp;lt;/code&amp;gt; || Lean against a wall. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; || Adopt a listening pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2.57 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;waterpipe&amp;lt;/code&amp;gt; || Use a water pipe. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8.67 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;smoke&amp;lt;/code&amp;gt; || Perform the standing smoking pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1.47 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;campfire&amp;lt;/code&amp;gt; || Warm up in front of a campfire. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4.73 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;puke&amp;lt;/code&amp;gt; || Perform the vomiting animation. || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || &amp;amp;mdash; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;angrydrunk&amp;lt;/code&amp;gt; || Act like an angry drunk. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3.67 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;airguitar&amp;lt;/code&amp;gt; || Perform the concert air-guitar pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0.03 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;headbang&amp;lt;/code&amp;gt; || Perform the concert headbang pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0.03 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fistpump&amp;lt;/code&amp;gt; || Perform the concert fist-pump pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0.03 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pogo&amp;lt;/code&amp;gt; || Perform the concert pogo pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0.03 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stomp&amp;lt;/code&amp;gt; || Perform the concert stomp pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0.03 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sway&amp;lt;/code&amp;gt; || Perform the concert sway pose. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0.03 s&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;work&amp;lt;/code&amp;gt; || Perform a smithing work animation. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;50.7667 s&amp;lt;/code&amp;gt; || Compatibility alias used by the bundled GothicRP activities; the authored montage presents visible smithing and its prop.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mine&amp;lt;/code&amp;gt; || Perform the pickaxe mining animation. || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1.97333 s&amp;lt;/code&amp;gt; || Compatibility alias used by the bundled GothicRP mining activities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pickup&amp;lt;/code&amp;gt; || Pick up an item from the ground with the left hand. || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || &amp;amp;mdash; || Compatibility alias used by the bundled GothicRP gathering activities; authored as a one-shot.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Additional animations since 0.1.4 BUILD127 ==&lt;br /&gt;
&#039;&#039;&#039;The 0.1.4 expansion added 91 entries, bringing that release&#039;s total to 118. These earlier entries were confirmed working in-game by the project owner.&#039;&#039;&#039; The separate [[Activity animation catalog|0.1.9 expansion]] adds another 844 aliases.&lt;br /&gt;
The original 27 IDs and aliases are unchanged. Use the updated &#039;&#039;&#039;client and server&#039;&#039;&#039;. These additions are part of [[Update 0.1.4]], not the public 0.1.3 catalog.&lt;br /&gt;
&lt;br /&gt;
New playback follows the selected introduction, loop and exit rather than unrelated alternate montage sections. The introduction duration below is elapsed time; loop start is a native montage position, not a Lua argument. With looped=false, a new hold animation follows its introduction, one loop and exit. With looped=true it repeats the selected loop until stopped or superseded.&lt;br /&gt;
&lt;br /&gt;
=== Work and training (35) ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Alias !! Activity !! Recommended mode !! Introduction !! Native loop start&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;alchemy&amp;lt;/code&amp;gt; || Work at an alchemy lab || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.667 s || 3.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;annotategoods&amp;lt;/code&amp;gt; || Write notes while checking goods || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 6.667 s || 6.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;buildhouse&amp;lt;/code&amp;gt; || Hammer during construction || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.167 s || 4.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkbody&amp;lt;/code&amp;gt; || Examine a body || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.800 s || 3.800 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkgoods&amp;lt;/code&amp;gt; || Inspect goods, variant 1 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.030 s || 0.030 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkgoods2&amp;lt;/code&amp;gt; || Inspect goods, variant 2 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.050 s || 0.050 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cleanfloor&amp;lt;/code&amp;gt; || Scrub a floor, variant 1 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.933 s || 4.933 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cleanfloor2&amp;lt;/code&amp;gt; || Scrub a floor, variant 2 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.133 s || 5.133 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cookpan&amp;lt;/code&amp;gt; || Cook at a pan || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.033 s || 2.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cookspit&amp;lt;/code&amp;gt; || Cook at a spit || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.033 s || 0.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cookcauldron&amp;lt;/code&amp;gt; || Stir a cauldron || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.833 s || 0.833 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;countore&amp;lt;/code&amp;gt; || Count ore || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 7.033 s || 7.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cutwood&amp;lt;/code&amp;gt; || Chop wood / a tree || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.900 s || 2.900 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cutlog&amp;lt;/code&amp;gt; || Chop a log at a station || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.467 s || 32.733 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pickrice&amp;lt;/code&amp;gt; || Harvest rice || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.867 s || 2.867 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pickaxe&amp;lt;/code&amp;gt; || Work with a pickaxe || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.833 s || 2.833 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;digground&amp;lt;/code&amp;gt; || Dig with a pickaxe || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.833 s || 2.833 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repair&amp;lt;/code&amp;gt; || Hammer a ground-level repair || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.167 s || 4.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cleanrice&amp;lt;/code&amp;gt; || Clean rice at a station || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.267 s || 4.267 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seedrice&amp;lt;/code&amp;gt; || Sow rice || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.500 s || 4.500 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;smashherbs&amp;lt;/code&amp;gt; || Mash herbs at a station || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.667 s || 4.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;smithanvil&amp;lt;/code&amp;gt; || Work at an anvil || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.733 s || 2.733 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;smithsharpen&amp;lt;/code&amp;gt; || Sharpen at a smithing station || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.200 s || 2.200 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;smithwater&amp;lt;/code&amp;gt; || Cool metal at a smithing water station || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || 6.433 s || &amp;amp;mdash;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tanning&amp;lt;/code&amp;gt; || Work at a tanning station || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.167 s || 5.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sweep&amp;lt;/code&amp;gt; || Sweep with a broom || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.700 s || 5.700 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;carve&amp;lt;/code&amp;gt; || Carve while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.433 s || 4.433 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitcountore&amp;lt;/code&amp;gt; || Count ore while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.533 s || 5.533 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;swordsharpen&amp;lt;/code&amp;gt; || Sharpen a sword while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 6.171 s || 6.171 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;teach&amp;lt;/code&amp;gt; || Teach / demonstrate training || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.500 s || 4.500 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;trainmagic&amp;lt;/code&amp;gt; || Practice magic gestures || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 7.100 s || 7.100 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;trainbow&amp;lt;/code&amp;gt; || Practice bow handling || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 8.833 s || 8.833 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;train&amp;lt;/code&amp;gt; || Practice one-handed sword movements || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 1.667 s || 1.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;train2h&amp;lt;/code&amp;gt; || Practice two-handed sword movements || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 8.467 s || 8.467 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;train1h&amp;lt;/code&amp;gt; || Practice one-handed melee movements || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.067 s || 5.067 s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sitting, lying and sleep (19) ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Alias !! Activity !! Recommended mode !! Introduction !! Native loop start&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sit&amp;lt;/code&amp;gt; || Sit on a stool / chair || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 1.367 s || 5.300 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitthrone&amp;lt;/code&amp;gt; || Sit on a throne || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 7.667 s || 7.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitlisten&amp;lt;/code&amp;gt; || Listen while sitting, variant 1 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.167 s || 5.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitlisten2&amp;lt;/code&amp;gt; || Listen while sitting, variant 2 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 7.000 s || 7.000 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitsleep&amp;lt;/code&amp;gt; || Doze while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 10.933 s || 10.933 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleeptable&amp;lt;/code&amp;gt; || Sleep at a table || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 9.233 s || 9.233 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitbedlowleft&amp;lt;/code&amp;gt; || Sit on a low bed, left entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.200 s || 5.200 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitbedlowright&amp;lt;/code&amp;gt; || Sit on a low bed, right entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.200 s || 5.200 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitbedhighleft&amp;lt;/code&amp;gt; || Sit on a high bed, left entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.200 s || 5.200 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitbedhighright&amp;lt;/code&amp;gt; || Sit on a high bed, right entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.200 s || 5.200 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepbedlowleft&amp;lt;/code&amp;gt; || Sleep on a low bed, left entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 15.867 s || 15.867 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepbedlowright&amp;lt;/code&amp;gt; || Sleep on a low bed, right entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 12.867 s || 12.867 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepbedhighleft&amp;lt;/code&amp;gt; || Sleep on a high bed, left entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 15.867 s || 15.867 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepbedhighright&amp;lt;/code&amp;gt; || Sleep on a high bed, right entry || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 12.867 s || 12.867 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lieground&amp;lt;/code&amp;gt; || Lie down / sleep on the ground || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 10.100 s || 34.133 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitground2&amp;lt;/code&amp;gt; || Sit on the ground, alternate route || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 7.133 s || 7.133 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepstand2&amp;lt;/code&amp;gt; || Doze while standing, variant 2 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.300 s || 5.300 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleepstand3&amp;lt;/code&amp;gt; || Doze while standing, variant 3 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.417 s || 4.417 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;leanwall2&amp;lt;/code&amp;gt; || Lean against a wall, alternate variant || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.000 s || 4.000 s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Daily activities (19) ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Alias !! Activity !! Recommended mode !! Introduction !! Native loop start&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;readbook&amp;lt;/code&amp;gt; || Read a book while standing || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.833 s || 3.833 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitreadbook&amp;lt;/code&amp;gt; || Read a book while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.600 s || 3.600 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;readlectern&amp;lt;/code&amp;gt; || Read at a lectern || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.167 s || 3.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;readscroll&amp;lt;/code&amp;gt; || Read a scroll || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.167 s || 2.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;readpaper&amp;lt;/code&amp;gt; || Read a sheet of paper || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.167 s || 2.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;drink&amp;lt;/code&amp;gt; || Drink while standing || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.267 s || 4.267 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitdrink&amp;lt;/code&amp;gt; || Drink while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.667 s || 3.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;grounddrink&amp;lt;/code&amp;gt; || Drink while sitting on the ground || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.800 s || 4.800 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;eatbowl&amp;lt;/code&amp;gt; || Eat from a bowl while standing || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.433 s || 3.433 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;eatmeat&amp;lt;/code&amp;gt; || Eat meat while standing || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 7.667 s || 7.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;siteatbowl&amp;lt;/code&amp;gt; || Eat from a bowl while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.500 s || 4.500 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;siteatmeat&amp;lt;/code&amp;gt; || Eat meat while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.500 s || 5.500 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;groundeat&amp;lt;/code&amp;gt; || Eat while sitting on the ground || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.500 s || 5.500 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitsmoke&amp;lt;/code&amp;gt; || Smoke while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.500 s || 4.500 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playlute&amp;lt;/code&amp;gt; || Play a lute while standing || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.100 s || 4.100 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitplaylute&amp;lt;/code&amp;gt; || Play a lute while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 6.767 s || 6.767 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wash&amp;lt;/code&amp;gt; || Wash oneself || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 4.067 s || 4.067 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;washtrough&amp;lt;/code&amp;gt; || Wash at a trough, variant 1 || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || 13.667 s || &amp;amp;mdash;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;washtrough2&amp;lt;/code&amp;gt; || Wash at a trough, variant 2 || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || 9.333 s || &amp;amp;mdash;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Poses and gestures (18) ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Alias !! Activity !! Recommended mode !! Introduction !! Native loop start&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;handsonhips&amp;lt;/code&amp;gt; || Stand with hands on hips || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.364 s || 3.364 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;crossarmsthorus&amp;lt;/code&amp;gt; || Thorus-style crossed arms || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 3.467 s || 3.467 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pray2&amp;lt;/code&amp;gt; || Pray, alternate variant || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 5.333 s || 5.333 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;meditate2&amp;lt;/code&amp;gt; || Meditate, alternate variant || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 10.667 s || 10.667 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;listen2&amp;lt;/code&amp;gt; || Listen, alternate variant || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.833 s || 2.833 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exhausted2&amp;lt;/code&amp;gt; || Show exhaustion, alternate variant || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 6.967 s || 6.967 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rain1&amp;lt;/code&amp;gt; || React to rain, variant 1 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 1.167 s || 1.167 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rain2&amp;lt;/code&amp;gt; || React to rain, variant 2 || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 1.333 s || 1.333 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;inspectfront&amp;lt;/code&amp;gt; || Inspect something ahead || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || 10.000 s || &amp;amp;mdash;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;inspectdown&amp;lt;/code&amp;gt; || Inspect something below || &amp;lt;code&amp;gt;once&amp;lt;/code&amp;gt; || 10.633 s || &amp;amp;mdash;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;danceclap&amp;lt;/code&amp;gt; || Dance and clap || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 2.533 s || 2.533 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sitdance&amp;lt;/code&amp;gt; || Dance while sitting || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 1.267 s || 1.267 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;airguitar2&amp;lt;/code&amp;gt; || Concert air guitar, alternate variant || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.033 s || 0.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;airkick&amp;lt;/code&amp;gt; || Concert air kick || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.033 s || 0.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;headbang2&amp;lt;/code&amp;gt; || Intense headbanging || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.033 s || 0.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;hairwhip&amp;lt;/code&amp;gt; || Concert hair whip || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.033 s || 0.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;raisefist&amp;lt;/code&amp;gt; || Raise a fist at a concert || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.033 s || 0.033 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;raisehands&amp;lt;/code&amp;gt; || Rapidly raise hands at a concert || &amp;lt;code&amp;gt;hold&amp;lt;/code&amp;gt; || 0.033 s || 0.033 s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Practical notes ===&lt;br /&gt;
* Query [[getPlayerAnimationNames]] and [[getPlayerAnimationInfo]] to build a Lua menu from the running server&#039;s catalog. Pass info.looped explicitly when using the recommended mode.&lt;br /&gt;
* New props are cosmetic, separately owned components. Stopping or replacing their animation cleans up those components, not the player&#039;s inventory/equipment or unrelated world props.&lt;br /&gt;
* These are visual activities: no crafting rewards, food consumption, skill changes or scripted story actions. Native voice lines, particles and crafting effects are not replayed by the new visual-only presentation.&lt;br /&gt;
* Chairs, beds, anvils, troughs and other stations are not spawned or aligned automatically. Position the character at a suitable object; some station-owned rigs or scenery are separate from the character animation.&lt;br /&gt;
* First use may load animation/model assets. Existing request validation, bounded retries and failure diagnostics remain enabled.&lt;br /&gt;
&lt;br /&gt;
=== Catalog-driven example ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local info = getPlayerAnimationInfo(&amp;quot;smithanvil&amp;quot;)&lt;br /&gt;
if info then&lt;br /&gt;
    startAnim(playerId, info.name, info.looped, 0.15)&lt;br /&gt;
end&lt;br /&gt;
-- End the activity when appropriate:&lt;br /&gt;
-- stopAnim(playerId)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Hold a prayer pose using its catalogued loop point.&lt;br /&gt;
startAnim(playerId, &amp;quot;pray&amp;quot;, true, 0.2)&lt;br /&gt;
&lt;br /&gt;
-- Play a one-shot animation from the beginning.&lt;br /&gt;
startAnim(playerId, &amp;quot;puke&amp;quot;, false, 0.15)&lt;br /&gt;
&lt;br /&gt;
-- Stop only the tracked scripted animation.&lt;br /&gt;
stopAnim(playerId)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Return-value contract ==&lt;br /&gt;
For both [[startAnim]] and [[stopAnim]], &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; means the server accepted the request, updated or retransmitted authoritative state, and attempted reliable delivery. It is not a synchronous client-playback or transport acknowledgement. Requests rejected during server validation return &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Client loading and presentation retries are bounded; terminal misses are written to the animation diagnostic log instead of retrying forever.&lt;br /&gt;
&lt;br /&gt;
== Related functions ==&lt;br /&gt;
* [[startAnim]]&lt;br /&gt;
* [[stopAnim]]&lt;br /&gt;
* [[getPlayerAnimationNames]] (since 0.1.4)&lt;br /&gt;
* [[getPlayerAnimationInfo]] (since 0.1.4)&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Lua Catalogs]]&lt;br /&gt;
[[Category:Animation Functions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- activities019:start --&amp;gt;&lt;br /&gt;
== Activity expansion (from 0.1.9) ==&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9.&#039;&#039;&#039; Both the server and observing clients need the matching update.&lt;br /&gt;
[[Activity animation catalog]] lists all 844 new aliases with recommended modes and timing: gathering, rice/herb processing, work, crafting gestures, fishing, rest, daily activities, carrying, poses and gestures. [[Activity animations]] includes examples for players and NPCs, all six fishing aliases, cosmetic rod handling and qualification limits. The original 118 aliases remain available.&lt;br /&gt;
&amp;lt;!-- activities019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=OnWorldItemPickup&amp;diff=1643</id>
		<title>OnWorldItemPickup</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=OnWorldItemPickup&amp;diff=1643"/>
		<updated>2026-10-20T13:28:56Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= onWorldItemPickup =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This event is available in earlier releases and has corrected or expanded behavior in G1R:MP 0.1.2 and later. The contract below describes the updated behavior.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triggered after the server accepts a synchronized world-item pickup and applies its authoritative inventory grant.&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
This event is available in &#039;&#039;&#039;server-side&#039;&#039;&#039; scripts.&lt;br /&gt;
&lt;br /&gt;
== Callback signature ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
onWorldItemPickup(objectId, playerId, itemKey, quantity, serverTimeMs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;objectId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || The positive server-assigned 64-bit world-item object ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || The player that picked up the item.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itemKey&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || The stable item definition key.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;quantity&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || The complete accepted world-stack quantity granted to the player.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;serverTimeMs&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || Server timestamp of the accepted pickup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Handle the event:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onWorldItemPickup&amp;quot;, root, function(objectId, playerId, itemKey, quantity, serverTimeMs)&lt;br /&gt;
    outputDebugString(getPlayerName(playerId) .. &amp;quot; picked up &amp;quot; .. itemKey)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* The server has already added &amp;lt;code&amp;gt;quantity&amp;lt;/code&amp;gt; to its authoritative native inventory cache before this observation event. Do not grant the same items again from the handler.&lt;br /&gt;
* The picked-up tombstone is broadcast reliably and the object is removed from active late-join state before callbacks run. The bundled GothicRP resource then persists the inventory grant asynchronously.&lt;br /&gt;
* Rejected, stale, duplicate, out-of-range, or over-capacity pickup attempts do not emit this event.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Events]]&lt;br /&gt;
[[Category:Server Events]]&lt;br /&gt;
[[Category:World Events]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- customkeys019:start --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Custom-key pickup ==&lt;br /&gt;
The existing &amp;lt;code&amp;gt;(objectId, playerId, item, quantity, serverTimeMs)&amp;lt;/code&amp;gt; event also reports registered custom keys using their canonical identity. Inventory was already granted by the core; do not give it again. Persist your gamemode inventory as needed. This is a reserved server notification, not remotely triggerable. See [[Custom keys]].&lt;br /&gt;
&amp;lt;!-- customkeys019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=OnWorldItemDropCommitted&amp;diff=1642</id>
		<title>OnWorldItemDropCommitted</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=OnWorldItemDropCommitted&amp;diff=1642"/>
		<updated>2026-10-20T13:28:55Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= onWorldItemDropCommitted =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Server-side event, handled on root. All resources running at commit. Deferred notification after the pending drop was committed and its world object published. No extra inventory deduction or completion call is needed. Fields are numbers except canonical item string; timestamp is server monotonic milliseconds captured when the drop was created.&lt;br /&gt;
&lt;br /&gt;
== Callback ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onWorldItemDropCommitted&amp;quot;, root, function(objectId, playerId, item, quantity, serverTimeMs)&lt;br /&gt;
    -- Add server-side handling here; see the Custom keys guide.&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Contract ==&lt;br /&gt;
Door id is resource-local; playerId is a numeric server player ID; item is the canonical item string. Only parameters shown in this event&#039;s signature are passed. eventOrigin is &amp;quot;server&amp;quot;; sourceResource is a table with name=&amp;quot;server&amp;quot;. No addEvent declaration is needed. This name cannot be opted into remote calls or forged by Lua triggerEvent.&lt;br /&gt;
&lt;br /&gt;
See [[Custom keys#Callbacks and safety|callback delivery and limits]]. Notifications are not cancellable hooks or durable transaction logs; readiness reports do not grant entitlement. See [[Custom keys#Drop, pickup and persistence|drop/pickup persistence]] before changing inventory in a handler.&lt;br /&gt;
[[Category:Lua Events]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=OnWorldItemDropCancelled&amp;diff=1641</id>
		<title>OnWorldItemDropCancelled</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=OnWorldItemDropCancelled&amp;diff=1641"/>
		<updated>2026-10-20T13:28:54Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= onWorldItemDropCancelled =&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Server-side event, handled on root. Captured persistence owner only. Deferred notification after cancellation of a pending drop. The core handles live rollback for a still-connected player; your gamemode owns durable inventory recovery. Do not grant the quantity again. Timestamp is the original drop creation time.&lt;br /&gt;
&lt;br /&gt;
== Callback ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onWorldItemDropCancelled&amp;quot;, root, function(objectId, playerId, item, quantity, serverTimeMs)&lt;br /&gt;
    -- Add server-side handling here; see the Custom keys guide.&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Contract ==&lt;br /&gt;
Door id is resource-local; playerId is a numeric server player ID; item is the canonical item string. Only parameters shown in this event&#039;s signature are passed. eventOrigin is &amp;quot;server&amp;quot;; sourceResource is a table with name=&amp;quot;server&amp;quot;. No addEvent declaration is needed. This name cannot be opted into remote calls or forged by Lua triggerEvent.&lt;br /&gt;
&lt;br /&gt;
See [[Custom keys#Callbacks and safety|callback delivery and limits]]. Notifications are not cancellable hooks or durable transaction logs; readiness reports do not grant entitlement. See [[Custom keys#Drop, pickup and persistence|drop/pickup persistence]] before changing inventory in a handler.&lt;br /&gt;
[[Category:Lua Events]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=OnWorldItemDrop&amp;diff=1640</id>
		<title>OnWorldItemDrop</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=OnWorldItemDrop&amp;diff=1640"/>
		<updated>2026-10-20T13:28:52Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Release 0.1.9 / BUILD264 / Protocol42: availability and download setup; preserve experimental limits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= onWorldItemDrop =&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff5f5; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111111; padding:0.85rem 1rem; margin:0.75rem 0 1rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111111; margin-top:0.25rem;&amp;quot;&amp;gt;This event is available in G1R:MP 0.1.2 and later. The contract below includes the compatibility guarantees introduced in that update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triggered for public server resources after a player-initiated world-item drop is durably committed and published. From 0.1.9, custom keys use this event as a pre-commit request to their defining resource instead; observers use [[onWorldItemDropCommitted]]. Read the custom-key contract below before handling those items.&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
This event is available in &#039;&#039;&#039;server-side&#039;&#039;&#039; scripts.&lt;br /&gt;
&lt;br /&gt;
== Callback signature ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
onWorldItemDrop(objectId, playerId, itemKey, quantity, serverTimeMs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;objectId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || The positive server-assigned 64-bit ID of the published dropped item.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || The player whose inventory supplied the dropped item.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itemKey&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || The stable inventory and world-item definition key.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;quantity&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || The committed quantity removed from inventory and published in the world.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;serverTimeMs&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || Server timestamp recorded when the accepted drop intent created the quarantined item.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Handle the event:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onWorldItemDrop&amp;quot;, root, function(objectId, playerId, itemKey, quantity, serverTimeMs)&lt;br /&gt;
    outputDebugString(&amp;quot;Player &amp;quot; .. playerId .. &amp;quot; dropped &amp;quot; .. quantity .. &amp;quot;x &amp;quot; .. itemKey)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* The runtime first quarantines the new object and removes the quantity from the authoritative inventory cache. The bundled GothicRP resource persists that change before confirming the transaction.&lt;br /&gt;
* Only a successful durable confirmation publishes the item and emits this callback to public resources. A failed or rolled-back drop publishes no public &amp;lt;code&amp;gt;onWorldItemDrop&amp;lt;/code&amp;gt; event and restores the authoritative inventory state when the session is still connected.&lt;br /&gt;
* The active item is broadcast reliably before public callbacks run and is then included in late-join state. This is an observation event: do not remove the inventory quantity a second time.&lt;br /&gt;
* Player-initiated drops emit this event instead of [[onWorldItemSpawn]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Events]]&lt;br /&gt;
[[Category:Server Events]]&lt;br /&gt;
[[Category:World Events]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- customkeys019:start --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Available from 0.1.9. Use matching updated server and clients.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Custom-key pending drop requests ==&lt;br /&gt;
Signature remains &amp;lt;code&amp;gt;(objectId, playerId, item, quantity, serverTimeMs)&amp;lt;/code&amp;gt;. For custom keys, only the defining resource receives this pre-commit persistence request. The quantity is already deducted; object publication/pickup is quarantined until [[completeWorldItemDrop]]. Other resources should use [[onWorldItemDropCommitted]] for custom-key observation. Existing ordinary-item GothicRP/observer behavior is preserved. See [[Custom keys#Drop, pickup and persistence|full contract]].&lt;br /&gt;
&amp;lt;!-- customkeys019:end --&amp;gt;&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
</feed>