<?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-09-19T06:39:28Z</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=888</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=888"/>
		<updated>2026-09-13T00:41:11Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Place the main wiki heading above release announcements&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;G1R:MP 0.1.3 — official release, BUILD106 / Protocol 35.&#039;&#039;&#039; Windows client and Windows/Linux dedicated server downloads are available on the [https://g1r-mp.com/download/ Download page]. Update both the client and server. See [[Update 0.1.3]] for scripting additions and migration notes.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold;&amp;quot;&amp;gt;CHAPTER SCREENS — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;2 new server-side functions&#039;&#039;&#039;: [[showChapterScreen|ShowChapterScreen]] and [[hideChapterScreen|HideChapterScreen]] (also available with lower-camel aliases). Show custom chapter-style title cards without advancing the story. See [[Chapter screens]] for examples, validation, resource ownership and &amp;lt;code&amp;gt;/chaptertest&amp;lt;/code&amp;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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;OBSERVER NAMEPLATES — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;12 new server-side functions&#039;&#039;&#039; add per-observer text, whole-label visibility and numeric-ID policy. Build directional acquaintance presentation with exclusive resource-owned fields and reliable relevance replay. See [[Observer nameplates]] for APIs, lifecycle, database integration and the optional three-client &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; sequence. Overhead customization does not anonymize other packets, chat or player lists.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;PLAYER CUSTOMIZATION — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;7 new server-side functions&#039;&#039;&#039; provide independent skin-color and tattoo overrides. Existing identity selection has improved head and armor compatibility from update 0.1.3. See [[Player customization]] for examples and reset behavior, and [[Player tattoo catalog]] for all 12 keys.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Skin color:&amp;lt;/strong&amp;gt; [[setPlayerSkinColor]] &amp;amp;bull; [[getPlayerSkinColor]] &amp;amp;bull; [[resetPlayerSkinColor]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Tattoos:&amp;lt;/strong&amp;gt; [[setPlayerTattoo]] &amp;amp;bull; [[getPlayerTattoo]] &amp;amp;bull; [[resetPlayerTattoo]] &amp;amp;bull; [[getPlayerTattooNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Improved existing API:&amp;lt;/strong&amp;gt; [[setPlayerIdentity]] keeps the game-owned body and equipped armor. These are cosmetic controls, not a full NPC body/outfit replacement.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;SCRIPTED CAMERA — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;15 camera functions&#039;&#039;&#039; and &#039;&#039;&#039;2 client camera events&#039;&#039;&#039; are available from G1R:MP 0.1.3. Build login backgrounds, fixed shots, smooth transitions, paths and orbits. See [[Scripted camera]] for examples, limits and client/server differences.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client and server (10):&amp;lt;/strong&amp;gt; [[setCameraPos]] &amp;amp;bull; [[setCameraRot]] &amp;amp;bull; [[setCameraLookAt]] &amp;amp;bull; [[setCameraFOV]] &amp;amp;bull; [[setCameraPose]] &amp;amp;bull; [[moveCameraTo]] &amp;amp;bull; [[playCameraPath]] &amp;amp;bull; [[orbitCamera]] &amp;amp;bull; [[stopCameraMovement]] &amp;amp;bull; [[resetCameraPos]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client read-back (5):&amp;lt;/strong&amp;gt; [[getCameraPos]] &amp;amp;bull; [[getCameraRot]] &amp;amp;bull; [[getCameraFOV]] &amp;amp;bull; [[getCameraState]] &amp;amp;bull; [[requestCameraState]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client events (2):&amp;lt;/strong&amp;gt; [[onClientCameraCommandResult]] &amp;amp;bull; [[onClientCameraReset]]. Client commands use asynchronous acknowledgements; server calls return only a queued boolean.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE AND IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;The following &#039;&#039;&#039;40 Lua functions&#039;&#039;&#039; &amp;amp;mdash; 29 server-side and 11 client-side &amp;amp;mdash; are available from G1R:MP 0.1.2. Existing lifecycle, inventory, JSON, NPC, monster, and world-item APIs also include corrected or expanded behavior from this update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Accounts and consumables (4):&amp;lt;/strong&amp;gt; [[completePlayerConsumableFinalize]] &amp;amp;bull; [[completePlayerConsumableUse]] &amp;amp;bull; [[getPlayerAccountBindingSerial]] &amp;amp;bull; [[getPlayerConsumableNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;World items (1):&amp;lt;/strong&amp;gt; [[spawnItem]] &amp;amp;mdash; see also the [[World item catalog]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster identity, health, and combat (5):&amp;lt;/strong&amp;gt; [[setMonsterName]] &amp;amp;bull; [[setMonsterIdVisible]] &amp;amp;bull; [[setMonsterMaxHealth]] &amp;amp;bull; [[getMonsterAttackDamage]] &amp;amp;bull; [[setMonsterAttackDamage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster navigation (6):&amp;lt;/strong&amp;gt; [[setMonsterNavigationMode]] &amp;amp;bull; [[setMonsterNavigationCollisionMode]] &amp;amp;bull; [[setMonsterMoveGoal]] &amp;amp;bull; [[stopMonsterMovement]] &amp;amp;bull; [[testMonsterMove]] &amp;amp;bull; [[walkMonsterTo]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;NPC identity and navigation (7):&amp;lt;/strong&amp;gt; [[setNpcIdVisible]] &amp;amp;bull; [[setNpcObstacleBehavior]] &amp;amp;bull; [[setNpcNavigationMode]] &amp;amp;bull; [[setNpcNavigationCollisionMode]] &amp;amp;bull; [[setNpcMoveGoal]] &amp;amp;bull; [[stopNpcMovement]] &amp;amp;bull; [[testNpcMove]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Custom navigation blockers (6):&amp;lt;/strong&amp;gt; [[createAiNavigationBlocker]] &amp;amp;bull; [[updateAiNavigationBlocker]] &amp;amp;bull; [[setAiNavigationBlockerEnabled]] &amp;amp;bull; [[destroyAiNavigationBlocker]] &amp;amp;bull; [[getAiNavigationBlockerData]] &amp;amp;bull; [[getAiNavigationBlockers]] &amp;amp;mdash; see [[NPC and monster navigation collision]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client audio (11):&amp;lt;/strong&amp;gt; [[playSound]] &amp;amp;bull; [[playSound3D]] &amp;amp;bull; [[stopSound]] &amp;amp;bull; [[setSoundVolume]] &amp;amp;bull; [[getSoundVolume]] &amp;amp;bull; [[setSoundPaused]] &amp;amp;bull; [[isSoundPaused]] &amp;amp;bull; [[isSoundPlaying]] &amp;amp;bull; [[setSoundLooped]] &amp;amp;bull; [[setSound3DPosition]] &amp;amp;bull; [[setSound3DMinMaxDistance]] &amp;amp;mdash; see [[Client audio]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Events available from 0.1.2 (8):&amp;lt;/strong&amp;gt; [[onNpcIdVisibilityChange]] &amp;amp;bull; [[onMonsterNameChange]] &amp;amp;bull; [[onMonsterIdVisibilityChange]] &amp;amp;bull; [[onMonsterMoveBlocked]] &amp;amp;bull; [[onMonsterMoveComplete]] &amp;amp;bull; [[onNpcMoveBlocked]] &amp;amp;bull; [[onNpcMoveComplete]] &amp;amp;bull; [[onWorldItemDrop]]. Existing [[onPlayerJoin]], [[onPlayerQuit]], [[onWorldItemPickup]], and [[onWorldItemSpawn]] contracts are also improved from 0.1.2.&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; 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 — 0.1.3 BUILD81]]&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;[[Scripted camera|Scripted camera and moving login backgrounds (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Chapter screens|Custom chapter title cards (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Observer nameplates|Observer-specific labels and acquaintance presentation (0.1.3)]]&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;[[: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|Client audio functions]]&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;[[Known issue: MySQL error 2006 (Server has gone away)|Known MySQL/MariaDB issue]]&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;The reference contains &#039;&#039;&#039;312 Lua functions&#039;&#039;&#039; and &#039;&#039;&#039;94 events&#039;&#039;&#039;, including &#039;&#039;&#039;2 chapter-screen functions, 12 observer/nameplate-ID functions, 7 skin-color/tattoo functions, 15 camera functions and 2 camera events available from update 0.1.3&#039;&#039;&#039;. Version notices distinguish newly available APIs from improved contracts in earlier APIs. See [[Chapter screens]] for custom title cards, [[Observer nameplates]] for directional labels, [[Player customization]] for identity, color and tattoos, [[Lua API catalogs]] for validated gameplay keys, and [[Scripted camera]] for camera state and lifecycle rules. APIs marked [[:Category:Experimental Lua API|experimental]] may still change while the multiplayer runtime is under active development.&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=Hosting_a_G1R:MP_dedicated_server&amp;diff=887</id>
		<title>Hosting a G1R:MP dedicated server</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Hosting_a_G1R:MP_dedicated_server&amp;diff=887"/>
		<updated>2026-09-13T00:29:46Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Update hosting compatibility to 0.1.3 / Protocol 35&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Hosting a G1R:MP dedicated server}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= Hosting a G1R:MP dedicated server =&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.8rem 0 1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Public network access is required.&#039;&#039;&#039; A server hosted on your own computer still needs a publicly reachable address and the required ports opened or forwarded.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This requirement also applies when the dedicated server, launcher, and game are running on the same computer. The current 0.1.3 release uses Protocol 35 and the official G1R:MP service for server discovery and connection authorization, including direct-connect attempts. Private-only server addresses are not accepted for public registration. Update both the client and server; see [[Update 0.1.3]].&lt;br /&gt;
&lt;br /&gt;
The official service does not relay gameplay. After authorization, gameplay, voice, and resource traffic connects directly to the public endpoint advertised by the dedicated server. This architecture requires that endpoint to be reachable from the Internet.&lt;br /&gt;
&lt;br /&gt;
== Public address requirement ==&lt;br /&gt;
&lt;br /&gt;
The host must have either:&lt;br /&gt;
&lt;br /&gt;
* a public, externally reachable IP address; or&lt;br /&gt;
* a DNS name that resolves to that public address.&lt;br /&gt;
&lt;br /&gt;
Addresses such as &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;192.168.x.x&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;10.x.x.x&amp;lt;/code&amp;gt; are not reachable from the Internet.&lt;br /&gt;
&lt;br /&gt;
If the server is behind a home router, configure port forwarding from the router&#039;s public address to the computer&#039;s fixed LAN address. If the ISP uses carrier-grade NAT (CGNAT), ordinary router port forwarding is not sufficient; request a public IP address from the ISP or host the server on a publicly reachable VPS.&lt;br /&gt;
&lt;br /&gt;
For the standard automatic listing configuration, leave &amp;lt;code&amp;gt;listing.publicHost&amp;lt;/code&amp;gt; empty. The official service can use the source address of the server heartbeat. Set it only when advertising a public DNS name that resolves to the same server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[listing]&lt;br /&gt;
publicHost=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default ports ==&lt;br /&gt;
&lt;br /&gt;
The current default configuration uses the following ports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Purpose !! Default port !! Protocol !! Public access&lt;br /&gt;
|-&lt;br /&gt;
| Gameplay transport || &amp;lt;code&amp;gt;7777&amp;lt;/code&amp;gt; || UDP || Required&lt;br /&gt;
|-&lt;br /&gt;
| Voice relay || &amp;lt;code&amp;gt;7778&amp;lt;/code&amp;gt; || UDP || Required when voice chat is enabled&lt;br /&gt;
|-&lt;br /&gt;
| Resource download service || &amp;lt;code&amp;gt;7780&amp;lt;/code&amp;gt; || TCP || Required when &amp;lt;code&amp;gt;http.mode=auto&amp;lt;/code&amp;gt; or the built-in HTTP service is used&lt;br /&gt;
|-&lt;br /&gt;
| RCON administration || &amp;lt;code&amp;gt;7781&amp;lt;/code&amp;gt; || TCP || &#039;&#039;&#039;Do not expose&#039;&#039;&#039;; loopback-only by default&lt;br /&gt;
|-&lt;br /&gt;
| MariaDB/MySQL || &amp;lt;code&amp;gt;3307&amp;lt;/code&amp;gt; in the shipped Gothic RP configuration, or the locally configured database port (commonly &amp;lt;code&amp;gt;3306&amp;lt;/code&amp;gt;) || TCP || &#039;&#039;&#039;Do not expose&#039;&#039;&#039; when the database is on the same host&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The server also requires outbound HTTPS access, normally TCP port &amp;lt;code&amp;gt;443&amp;lt;/code&amp;gt;, to synchronize with the official G1R:MP service. This is an outbound connection and does not require router port forwarding.&lt;br /&gt;
&lt;br /&gt;
If any ports are changed in &amp;lt;code&amp;gt;serverconf.cfg&amp;lt;/code&amp;gt;, update the firewall and router rules to match the configured values.&lt;br /&gt;
&lt;br /&gt;
== Recommended bind configuration ==&lt;br /&gt;
&lt;br /&gt;
The public services should normally listen on all local interfaces:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
bind=0.0.0.0&lt;br /&gt;
port=7777&lt;br /&gt;
&lt;br /&gt;
[voice]&lt;br /&gt;
enabled=true&lt;br /&gt;
bind=0.0.0.0&lt;br /&gt;
port=7778&lt;br /&gt;
&lt;br /&gt;
[http]&lt;br /&gt;
mode=auto&lt;br /&gt;
bind=0.0.0.0&lt;br /&gt;
port=7780&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep RCON restricted to the local machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[rcon]&lt;br /&gt;
enabled=true&lt;br /&gt;
allowRemote=false&lt;br /&gt;
bind=127.0.0.1&lt;br /&gt;
port=7781&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Player capacity and server password ==&lt;br /&gt;
&lt;br /&gt;
Set the player limit and optional join password in the &amp;lt;code&amp;gt;[server]&amp;lt;/code&amp;gt; section. &amp;lt;code&amp;gt;maxPlayers&amp;lt;/code&amp;gt; accepts any integer from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;5000&amp;lt;/code&amp;gt;, inclusive. The server refuses to start when the value is outside that range.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
maxPlayers=500&lt;br /&gt;
password=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; setting supports three forms:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Configuration !! Result&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;password=&amp;lt;/code&amp;gt; || No join password. The server is advertised as public.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;password=a-literal-secret&amp;lt;/code&amp;gt; || Uses the literal value from &amp;lt;code&amp;gt;serverconf.cfg&amp;lt;/code&amp;gt;. A non-empty password must contain from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;password=env:VARIABLE&amp;lt;/code&amp;gt; || Reads the password from the named environment variable when the server starts. The resolved value must contain from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The environment-variable form keeps the credential out of &amp;lt;code&amp;gt;serverconf.cfg&amp;lt;/code&amp;gt; and is recommended for hosted servers. The variable name must be a valid environment-variable identifier, and the server stops during configuration loading if the variable is missing, empty, longer than 128 bytes, or contains a forbidden control character.&lt;br /&gt;
&lt;br /&gt;
Do not set &amp;lt;code&amp;gt;listing.passworded&amp;lt;/code&amp;gt; manually. The advertised &amp;lt;code&amp;gt;passworded&amp;lt;/code&amp;gt; value is derived automatically from the resolved &amp;lt;code&amp;gt;[server] password&amp;lt;/code&amp;gt;, so the server list and health response cannot claim a password policy different from the one enforced by the server.&lt;br /&gt;
&lt;br /&gt;
Before downloading resources, the launcher checks the server health response. It stops early when &amp;lt;code&amp;gt;players&amp;lt;/code&amp;gt; has reached &amp;lt;code&amp;gt;maxPlayers&amp;lt;/code&amp;gt;, and it requests a password when &amp;lt;code&amp;gt;passworded&amp;lt;/code&amp;gt; is true. These checks provide immediate feedback only: the dedicated server independently enforces the slot limit and validates the password during admission. A stale server-list entry or modified client cannot bypass either rule.&lt;br /&gt;
&lt;br /&gt;
== Resource package limits ==&lt;br /&gt;
&lt;br /&gt;
These expanded values apply from &#039;&#039;&#039;update 0.1.3 BUILD81&#039;&#039;&#039;. Older 0.1.3 clients must be updated. See [[Scripting limits]] and [[Server configuration limits]] for all other budgets and exact units.&lt;br /&gt;
&lt;br /&gt;
The dedicated server and client enforce matching compatibility limits for Lua scripts and downloadable resources. Values at a stated hard boundary are accepted; a resource that exceeds that boundary is rejected before it can run.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Limit !! Value !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| Lua script size || &amp;lt;code&amp;gt;128 MiB&amp;lt;/code&amp;gt; || Each individual &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; script.&lt;br /&gt;
|-&lt;br /&gt;
| Resource file size || &amp;lt;code&amp;gt;256 MiB&amp;lt;/code&amp;gt; || Each individual file included in the client resource catalog.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog file count || &amp;lt;code&amp;gt;262,144&amp;lt;/code&amp;gt; files || All client scripts and downloadable files across the complete catalog.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog payload || &amp;lt;code&amp;gt;32 GiB&amp;lt;/code&amp;gt; || Sum of the file sizes declared by the complete client resource catalog.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog JSON document || &amp;lt;code&amp;gt;128 MiB&amp;lt;/code&amp;gt; || Serialized &amp;lt;code&amp;gt;catalog.json&amp;lt;/code&amp;gt; metadata returned by the resource service.&lt;br /&gt;
|-&lt;br /&gt;
| Lua VM memory || &amp;lt;code&amp;gt;1024 MiB&amp;lt;/code&amp;gt; by default || Each client-side resource Lua VM uses the 1024 MiB default. For each server-side resource Lua VM, &amp;lt;code&amp;gt;[lua] memoryLimitMB&amp;lt;/code&amp;gt; is configurable from &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; MiB; the shipped default is &amp;lt;code&amp;gt;1024&amp;lt;/code&amp;gt; MiB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The dedicated server validates manifests, script sizes, file counts, payload totals, and catalog JSON size while building the catalog. The client validates the catalog and every downloaded file again before caching or executing it. When &amp;lt;code&amp;gt;http.mode=external&amp;lt;/code&amp;gt; is used, a CDN or reverse proxy may impose stricter transfer limits, but it cannot raise the limits enforced by the client.&lt;br /&gt;
&lt;br /&gt;
== Firewall examples ==&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Run PowerShell as Administrator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
New-NetFirewallRule -DisplayName &amp;quot;G1R:MP Gameplay&amp;quot; -Direction Inbound -Action Allow -Protocol UDP -LocalPort 7777&lt;br /&gt;
New-NetFirewallRule -DisplayName &amp;quot;G1R:MP Voice&amp;quot; -Direction Inbound -Action Allow -Protocol UDP -LocalPort 7778&lt;br /&gt;
New-NetFirewallRule -DisplayName &amp;quot;G1R:MP Resources&amp;quot; -Direction Inbound -Action Allow -Protocol TCP -LocalPort 7780&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux with UFW ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ufw allow 7777/udp&lt;br /&gt;
sudo ufw allow 7778/udp&lt;br /&gt;
sudo ufw allow 7780/tcp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a VPS or cloud host, add equivalent inbound rules to the provider firewall or security group as well as the operating-system firewall.&lt;br /&gt;
&lt;br /&gt;
== Testing reachability ==&lt;br /&gt;
&lt;br /&gt;
Test the server from a different Internet connection, such as another household or a mobile hotspot. Testing only from the same LAN can give misleading results because routers handle NAT loopback differently.&lt;br /&gt;
&lt;br /&gt;
A server appearing in the master list confirms that its outbound heartbeat reached the official service. It does not by itself prove that UDP &amp;lt;code&amp;gt;7777&amp;lt;/code&amp;gt;, UDP &amp;lt;code&amp;gt;7778&amp;lt;/code&amp;gt;, and TCP &amp;lt;code&amp;gt;7780&amp;lt;/code&amp;gt; are reachable from the Internet.&lt;br /&gt;
&lt;br /&gt;
Do not solve a connection problem by opening RCON or MariaDB publicly. Those services should remain private.&lt;br /&gt;
&lt;br /&gt;
[[Category:Server administration]]&lt;br /&gt;
[[Category:Networking]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=886</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=886"/>
		<updated>2026-09-13T00:29:43Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Announce official 0.1.3 / BUILD106 / Protocol 35&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&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;G1R:MP 0.1.3 — official release, BUILD106 / Protocol 35.&#039;&#039;&#039; Windows client and Windows/Linux dedicated server downloads are available on the [https://g1r-mp.com/download/ Download page]. Update both the client and server. See [[Update 0.1.3]] for scripting additions and migration notes.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold;&amp;quot;&amp;gt;CHAPTER SCREENS — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;2 new server-side functions&#039;&#039;&#039;: [[showChapterScreen|ShowChapterScreen]] and [[hideChapterScreen|HideChapterScreen]] (also available with lower-camel aliases). Show custom chapter-style title cards without advancing the story. See [[Chapter screens]] for examples, validation, resource ownership and &amp;lt;code&amp;gt;/chaptertest&amp;lt;/code&amp;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;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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;OBSERVER NAMEPLATES — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;12 new server-side functions&#039;&#039;&#039; add per-observer text, whole-label visibility and numeric-ID policy. Build directional acquaintance presentation with exclusive resource-owned fields and reliable relevance replay. See [[Observer nameplates]] for APIs, lifecycle, database integration and the optional three-client &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; sequence. Overhead customization does not anonymize other packets, chat or player lists.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;PLAYER CUSTOMIZATION — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;7 new server-side functions&#039;&#039;&#039; provide independent skin-color and tattoo overrides. Existing identity selection has improved head and armor compatibility from update 0.1.3. See [[Player customization]] for examples and reset behavior, and [[Player tattoo catalog]] for all 12 keys.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Skin color:&amp;lt;/strong&amp;gt; [[setPlayerSkinColor]] &amp;amp;bull; [[getPlayerSkinColor]] &amp;amp;bull; [[resetPlayerSkinColor]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Tattoos:&amp;lt;/strong&amp;gt; [[setPlayerTattoo]] &amp;amp;bull; [[getPlayerTattoo]] &amp;amp;bull; [[resetPlayerTattoo]] &amp;amp;bull; [[getPlayerTattooNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Improved existing API:&amp;lt;/strong&amp;gt; [[setPlayerIdentity]] keeps the game-owned body and equipped armor. These are cosmetic controls, not a full NPC body/outfit replacement.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;SCRIPTED CAMERA — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;15 camera functions&#039;&#039;&#039; and &#039;&#039;&#039;2 client camera events&#039;&#039;&#039; are available from G1R:MP 0.1.3. Build login backgrounds, fixed shots, smooth transitions, paths and orbits. See [[Scripted camera]] for examples, limits and client/server differences.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client and server (10):&amp;lt;/strong&amp;gt; [[setCameraPos]] &amp;amp;bull; [[setCameraRot]] &amp;amp;bull; [[setCameraLookAt]] &amp;amp;bull; [[setCameraFOV]] &amp;amp;bull; [[setCameraPose]] &amp;amp;bull; [[moveCameraTo]] &amp;amp;bull; [[playCameraPath]] &amp;amp;bull; [[orbitCamera]] &amp;amp;bull; [[stopCameraMovement]] &amp;amp;bull; [[resetCameraPos]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client read-back (5):&amp;lt;/strong&amp;gt; [[getCameraPos]] &amp;amp;bull; [[getCameraRot]] &amp;amp;bull; [[getCameraFOV]] &amp;amp;bull; [[getCameraState]] &amp;amp;bull; [[requestCameraState]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client events (2):&amp;lt;/strong&amp;gt; [[onClientCameraCommandResult]] &amp;amp;bull; [[onClientCameraReset]]. Client commands use asynchronous acknowledgements; server calls return only a queued boolean.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE AND IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;The following &#039;&#039;&#039;40 Lua functions&#039;&#039;&#039; &amp;amp;mdash; 29 server-side and 11 client-side &amp;amp;mdash; are available from G1R:MP 0.1.2. Existing lifecycle, inventory, JSON, NPC, monster, and world-item APIs also include corrected or expanded behavior from this update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Accounts and consumables (4):&amp;lt;/strong&amp;gt; [[completePlayerConsumableFinalize]] &amp;amp;bull; [[completePlayerConsumableUse]] &amp;amp;bull; [[getPlayerAccountBindingSerial]] &amp;amp;bull; [[getPlayerConsumableNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;World items (1):&amp;lt;/strong&amp;gt; [[spawnItem]] &amp;amp;mdash; see also the [[World item catalog]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster identity, health, and combat (5):&amp;lt;/strong&amp;gt; [[setMonsterName]] &amp;amp;bull; [[setMonsterIdVisible]] &amp;amp;bull; [[setMonsterMaxHealth]] &amp;amp;bull; [[getMonsterAttackDamage]] &amp;amp;bull; [[setMonsterAttackDamage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster navigation (6):&amp;lt;/strong&amp;gt; [[setMonsterNavigationMode]] &amp;amp;bull; [[setMonsterNavigationCollisionMode]] &amp;amp;bull; [[setMonsterMoveGoal]] &amp;amp;bull; [[stopMonsterMovement]] &amp;amp;bull; [[testMonsterMove]] &amp;amp;bull; [[walkMonsterTo]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;NPC identity and navigation (7):&amp;lt;/strong&amp;gt; [[setNpcIdVisible]] &amp;amp;bull; [[setNpcObstacleBehavior]] &amp;amp;bull; [[setNpcNavigationMode]] &amp;amp;bull; [[setNpcNavigationCollisionMode]] &amp;amp;bull; [[setNpcMoveGoal]] &amp;amp;bull; [[stopNpcMovement]] &amp;amp;bull; [[testNpcMove]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Custom navigation blockers (6):&amp;lt;/strong&amp;gt; [[createAiNavigationBlocker]] &amp;amp;bull; [[updateAiNavigationBlocker]] &amp;amp;bull; [[setAiNavigationBlockerEnabled]] &amp;amp;bull; [[destroyAiNavigationBlocker]] &amp;amp;bull; [[getAiNavigationBlockerData]] &amp;amp;bull; [[getAiNavigationBlockers]] &amp;amp;mdash; see [[NPC and monster navigation collision]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client audio (11):&amp;lt;/strong&amp;gt; [[playSound]] &amp;amp;bull; [[playSound3D]] &amp;amp;bull; [[stopSound]] &amp;amp;bull; [[setSoundVolume]] &amp;amp;bull; [[getSoundVolume]] &amp;amp;bull; [[setSoundPaused]] &amp;amp;bull; [[isSoundPaused]] &amp;amp;bull; [[isSoundPlaying]] &amp;amp;bull; [[setSoundLooped]] &amp;amp;bull; [[setSound3DPosition]] &amp;amp;bull; [[setSound3DMinMaxDistance]] &amp;amp;mdash; see [[Client audio]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Events available from 0.1.2 (8):&amp;lt;/strong&amp;gt; [[onNpcIdVisibilityChange]] &amp;amp;bull; [[onMonsterNameChange]] &amp;amp;bull; [[onMonsterIdVisibilityChange]] &amp;amp;bull; [[onMonsterMoveBlocked]] &amp;amp;bull; [[onMonsterMoveComplete]] &amp;amp;bull; [[onNpcMoveBlocked]] &amp;amp;bull; [[onNpcMoveComplete]] &amp;amp;bull; [[onWorldItemDrop]]. Existing [[onPlayerJoin]], [[onPlayerQuit]], [[onWorldItemPickup]], and [[onWorldItemSpawn]] contracts are also improved from 0.1.2.&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; 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 — 0.1.3 BUILD81]]&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;[[Scripted camera|Scripted camera and moving login backgrounds (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Chapter screens|Custom chapter title cards (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Observer nameplates|Observer-specific labels and acquaintance presentation (0.1.3)]]&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;[[: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|Client audio functions]]&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;[[Known issue: MySQL error 2006 (Server has gone away)|Known MySQL/MariaDB issue]]&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;The reference contains &#039;&#039;&#039;312 Lua functions&#039;&#039;&#039; and &#039;&#039;&#039;94 events&#039;&#039;&#039;, including &#039;&#039;&#039;2 chapter-screen functions, 12 observer/nameplate-ID functions, 7 skin-color/tattoo functions, 15 camera functions and 2 camera events available from update 0.1.3&#039;&#039;&#039;. Version notices distinguish newly available APIs from improved contracts in earlier APIs. See [[Chapter screens]] for custom title cards, [[Observer nameplates]] for directional labels, [[Player customization]] for identity, color and tattoos, [[Lua API catalogs]] for validated gameplay keys, and [[Scripted camera]] for camera state and lifecycle rules. APIs marked [[:Category:Experimental Lua API|experimental]] may still change while the multiplayer runtime is under active development.&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=Update_0.1.3&amp;diff=885</id>
		<title>Update 0.1.3</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Update_0.1.3&amp;diff=885"/>
		<updated>2026-09-13T00:29:40Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Publish official 0.1.3 release and migration guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:G1R:MP Update 0.1.3}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= Update 0.1.3 =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Official release: 0.1.3, BUILD106, Protocol 35.&#039;&#039;&#039; Download the Windows x64 client and matching Windows x64 or Linux x86_64 dedicated server from the [https://g1r-mp.com/download/ official Download page]. The Windows launcher uses the existing automatic update channel.&lt;br /&gt;
&lt;br /&gt;
== Update both sides ==&lt;br /&gt;
&lt;br /&gt;
Protocol 35 requires a matching client and dedicated server. Back up your server configuration, resources and database before upgrading. Stop the dedicated server before replacing its binaries; preserve your own gamemode and configuration rather than overwriting them with examples. The supplied Gothic RP database password is &amp;lt;code&amp;gt;CHANGE_ME&amp;lt;/code&amp;gt; and must be configured locally.&lt;br /&gt;
&lt;br /&gt;
The public version is &amp;lt;code&amp;gt;0.1.3&amp;lt;/code&amp;gt;. Windows Explorer shows the client file version &amp;lt;code&amp;gt;0.1.3.106&amp;lt;/code&amp;gt;; the final number is the launcher build, not a separate Lua API version. See [[Hosting a G1R:MP dedicated server]] for network and port requirements.&lt;br /&gt;
&lt;br /&gt;
== Scripting available from 0.1.3 ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scripted camera:&#039;&#039;&#039; 15 functions and two client events. Set position, rotation, look-at and FOV; animate transitions, paths and orbits; reset to normal gameplay. See [[Scripted camera]].&lt;br /&gt;
* &#039;&#039;&#039;Player appearance:&#039;&#039;&#039; seven functions for skin color and tattoos, with improved compatibility for the existing identity API. See [[Player customization]] and [[Player tattoo catalog]].&lt;br /&gt;
* &#039;&#039;&#039;Observer-specific nameplates:&#039;&#039;&#039; 12 server functions for per-observer labels, visibility and ID policy. Gamemodes can persist their own directional acquaintance records in a database. See [[Observer nameplates]].&lt;br /&gt;
* &#039;&#039;&#039;Custom chapter title cards:&#039;&#039;&#039; [[showChapterScreen|ShowChapterScreen]] and [[hideChapterScreen|HideChapterScreen]] display presentation-only cards without advancing the story. See [[Chapter screens]].&lt;br /&gt;
* &#039;&#039;&#039;Expanded scripting budgets:&#039;&#039;&#039; see [[Scripting limits]] for the current client/server limits, including timers and resource budgets.&lt;br /&gt;
&lt;br /&gt;
Function pages specify the execution side, accepted arguments, return values and asynchronous acknowledgement rules. Version annotations refer to API availability; they do not make server-only functions callable from client resources.&lt;br /&gt;
&lt;br /&gt;
== Examples and test commands ==&lt;br /&gt;
&lt;br /&gt;
The included Gothic RP resources provide &amp;lt;code&amp;gt;/cameratest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/looktest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/chaptertest&amp;lt;/code&amp;gt;. Use the linked guides for syntax and prerequisites. Keep administrative test commands restricted to trusted users on public servers. Existing gamemodes are not replaced automatically by the client updater.&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
The API reference contains &#039;&#039;&#039;312 function pages and 94 event pages&#039;&#039;&#039;. Start with [[Main Page]], [[Lua API catalogs]] and [[Lua events]].&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=Main_Page&amp;diff=884</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=884"/>
		<updated>2026-09-12T18:33:06Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document ShowChapterScreen/HideChapterScreen available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold;&amp;quot;&amp;gt;CHAPTER SCREENS — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;2 new server-side functions&#039;&#039;&#039;: [[showChapterScreen|ShowChapterScreen]] and [[hideChapterScreen|HideChapterScreen]] (also available with lower-camel aliases). Show custom chapter-style title cards without advancing the story. See [[Chapter screens]] for examples, validation, resource ownership and &amp;lt;code&amp;gt;/chaptertest&amp;lt;/code&amp;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;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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;OBSERVER NAMEPLATES — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;12 new server-side functions&#039;&#039;&#039; add per-observer text, whole-label visibility and numeric-ID policy. Build directional acquaintance presentation with exclusive resource-owned fields and reliable relevance replay. See [[Observer nameplates]] for APIs, lifecycle, database integration and the optional three-client &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; sequence. Overhead customization does not anonymize other packets, chat or player lists.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;PLAYER CUSTOMIZATION — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;7 new server-side functions&#039;&#039;&#039; provide independent skin-color and tattoo overrides. Existing identity selection has improved head and armor compatibility from update 0.1.3. See [[Player customization]] for examples and reset behavior, and [[Player tattoo catalog]] for all 12 keys.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Skin color:&amp;lt;/strong&amp;gt; [[setPlayerSkinColor]] &amp;amp;bull; [[getPlayerSkinColor]] &amp;amp;bull; [[resetPlayerSkinColor]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Tattoos:&amp;lt;/strong&amp;gt; [[setPlayerTattoo]] &amp;amp;bull; [[getPlayerTattoo]] &amp;amp;bull; [[resetPlayerTattoo]] &amp;amp;bull; [[getPlayerTattooNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Improved existing API:&amp;lt;/strong&amp;gt; [[setPlayerIdentity]] keeps the game-owned body and equipped armor. These are cosmetic controls, not a full NPC body/outfit replacement.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;SCRIPTED CAMERA — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;15 camera functions&#039;&#039;&#039; and &#039;&#039;&#039;2 client camera events&#039;&#039;&#039; are available from G1R:MP 0.1.3. Build login backgrounds, fixed shots, smooth transitions, paths and orbits. See [[Scripted camera]] for examples, limits and client/server differences.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client and server (10):&amp;lt;/strong&amp;gt; [[setCameraPos]] &amp;amp;bull; [[setCameraRot]] &amp;amp;bull; [[setCameraLookAt]] &amp;amp;bull; [[setCameraFOV]] &amp;amp;bull; [[setCameraPose]] &amp;amp;bull; [[moveCameraTo]] &amp;amp;bull; [[playCameraPath]] &amp;amp;bull; [[orbitCamera]] &amp;amp;bull; [[stopCameraMovement]] &amp;amp;bull; [[resetCameraPos]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client read-back (5):&amp;lt;/strong&amp;gt; [[getCameraPos]] &amp;amp;bull; [[getCameraRot]] &amp;amp;bull; [[getCameraFOV]] &amp;amp;bull; [[getCameraState]] &amp;amp;bull; [[requestCameraState]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client events (2):&amp;lt;/strong&amp;gt; [[onClientCameraCommandResult]] &amp;amp;bull; [[onClientCameraReset]]. Client commands use asynchronous acknowledgements; server calls return only a queued boolean.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE AND IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;The following &#039;&#039;&#039;40 Lua functions&#039;&#039;&#039; &amp;amp;mdash; 29 server-side and 11 client-side &amp;amp;mdash; are available from G1R:MP 0.1.2. Existing lifecycle, inventory, JSON, NPC, monster, and world-item APIs also include corrected or expanded behavior from this update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Accounts and consumables (4):&amp;lt;/strong&amp;gt; [[completePlayerConsumableFinalize]] &amp;amp;bull; [[completePlayerConsumableUse]] &amp;amp;bull; [[getPlayerAccountBindingSerial]] &amp;amp;bull; [[getPlayerConsumableNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;World items (1):&amp;lt;/strong&amp;gt; [[spawnItem]] &amp;amp;mdash; see also the [[World item catalog]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster identity, health, and combat (5):&amp;lt;/strong&amp;gt; [[setMonsterName]] &amp;amp;bull; [[setMonsterIdVisible]] &amp;amp;bull; [[setMonsterMaxHealth]] &amp;amp;bull; [[getMonsterAttackDamage]] &amp;amp;bull; [[setMonsterAttackDamage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster navigation (6):&amp;lt;/strong&amp;gt; [[setMonsterNavigationMode]] &amp;amp;bull; [[setMonsterNavigationCollisionMode]] &amp;amp;bull; [[setMonsterMoveGoal]] &amp;amp;bull; [[stopMonsterMovement]] &amp;amp;bull; [[testMonsterMove]] &amp;amp;bull; [[walkMonsterTo]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;NPC identity and navigation (7):&amp;lt;/strong&amp;gt; [[setNpcIdVisible]] &amp;amp;bull; [[setNpcObstacleBehavior]] &amp;amp;bull; [[setNpcNavigationMode]] &amp;amp;bull; [[setNpcNavigationCollisionMode]] &amp;amp;bull; [[setNpcMoveGoal]] &amp;amp;bull; [[stopNpcMovement]] &amp;amp;bull; [[testNpcMove]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Custom navigation blockers (6):&amp;lt;/strong&amp;gt; [[createAiNavigationBlocker]] &amp;amp;bull; [[updateAiNavigationBlocker]] &amp;amp;bull; [[setAiNavigationBlockerEnabled]] &amp;amp;bull; [[destroyAiNavigationBlocker]] &amp;amp;bull; [[getAiNavigationBlockerData]] &amp;amp;bull; [[getAiNavigationBlockers]] &amp;amp;mdash; see [[NPC and monster navigation collision]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client audio (11):&amp;lt;/strong&amp;gt; [[playSound]] &amp;amp;bull; [[playSound3D]] &amp;amp;bull; [[stopSound]] &amp;amp;bull; [[setSoundVolume]] &amp;amp;bull; [[getSoundVolume]] &amp;amp;bull; [[setSoundPaused]] &amp;amp;bull; [[isSoundPaused]] &amp;amp;bull; [[isSoundPlaying]] &amp;amp;bull; [[setSoundLooped]] &amp;amp;bull; [[setSound3DPosition]] &amp;amp;bull; [[setSound3DMinMaxDistance]] &amp;amp;mdash; see [[Client audio]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Events available from 0.1.2 (8):&amp;lt;/strong&amp;gt; [[onNpcIdVisibilityChange]] &amp;amp;bull; [[onMonsterNameChange]] &amp;amp;bull; [[onMonsterIdVisibilityChange]] &amp;amp;bull; [[onMonsterMoveBlocked]] &amp;amp;bull; [[onMonsterMoveComplete]] &amp;amp;bull; [[onNpcMoveBlocked]] &amp;amp;bull; [[onNpcMoveComplete]] &amp;amp;bull; [[onWorldItemDrop]]. Existing [[onPlayerJoin]], [[onPlayerQuit]], [[onWorldItemPickup]], and [[onWorldItemSpawn]] contracts are also improved from 0.1.2.&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; 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 — 0.1.3 BUILD81]]&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;[[Scripted camera|Scripted camera and moving login backgrounds (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Chapter screens|Custom chapter title cards (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Observer nameplates|Observer-specific labels and acquaintance presentation (0.1.3)]]&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;[[: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|Client audio functions]]&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;[[Known issue: MySQL error 2006 (Server has gone away)|Known MySQL/MariaDB issue]]&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;The reference contains &#039;&#039;&#039;312 Lua functions&#039;&#039;&#039; and &#039;&#039;&#039;94 events&#039;&#039;&#039;, including &#039;&#039;&#039;2 chapter-screen functions, 12 observer/nameplate-ID functions, 7 skin-color/tattoo functions, 15 camera functions and 2 camera events available from update 0.1.3&#039;&#039;&#039;. Version notices distinguish newly available APIs from improved contracts in earlier APIs. See [[Chapter screens]] for custom title cards, [[Observer nameplates]] for directional labels, [[Player customization]] for identity, color and tattoos, [[Lua API catalogs]] for validated gameplay keys, and [[Scripted camera]] for camera state and lifecycle rules. APIs marked [[:Category:Experimental Lua API|experimental]] may still change while the multiplayer runtime is under active development.&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=Chapter_screens&amp;diff=883</id>
		<title>Chapter screens</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Chapter_screens&amp;diff=883"/>
		<updated>2026-09-12T18:33:05Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document ShowChapterScreen/HideChapterScreen available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Chapter screens =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVAILABLE FROM UPDATE 0.1.3&#039;&#039;&#039; — introduced in BUILD85. Use a server and client that both include chapter-screen support. An older protocol-34 client is not sufficient merely because it can connect.&lt;br /&gt;
&lt;br /&gt;
[[showChapterScreen|ShowChapterScreen]] displays a custom, passive chapter-style title card to one player. [[hideChapterScreen|HideChapterScreen]] requests early removal. The lower-camel aliases &amp;lt;code&amp;gt;showChapterScreen&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;hideChapterScreen&amp;lt;/code&amp;gt; behave identically.&lt;br /&gt;
&lt;br /&gt;
This is a presentation API, &#039;&#039;&#039;not a story/chapter progression API&#039;&#039;&#039;. It does not change quests, saves or the current chapter, and does not start chapter music or a native cutscene. It uses the game&#039;s chapter-style widget with fixed background artwork and no image/audio options. It does not request input focus.&lt;br /&gt;
&lt;br /&gt;
== Server-side example ==&lt;br /&gt;
Call after the player&#039;s character is available, for example from an authenticated server command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local accepted = ShowChapterScreen(playerId, &amp;quot;CHAPTER I&amp;quot;, &amp;quot;Welcome to the Colony&amp;quot;, 6000)&lt;br /&gt;
-- accepted means the server accepted delivery, not a client render acknowledgement.&lt;br /&gt;
&lt;br /&gt;
-- When the same resource needs to remove its card early:&lt;br /&gt;
-- HideChapterScreen(playerId)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An empty heading is valid. Omit the fourth argument for 6000 ms; do not pass &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; explicitly. There are no new chapter-screen Lua events or client-side Lua bindings.&lt;br /&gt;
&lt;br /&gt;
== Validation and limits ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Accepted value&lt;br /&gt;
|-&lt;br /&gt;
| playerId || Connected player ID, finite integer 1–4294967295.&lt;br /&gt;
|-&lt;br /&gt;
| heading || UTF-8 string, 0–256 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| title || UTF-8 string, 1–512 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| durationMs || Finite integer 1000–30000 ms; default 6000 ms.&lt;br /&gt;
|-&lt;br /&gt;
| Presentation || One custom card per player. A later show replaces the previous card; no display backlog.&lt;br /&gt;
|-&lt;br /&gt;
| Resource ownership || Up to 8192 distinct tracked player IDs per server resource. Explicit hide/resource cleanup releases tracking; automatic visual expiry is not a Lua acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| Native pending commands || Bounded queue of 32; excess pending commands can be discarded. At most three widget-creation attempts, 500 ms apart.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Limits on strings count &#039;&#039;&#039;UTF-8 bytes&#039;&#039;&#039;, not characters. Invalid UTF-8, NUL, control characters and line breaks (including Unicode line/paragraph separators) are rejected. Text is literal: &amp;lt;code&amp;gt;&amp;amp;lt;b&amp;amp;gt;Title&amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; is not markup. Show accepts exactly three or four arguments; hide accepts exactly one.&lt;br /&gt;
&lt;br /&gt;
== Ownership and lifetime ==&lt;br /&gt;
* The latest show becomes the current resource-owned card, including when another resource previously displayed one.&lt;br /&gt;
* An old resource&#039;s hide/cleanup cannot remove another resource&#039;s replacement card. A successful server-side hide is not proof that a visible card was removed.&lt;br /&gt;
* Cards expire automatically. Duration starts when the native client processes the show and includes the fades, not server/network delay.&lt;br /&gt;
* Disconnect, resource cleanup and player-pawn replacement clear the corresponding presentation. This API is not a pre-spawn loading-screen facility.&lt;br /&gt;
* This API is separate from multiplayer suppression of native story triggers. It does &#039;&#039;&#039;not&#039;&#039;&#039; provide a general switch for disabling story regions, ladder events, conversations or cinematics.&lt;br /&gt;
&lt;br /&gt;
== Bundled GothicRP test ==&lt;br /&gt;
The test requires an authenticated player and affects only the caller:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/chaptertest&amp;lt;/code&amp;gt; — default six-second card.&lt;br /&gt;
* &amp;lt;code&amp;gt;/chaptertest show My custom title&amp;lt;/code&amp;gt; — custom title.&lt;br /&gt;
* &amp;lt;code&amp;gt;/chaptertest unicode&amp;lt;/code&amp;gt; — Unicode text.&lt;br /&gt;
* &amp;lt;code&amp;gt;/chaptertest literal&amp;lt;/code&amp;gt; — verifies literal text instead of markup.&lt;br /&gt;
* &amp;lt;code&amp;gt;/chaptertest replace&amp;lt;/code&amp;gt; — replaces an older card immediately.&lt;br /&gt;
* &amp;lt;code&amp;gt;/chaptertest long My title&amp;lt;/code&amp;gt; — 30-second card.&lt;br /&gt;
* &amp;lt;code&amp;gt;/chaptertest hide&amp;lt;/code&amp;gt; — early hide from the same resource.&lt;br /&gt;
&lt;br /&gt;
Check expiration, replacement, movement and native menus/GUI clicks. These are bundled test commands, not additional public Lua functions.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Lua Examples]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=HideChapterScreen&amp;diff=882</id>
		<title>HideChapterScreen</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=HideChapterScreen&amp;diff=882"/>
		<updated>2026-09-12T18:33:03Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document ShowChapterScreen/HideChapterScreen available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= hideChapterScreen =&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.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 G1R:MP 0.1.3 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;
Request early removal of the calling resource&#039;s custom chapter title card for one player. See [[showChapterScreen]] and [[Chapter screens]].&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 HideChapterScreen(int playerId)&lt;br /&gt;
bool hideChapterScreen(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 an owned hide request is accepted for delivery. Returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for invalid arguments, a disconnected player, no tracked chapter ownership for this resource/player, or a rejected runtime action. This is not a client-render acknowledgement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Hide a title card previously requested by this same resource:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
HideChapterScreen(playerId)&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;
* Available from update 0.1.3 (introduced in BUILD85), with matching client support.&lt;br /&gt;
* Both spellings in Syntax are aliases. Exactly one argument is accepted.&lt;br /&gt;
* Only the current owner can remove the displayed custom card. If another resource replaced it, an older resource&#039;s accepted hide is ignored by the client and does not hide the new card.&lt;br /&gt;
* The server ownership record is not a visibility query: automatic client expiry does not acknowledge an early hide to Lua. Do not use the return value to determine whether a card was visible.&lt;br /&gt;
* The custom card also expires automatically; resource cleanup, disconnect and player-pawn replacement clear the corresponding presentation. This function does not change the story or cancel arbitrary native cutscenes.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Player Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ShowChapterScreen&amp;diff=881</id>
		<title>ShowChapterScreen</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ShowChapterScreen&amp;diff=881"/>
		<updated>2026-09-12T18:33:02Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document ShowChapterScreen/HideChapterScreen available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= showChapterScreen =&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.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 G1R:MP 0.1.3 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;
Show a custom chapter-style title card to one player. Presentation only: this does not advance the story, quests or the saved chapter. See [[Chapter screens]].&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 ShowChapterScreen(int playerId, string heading, string title [, int durationMs = 6000])&lt;br /&gt;
bool showChapterScreen(int playerId, string heading, string title [, int durationMs = 6000])&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;heading&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Top line: valid UTF-8, 0–256 bytes; an empty string is allowed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Main line: valid UTF-8, 1–512 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;durationMs&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || no || Integer 1000–30000 milliseconds, default 6000. Omit this argument to use the default; explicit nil is invalid.&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 request for delivery. This is not confirmation that the client rendered it. Returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for invalid arguments, a disconnected player, an ownership-capacity limit or a rejected runtime action.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Call from a server-side command or event after the player&#039;s character is available:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
ShowChapterScreen(playerId, &amp;quot;CHAPTER I&amp;quot;, &amp;quot;Welcome to the Colony&amp;quot;, 6000)&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;
* Available from update 0.1.3 (introduced in BUILD85). Both server and client must support this API; matching protocol 34 alone is not sufficient for older clients.&lt;br /&gt;
* Both spellings in Syntax are aliases of the same function; they are not separate screens.&lt;br /&gt;
* Text is literal, not HTML/RML. Control characters, NUL and line breaks are rejected. UTF-8 limits are bytes, not visible characters.&lt;br /&gt;
* One custom chapter screen per player: a later show replaces the previous one, including a screen from another resource. No backlog is retained.&lt;br /&gt;
* The screen expires automatically. Duration starts when the native client processes the request and includes its fade-in/fade-out, not network delay.&lt;br /&gt;
* Use [[hideChapterScreen]] for an early hide. Hiding and resource cleanup cannot remove a screen currently owned by another resource.&lt;br /&gt;
* The server tracks at most 8192 distinct player IDs per resource for chapter ownership until explicit hide/resource cleanup; an already tracked ID can be reused.&lt;br /&gt;
* This passive native title card does not request input focus or start chapter gameplay, a cinematic or chapter music. Background artwork is fixed; this API exposes no image/audio parameters.&lt;br /&gt;
* Do not use as a pre-spawn loading screen. The native client has a bounded 32-command pending queue and at most three widget-creation attempts at 500 ms intervals.&lt;br /&gt;
* The bundled GothicRP test command is &amp;lt;code&amp;gt;/chaptertest&amp;lt;/code&amp;gt;; see [[Chapter screens]] for variants.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Player Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=AddEventHandler&amp;diff=880</id>
		<title>AddEventHandler</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=AddEventHandler&amp;diff=880"/>
		<updated>2026-09-12T11:51:54Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= addEventHandler =&lt;br /&gt;
Attaches a Lua callback to a named event in the current 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;
bool addEventHandler(string eventName, element attachedTo, function handler)&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;eventName&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || The event to listen for.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attachedTo&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;element&amp;lt;/code&amp;gt; || yes || The attachment target. Use &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; for a global resource handler.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;handler&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; || yes || The callback invoked when the event is triggered.&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 handler is registered; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Handle a custom event:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addEvent(&amp;quot;quest:updated&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function onQuestUpdated(questId)&lt;br /&gt;
    print(&amp;quot;Quest updated:&amp;quot;, questId)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;quest:updated&amp;quot;, root, onQuestUpdated)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available in both client-side and server-side resource scripts.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. Client limits: 8192 total handlers per resource and 512 handlers per event. The server has no matching fixed handler-count cap. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Shared Functions]]&lt;br /&gt;
[[Category:Event Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=AddEvent&amp;diff=879</id>
		<title>AddEvent</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=AddEvent&amp;diff=879"/>
		<updated>2026-09-12T11:51:52Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= addEvent =&lt;br /&gt;
Declares a custom event for the current 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;
bool addEvent(string eventName [, bool allowRemoteTrigger = false])&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;eventName&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || The custom event name, up to 128 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowRemoteTrigger&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || no || Whether the event may be triggered across the client/server boundary.&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 event is declared successfully. On the server it returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; if the event was already declared.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Declare a server event that clients may trigger:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addEvent(&amp;quot;inventory:request&amp;quot;, true)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available in both client-side and server-side resource scripts.&lt;br /&gt;
* Only enable remote triggering for events whose arguments and permissions are validated by the receiver.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. Client limit: 4096 declared remote event names per resource; the server has no matching fixed declaration-count cap. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Shared Functions]]&lt;br /&gt;
[[Category:Event Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetTimer&amp;diff=878</id>
		<title>SetTimer</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetTimer&amp;diff=878"/>
		<updated>2026-09-12T11:51:51Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setTimer =&lt;br /&gt;
Schedules a Lua function to run after a delay, optionally more than once.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
int setTimer(function callback, int intervalMs, int timesToExecute, ...)&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;callback&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; || yes || The function to execute.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;intervalMs&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || Delay between executions in milliseconds. The minimum is 10.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;timesToExecute&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || Number of executions. Use 0 to repeat indefinitely.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;any&amp;lt;/code&amp;gt; || no || Optional values passed to the callback each time it runs.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns a positive timer identifier on success, or &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; when the timer could not be created.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Print a message three times at one-second intervals:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local timer = setTimer(function(message)&lt;br /&gt;
    print(message)&lt;br /&gt;
end, 1000, 3, &amp;quot;One second passed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available in both client-side and server-side resource scripts.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. Client limits: 8192 timers per resource, at most 256 selected callbacks per tick, oldest deadline first, and 32 callback arguments. The server has no corresponding fixed timer-count or callbacks-per-tick cap; memory and execution budgets still apply. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Shared Functions]]&lt;br /&gt;
[[Category:Timer Functions]]&lt;br /&gt;
[[Category:Utility Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=PlaySound3D&amp;diff=877</id>
		<title>PlaySound3D</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=PlaySound3D&amp;diff=877"/>
		<updated>2026-09-12T11:51:50Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= playSound3D =&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 function 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;
Starts a positional OGG Vorbis sound at a world position owned by the current client 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;
number|false playSound3D(string relativePath, number x, number y, number z [, bool looped = false, number volume = 1, number minDistance = 1, number maxDistance = 50])&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;relativePath&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || The exact relative path of a same-resource &amp;lt;code&amp;gt;&amp;amp;lt;file download=&amp;quot;join&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; entry ending in &amp;lt;code&amp;gt;.ogg&amp;lt;/code&amp;gt;.&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; || yes || World X coordinate in metres.&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; || yes || World Y coordinate in metres.&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; || yes || World Z coordinate in metres.&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 playback should loop; defaults to false.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Initial linear volume from 0 to 1; defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;minDistance&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Distance in metres at or below which the sound retains full volume; defaults to 1.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;maxDistance&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Distance in metres at or beyond which the sound is silent; defaults to 50.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns a non-zero resource-owned sound handle, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when validation, integrity verification, decoding, or playback setup fails.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Play a looping forge sound in the world:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local forge = playSound3D(&lt;br /&gt;
    &amp;quot;sounds/forge.ogg&amp;quot;,&lt;br /&gt;
    125.5, -48.0, 3.25,&lt;br /&gt;
    true, 0.8, 2.0, 45.0&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in client-side resource scripts.&lt;br /&gt;
* Coordinates and attenuation distances use metres. Coordinates must be finite and remain within +/-1,000,000 metres on every axis.&lt;br /&gt;
* The minimum distance must be at least 0.01 metres. The maximum must be greater than the minimum and no greater than 10,000 metres.&lt;br /&gt;
* Positional audio is downmixed to mono as a point source. It remains at full gain through &amp;lt;code&amp;gt;minDistance&amp;lt;/code&amp;gt;, fades linearly, and is silent at and beyond &amp;lt;code&amp;gt;maxDistance&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Resource audio uses the normal Windows default playback endpoint. The communications-device selection is reserved for voice microphone capture and does not reroute 3D playback.&lt;br /&gt;
* The native player transform is sampled for the listener only while at least one spatial sound exists; this path does not use Angelscript and does not install a ProcessEvent hook.&lt;br /&gt;
* The same declaration, path, integrity, codec, ownership, and active-sound limits as &amp;lt;code&amp;gt;playSound&amp;lt;/code&amp;gt; apply.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. Client limits: 128 owned sounds per resource and 512 globally. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Client Functions]]&lt;br /&gt;
[[Category:Audio Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=PlaySound&amp;diff=876</id>
		<title>PlaySound</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=PlaySound&amp;diff=876"/>
		<updated>2026-09-12T11:51:49Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= playSound =&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 function 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;
Starts a non-spatial OGG Vorbis sound owned by the current client 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;
number|false playSound(string relativePath [, bool looped = false, number volume = 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;relativePath&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || The exact relative path of a same-resource &amp;lt;code&amp;gt;&amp;amp;lt;file download=&amp;quot;join&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; entry ending in &amp;lt;code&amp;gt;.ogg&amp;lt;/code&amp;gt;.&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 playback should loop; defaults to false.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || no || Initial linear volume from 0 to 1; defaults to 1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns a non-zero resource-owned sound handle, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when validation, integrity verification, decoding, or playback setup fails.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Play a client UI notification:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local sound = playSound(&amp;quot;sounds/notification.ogg&amp;quot;, false, 0.65)&lt;br /&gt;
if not sound then&lt;br /&gt;
    outputDebugString(&amp;quot;Could not start notification audio&amp;quot;, 2)&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 client-side resource scripts.&lt;br /&gt;
* The first audio release supports Ogg Vorbis. An Ogg container using another codec, such as Opus, is not accepted.&lt;br /&gt;
* The file must be declared for join-time download by the current resource. URLs, absolute paths, traversal, reparse-point escapes, undeclared files, and files owned by another resource are rejected.&lt;br /&gt;
* The runtime revalidates the file size and SHA-256 from the signed resource catalog before decoding it.&lt;br /&gt;
* Resource audio uses the normal Windows default playback endpoint. The communications-device selection is reserved for voice microphone capture and does not reroute 2D or 3D playback.&lt;br /&gt;
* 2D playback preserves the source channel layout. When source and output sample rates differ, the runtime converts once with the bundled libsamplerate 0.2.2 sinc converter using &amp;lt;code&amp;gt;SRC_SINC_MEDIUM_QUALITY&amp;lt;/code&amp;gt; and bypasses miniaudio&#039;s pitch-oriented linear converter.&lt;br /&gt;
* Each resource may own at most 128 active sounds; the client runtime may own at most 512 in total.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Client Functions]]&lt;br /&gt;
[[Category:Audio Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=BindKey&amp;diff=875</id>
		<title>BindKey</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=BindKey&amp;diff=875"/>
		<updated>2026-09-12T11:51:47Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bindKey =&lt;br /&gt;
Binds a keyboard or mouse key to a client-side Lua callback and consumes the corresponding game input while the binding is active.&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 bindKey(string keyName, string keyState, function handler [, mixed arguments...])&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;keyName&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || The case-insensitive key name, for example &amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mouse1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;keyState&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || The transition to handle: &amp;lt;code&amp;gt;down&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;up&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;both&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;handler&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; || yes || The callback invoked as &amp;lt;code&amp;gt;handler(keyName, keyState, ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;arguments...&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mixed&amp;lt;/code&amp;gt; || no || Optional nil, boolean, number or string values appended to every callback invocation.&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 binding is registered, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid key, invalid state, duplicate binding or exhausted resource limit.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Show a scoreboard while Tab is held:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local function handleScoreboard(keyName, keyState)&lt;br /&gt;
    if keyState == &amp;quot;down&amp;quot; then&lt;br /&gt;
        guiShow(scoreboard)&lt;br /&gt;
        guiSetInputActive(scoreboard, true)&lt;br /&gt;
    else&lt;br /&gt;
        guiSetInputActive(scoreboard, false)&lt;br /&gt;
        guiHide(scoreboard)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
bindKey(&amp;quot;tab&amp;quot;, &amp;quot;both&amp;quot;, handleScoreboard)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available only in client-side resource scripts.&lt;br /&gt;
* Bindings are owned by the creating resource and are removed automatically when that resource stops.&lt;br /&gt;
* A new binding does not begin while another RmlUi document owns text or pointer input. A key-up transition belonging to an active binding is still delivered so the UI can close safely.&lt;br /&gt;
* The client runtime polls keys only while the G1R window is focused. It does not install a global keyboard hook and does not use Unreal ProcessEvent.&lt;br /&gt;
* Each resource may register at most 1024 bindings.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Client Functions]]&lt;br /&gt;
[[Category:Input Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetNpcRoute&amp;diff=874</id>
		<title>SetNpcRoute</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetNpcRoute&amp;diff=874"/>
		<updated>2026-09-12T11:51:46Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setNpcRoute =&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;
Assigns an ordered, optionally looping movement route to 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;
bool setNpcRoute(int npcId, table points [, table options])&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;points&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || A one-based array of 1-1024 points. Every point has x, y and z in metres and may have yaw in degrees and waitMs from 0 to 3600000.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || no || Optional &amp;lt;code&amp;gt;{ loop = bool, speed = number, obstacleBehavior = string }&amp;lt;/code&amp;gt;; speed is 0.1-12 metres per second and defaults to 1. Available since update 0.1.2, &amp;lt;code&amp;gt;obstacleBehavior&amp;lt;/code&amp;gt; accepts &amp;lt;code&amp;gt;&amp;quot;wait&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;avoid&amp;quot;&amp;lt;/code&amp;gt;. When omitted, the NPC keeps its current mode; a newly spawned NPC starts in &amp;lt;code&amp;gt;&amp;quot;wait&amp;quot;&amp;lt;/code&amp;gt; mode.&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 route is validated and started; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Patrol between two guard posts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setNpcRoute(npcId, {&lt;br /&gt;
    { x = 10, y = 5, z = 2, yaw = 90, waitMs = 1500 },&lt;br /&gt;
    { x = 18, y = 5, z = 2, yaw = 270, waitMs = 1500 },&lt;br /&gt;
}, { loop = true, speed = 1.8, obstacleBehavior = &amp;quot;avoid&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;
* Movement is simulated by the server and replicated as normal smoothed remote snapshots.&lt;br /&gt;
* Every ground route leg is resolved through the conservative server navigation-blocker layer. An unreachable route is rejected; movement never falls back to the authored straight line through a blocker.&lt;br /&gt;
* Dynamic capsule spacing keeps NPCs separate from players, monsters and other NPCs. It never permits an NPC to pass through another character.&lt;br /&gt;
* The &amp;lt;code&amp;gt;obstacleBehavior&amp;lt;/code&amp;gt; option is available since update 0.1.2. Its default &amp;lt;code&amp;gt;&amp;quot;wait&amp;quot;&amp;lt;/code&amp;gt; mode stops the NPC until a blocking dynamic capsule clears. &amp;lt;code&amp;gt;&amp;quot;avoid&amp;quot;&amp;lt;/code&amp;gt; attempts a safe detour and continues toward the waypoint, falling back to waiting when no valid detour exists.&lt;br /&gt;
* Route progress emits &amp;lt;code&amp;gt;onNpcRoutePoint&amp;lt;/code&amp;gt; and non-looping completion emits &amp;lt;code&amp;gt;onNpcRouteComplete&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&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;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=CreateAiNavigationBlocker&amp;diff=873</id>
		<title>CreateAiNavigationBlocker</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=CreateAiNavigationBlocker&amp;diff=873"/>
		<updated>2026-09-12T11:51:45Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= createAiNavigationBlocker =&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 function 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;
Creates a resource-owned static navigation blocker used by server-simulated NPCs and monsters.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
string|false createAiNavigationBlocker(table definition)&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;definition&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || yes || A validated &amp;lt;code&amp;gt;box&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cylinder&amp;lt;/code&amp;gt;, or convex &amp;lt;code&amp;gt;polygon&amp;lt;/code&amp;gt; definition in metres.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns a new opaque decimal blocker ID string, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when the definition is invalid or a bounded resource/server limit is reached.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Block a rotated doorway volume:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local blockerId = createAiNavigationBlocker({&lt;br /&gt;
    shape = &amp;quot;box&amp;quot;,&lt;br /&gt;
    x = 125.0, y = -48.0, z = 2.0,&lt;br /&gt;
    width = 2.5, depth = 0.8, height = 4.0,&lt;br /&gt;
    yaw = 30,&lt;br /&gt;
})&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;
* All coordinates and dimensions use metres. A box uses centre &amp;lt;code&amp;gt;x/y/z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;, and optional yaw in degrees. A cylinder uses centre &amp;lt;code&amp;gt;x/y/z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;radius&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;. Each dimension must be 0.01-10000 metres.&lt;br /&gt;
* A polygon uses &amp;lt;code&amp;gt;points = {{x=...,y=...}, ...}&amp;lt;/code&amp;gt; with 3-16 vertices plus &amp;lt;code&amp;gt;minZ&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;maxZ&amp;lt;/code&amp;gt;. It must be finite, simple and convex; clockwise input is normalized. Coordinates are limited to +/-100000 metres.&lt;br /&gt;
* Optional &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; defaults to true. The server permits at most 4096 blockers per resource and 16384 total, and also bounds spatial-index growth.&lt;br /&gt;
* The blocker is visible to every AI entity whose collision mode includes the custom layer, not only entities owned by the creating resource. Only the creating resource may inspect, update, enable, disable or destroy it.&lt;br /&gt;
* Stopping or restarting the owning resource removes all of its blockers automatically. Dynamic player, NPC and monster capsule collision is separate and always remains active.&lt;br /&gt;
* Use custom blockers for static geometry and occasional changes such as opening or closing a gate. Moving or toggling blockers every server tick is unsupported; moving characters already use the mandatory dynamic capsule layer.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&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:Navigation Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Create3DText&amp;diff=872</id>
		<title>Create3DText</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Create3DText&amp;diff=872"/>
		<updated>2026-09-12T11:51:44Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= create3DText =&lt;br /&gt;
Creates a server-authoritative world-space text label and replicates it to connected players.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
string|false create3DText(string text, number x, number y, number z [, table options])&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;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Valid UTF-8 text containing 1-128 characters and at most 256 bytes.&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; || yes || World X coordinate in metres.&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; || yes || World Y coordinate in metres.&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; || yes || World Z coordinate in metres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || no || Optional fields: drawDistance (1-1000 metres), scale (0.25-5.0), and integer r, g, b, a color channels (0-255).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns an opaque text identifier string on success, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when validation or capacity limits reject the request.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Create a gold world label above an RP meeting point:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local meetingLabel = create3DText(&lt;br /&gt;
    &amp;quot;Old Camp meeting point&amp;quot;,&lt;br /&gt;
    125.0, -48.5, 3.2,&lt;br /&gt;
    {&lt;br /&gt;
        drawDistance = 40.0,&lt;br /&gt;
        scale = 0.85,&lt;br /&gt;
        r = 225, g = 185, b = 91, a = 255&lt;br /&gt;
    }&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
if not meetingLabel then&lt;br /&gt;
    outputDebugString(&amp;quot;Could not create the meeting label&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 server replicates creation and updates reliably, including the current state for late-joining players.&lt;br /&gt;
* The creating resource owns the label. Other resources cannot change or destroy it, and it is removed automatically when its owner stops.&lt;br /&gt;
* A resource may own up to 1024 labels, with a server-wide maximum of 8192 labels.&lt;br /&gt;
* Store the returned identifier as a string. Do not convert it to a Lua number.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&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=RequestRemote&amp;diff=871</id>
		<title>RequestRemote</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=RequestRemote&amp;diff=871"/>
		<updated>2026-09-12T11:51:42Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= requestRemote =&lt;br /&gt;
Queues a bounded asynchronous HTTP or HTTPS request from a server-side 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;
number|false requestRemote(string url [, table options], function callback [, table callbackArguments])&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;url&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || The absolute public &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt; URL to request, up to 2048 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || no || Optional request settings: &amp;lt;code&amp;gt;method&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;postData&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;headers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;username&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;connectionAttempts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;connectTimeout&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;maxRedirects&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callback&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; || yes || Called as &amp;lt;code&amp;gt;callback(responseBody, responseInfo, ...callbackArguments)&amp;lt;/code&amp;gt; on the resource&#039;s server tick.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callbackArguments&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; || no || Optional one-based array whose values are appended to the callback arguments.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns a numeric request identifier when queued, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when validation, service availability, or resource limits reject the request.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Example 1 ===&lt;br /&gt;
Read and decode a JSON response:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local requestId = requestRemote(&amp;quot;https://api.example.com/status&amp;quot;, {&lt;br /&gt;
    headers = { Accept = &amp;quot;application/json&amp;quot; },&lt;br /&gt;
    connectTimeout = 3000,&lt;br /&gt;
    timeout = 10000&lt;br /&gt;
}, function(body, info, label)&lt;br /&gt;
    if not info.success then&lt;br /&gt;
        outputDebugString(label .. &amp;quot; failed: &amp;quot; .. (info.error or &amp;quot;unknown error&amp;quot;))&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local data, errorMessage = fromJSON(body)&lt;br /&gt;
    if data == false then&lt;br /&gt;
        outputDebugString(errorMessage)&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    outputDebugString(label .. &amp;quot; returned HTTP &amp;quot; .. info.statusCode)&lt;br /&gt;
end, {&amp;quot;status service&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Example 2 ===&lt;br /&gt;
Send a JSON POST request:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local payload = assert(toJSON({ event = &amp;quot;player_join&amp;quot;, playerId = playerId }))&lt;br /&gt;
&lt;br /&gt;
requestRemote(&amp;quot;https://api.example.com/events&amp;quot;, {&lt;br /&gt;
    method = &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body = payload,&lt;br /&gt;
    headers = { [&amp;quot;Content-Type&amp;quot;] = &amp;quot;application/json&amp;quot; }&lt;br /&gt;
}, function(body, info)&lt;br /&gt;
    if not info.success then&lt;br /&gt;
        outputDebugString(info.error or &amp;quot;Remote request failed&amp;quot;)&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 callback information table contains &amp;lt;code&amp;gt;requestId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;success&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;statusCode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;headers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;effectiveUrl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bytesReceived&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;durationMs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;attempts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;aborted&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Only HTTP and HTTPS are accepted. Loopback, private, link-local, reserved, documentation, and mixed public/private DNS results are rejected. Every redirect target is resolved and validated again.&lt;br /&gt;
* DNS answers are pinned for each transfer to prevent rebinding between validation and connection. TLS certificate and hostname verification remain enabled.&lt;br /&gt;
* Hard limits are 4 MiB request bodies, 8 MiB response bodies, 128 request headers, 256 response headers, 64 KiB aggregate header bytes, 3 attempts, 10 seconds to connect, 30 seconds total and 3 redirects. Compiled service defaults: 8 workers, 256 queued work items and 32 pending requests per resource.&lt;br /&gt;
* If a body is supplied without an explicit method, the method defaults to &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Credentials remain server-side, but resources should still avoid placing secrets in URLs or logs.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Server Functions]]&lt;br /&gt;
[[Category:Utility Functions]]&lt;br /&gt;
[[Category:HTTP Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=FromJSON&amp;diff=870</id>
		<title>FromJSON</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=FromJSON&amp;diff=870"/>
		<updated>2026-09-12T11:51:41Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fromJSON =&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;
Parses bounded JSON into Lua values.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
mixed|false value, string|nil error = fromJSON(string json)&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;json&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || A UTF-8 JSON document up to 1 MiB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns the decoded value and &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; on success. On failure it returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; and an error string.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Decode a JSON payload safely:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local value, errorMessage = fromJSON(payload)&lt;br /&gt;
if value == false then&lt;br /&gt;
    outputDebugString(errorMessage)&lt;br /&gt;
else&lt;br /&gt;
    outputDebugString(tostring(value.ready))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available in both server-side and client-side resource scripts.&lt;br /&gt;
* JSON is limited to 1 MiB, 64 nested levels, and 65536 cumulative entries.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Shared Functions]]&lt;br /&gt;
[[Category:Utility Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ToJSON&amp;diff=869</id>
		<title>ToJSON</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ToJSON&amp;diff=869"/>
		<updated>2026-09-12T11:51:40Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= toJSON =&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;
Serializes a supported Lua value to bounded JSON.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
string|false json, string|nil error = toJSON(mixed 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;value&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mixed&amp;lt;/code&amp;gt; || yes || A nil, boolean, finite number, string, or acyclic table containing supported values.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns the JSON string and &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; on success. On failure it returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; and an error string.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Encode a compact payload:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local json, errorMessage = toJSON({ playerId = playerId, ready = true })&lt;br /&gt;
if not json then&lt;br /&gt;
    outputDebugString(errorMessage)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Available in both server-side and client-side resource scripts.&lt;br /&gt;
* JSON is limited to 1 MiB, 64 nested levels, and 65536 cumulative entries.&lt;br /&gt;
* Expanded limits apply from update 0.1.3 BUILD81. See [[Scripting limits]]; earlier 0.1.3 binaries retain their old limits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua Functions]]&lt;br /&gt;
[[Category:Shared Functions]]&lt;br /&gt;
[[Category:Utility Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Client_audio&amp;diff=868</id>
		<title>Client audio</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Client_audio&amp;diff=868"/>
		<updated>2026-09-12T11:51:38Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Client audio}}&lt;br /&gt;
&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;Resource-owned OGG Vorbis playback, including positional 3D sound, is available in G1R:MP 0.1.2 and later.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Client audio&#039;&#039;&#039; lets a client-side Lua resource play non-spatial interface sounds and positional world sounds. Audio handles belong to the resource that created them and cannot be controlled by another resource.&lt;br /&gt;
&lt;br /&gt;
== Supported files ==&lt;br /&gt;
&lt;br /&gt;
The first release accepts Ogg containers containing &#039;&#039;&#039;Vorbis&#039;&#039;&#039; audio. Ogg Opus and other codecs are not accepted. Every sound must be declared as a join-time file in the same resource:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scripts&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;client.lua&amp;quot; type=&amp;quot;client&amp;quot; cache=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;file src=&amp;quot;sounds/notification.ogg&amp;quot; download=&amp;quot;join&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;file src=&amp;quot;sounds/forge.ogg&amp;quot; download=&amp;quot;join&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/scripts&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The runtime accepts only the exact relative path declared by the current resource. URLs, absolute paths, traversal with &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;, reparse-point escapes, undeclared files, and files owned by another resource are rejected. File size and SHA-256 are checked again against the signed resource catalog before decoding.&lt;br /&gt;
&lt;br /&gt;
== Audio functions ==&lt;br /&gt;
&lt;br /&gt;
* [[playSound]] creates a non-spatial 2D sound.&lt;br /&gt;
* [[playSound3D]] creates a positional sound at world coordinates.&lt;br /&gt;
* [[stopSound]] stops a sound and invalidates its handle.&lt;br /&gt;
* [[setSoundVolume]] and [[getSoundVolume]] control linear volume.&lt;br /&gt;
* [[setSoundPaused]] and [[isSoundPaused]] control and inspect pause state.&lt;br /&gt;
* [[isSoundPlaying]] checks active playback.&lt;br /&gt;
* [[setSoundLooped]] changes looping.&lt;br /&gt;
* [[setSound3DPosition]] moves a positional source.&lt;br /&gt;
* [[setSound3DMinMaxDistance]] changes its attenuation range.&lt;br /&gt;
&lt;br /&gt;
== Playback quality and output device ==&lt;br /&gt;
&lt;br /&gt;
2D playback preserves the source channel layout, so stereo material remains stereo. A positional source is downmixed to mono because it represents one point in the world. When source and output sample rates differ, the runtime converts once with the bundled libsamplerate 0.2.2 sinc converter using &amp;lt;code&amp;gt;SRC_SINC_MEDIUM_QUALITY&amp;lt;/code&amp;gt; and bypasses miniaudio&#039;s pitch-oriented linear converter. Matching sample rates are not resampled.&lt;br /&gt;
&lt;br /&gt;
Resource audio and voice playback use the normal Windows default playback device. The Windows communications-device selection is used only for voice microphone capture; it does not redirect or reduce the quality of 2D or 3D playback.&lt;br /&gt;
&lt;br /&gt;
For 3D sound, volume remains full through &amp;lt;code&amp;gt;minDistance&amp;lt;/code&amp;gt;, then fades linearly and is silent at and beyond &amp;lt;code&amp;gt;maxDistance&amp;lt;/code&amp;gt;. Coordinates and distances use metres. The listener follows the local native player while at least one positional sound exists.&lt;br /&gt;
&lt;br /&gt;
== Local playback ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local notification = playSound(&amp;quot;sounds/notification.ogg&amp;quot;, false, 0.65)&lt;br /&gt;
&lt;br /&gt;
local forge = playSound3D(&lt;br /&gt;
    &amp;quot;sounds/forge.ogg&amp;quot;,&lt;br /&gt;
    125.5, -48.0, 3.25,&lt;br /&gt;
    true, 0.8,&lt;br /&gt;
    2.0, 45.0&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
if forge then&lt;br /&gt;
    setSound3DPosition(forge, 126.0, -48.0, 3.25)&lt;br /&gt;
    setSound3DMinMaxDistance(forge, 2.0, 60.0)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Playing the same 3D sound for every player ==&lt;br /&gt;
&lt;br /&gt;
Audio functions are client-side. To initiate a world sound authoritatively, the server sends a validated event to the client scripts. Using &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; as the target broadcasts the same reliable ordered event to every connected player.&lt;br /&gt;
&lt;br /&gt;
Calculate the source position once on the server and send identical world coordinates to all clients. Do not recalculate the source from each receiving player&#039;s position.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;server.lua&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;forgeaudio&amp;quot;, function(playerId)&lt;br /&gt;
    local position = getPlayerPosition(playerId)&lt;br /&gt;
    if not position then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    triggerClientEvent(&lt;br /&gt;
        root,&lt;br /&gt;
        &amp;quot;forgeAudio:play&amp;quot;,&lt;br /&gt;
        resourceRoot,&lt;br /&gt;
        position.x + 4.0,&lt;br /&gt;
        position.y,&lt;br /&gt;
        position.z&lt;br /&gt;
    )&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;client.lua&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local forgeSound = false&lt;br /&gt;
&lt;br /&gt;
addEvent(&amp;quot;forgeAudio:play&amp;quot;, true)&lt;br /&gt;
addEventHandler(&amp;quot;forgeAudio:play&amp;quot;, resourceRoot, function(x, y, z)&lt;br /&gt;
    if forgeSound then&lt;br /&gt;
        stopSound(forgeSound)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    forgeSound = playSound3D(&lt;br /&gt;
        &amp;quot;sounds/forge.ogg&amp;quot;,&lt;br /&gt;
        x, y, z,&lt;br /&gt;
        true, 0.8,&lt;br /&gt;
        1.0, 30.0&lt;br /&gt;
    )&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each client creates its own local handle. Stopping, moving, pausing, or changing a shared sound therefore requires another server event broadcast to the same clients. Delivery is reliable and ordered, but playback start is not sample-accurate and can differ slightly due to network jitter.&lt;br /&gt;
&lt;br /&gt;
== Ownership and limits ==&lt;br /&gt;
&lt;br /&gt;
* From update 0.1.3 BUILD81, a resource can own at most 128 active sounds; the client runtime can own at most 512 in total (previously 32/128). See [[Scripting limits]].&lt;br /&gt;
* A handle can be controlled only by the resource that created it.&lt;br /&gt;
* Stopping a resource releases all sounds that it still owns.&lt;br /&gt;
* A stopped or finished handle must not be reused.&lt;br /&gt;
* Validation and playback failures are recorded in the client runtime log.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Lua Tutorials]]&lt;br /&gt;
[[Category:Audio Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Hosting_a_G1R:MP_dedicated_server&amp;diff=867</id>
		<title>Hosting a G1R:MP dedicated server</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Hosting_a_G1R:MP_dedicated_server&amp;diff=867"/>
		<updated>2026-09-12T11:51:35Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Hosting a G1R:MP dedicated server}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= Hosting a G1R:MP dedicated server =&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.8rem 0 1.2rem;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Public network access is required.&#039;&#039;&#039; A server hosted on your own computer still needs a publicly reachable address and the required ports opened or forwarded.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This requirement also applies when the dedicated server, launcher, and game are running on the same computer. Protocol 26 uses the official G1R:MP service for server discovery and connection authorization, including direct-connect attempts. Private-only server addresses are not accepted for public registration.&lt;br /&gt;
&lt;br /&gt;
The official service does not relay gameplay. After authorization, gameplay, voice, and resource traffic connects directly to the public endpoint advertised by the dedicated server. This architecture requires that endpoint to be reachable from the Internet.&lt;br /&gt;
&lt;br /&gt;
== Public address requirement ==&lt;br /&gt;
&lt;br /&gt;
The host must have either:&lt;br /&gt;
&lt;br /&gt;
* a public, externally reachable IP address; or&lt;br /&gt;
* a DNS name that resolves to that public address.&lt;br /&gt;
&lt;br /&gt;
Addresses such as &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;192.168.x.x&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;10.x.x.x&amp;lt;/code&amp;gt; are not reachable from the Internet.&lt;br /&gt;
&lt;br /&gt;
If the server is behind a home router, configure port forwarding from the router&#039;s public address to the computer&#039;s fixed LAN address. If the ISP uses carrier-grade NAT (CGNAT), ordinary router port forwarding is not sufficient; request a public IP address from the ISP or host the server on a publicly reachable VPS.&lt;br /&gt;
&lt;br /&gt;
For the standard automatic listing configuration, leave &amp;lt;code&amp;gt;listing.publicHost&amp;lt;/code&amp;gt; empty. The official service can use the source address of the server heartbeat. Set it only when advertising a public DNS name that resolves to the same server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[listing]&lt;br /&gt;
publicHost=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default ports ==&lt;br /&gt;
&lt;br /&gt;
The current default configuration uses the following ports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Purpose !! Default port !! Protocol !! Public access&lt;br /&gt;
|-&lt;br /&gt;
| Gameplay transport || &amp;lt;code&amp;gt;7777&amp;lt;/code&amp;gt; || UDP || Required&lt;br /&gt;
|-&lt;br /&gt;
| Voice relay || &amp;lt;code&amp;gt;7778&amp;lt;/code&amp;gt; || UDP || Required when voice chat is enabled&lt;br /&gt;
|-&lt;br /&gt;
| Resource download service || &amp;lt;code&amp;gt;7780&amp;lt;/code&amp;gt; || TCP || Required when &amp;lt;code&amp;gt;http.mode=auto&amp;lt;/code&amp;gt; or the built-in HTTP service is used&lt;br /&gt;
|-&lt;br /&gt;
| RCON administration || &amp;lt;code&amp;gt;7781&amp;lt;/code&amp;gt; || TCP || &#039;&#039;&#039;Do not expose&#039;&#039;&#039;; loopback-only by default&lt;br /&gt;
|-&lt;br /&gt;
| MariaDB/MySQL || &amp;lt;code&amp;gt;3307&amp;lt;/code&amp;gt; in the shipped Gothic RP configuration, or the locally configured database port (commonly &amp;lt;code&amp;gt;3306&amp;lt;/code&amp;gt;) || TCP || &#039;&#039;&#039;Do not expose&#039;&#039;&#039; when the database is on the same host&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The server also requires outbound HTTPS access, normally TCP port &amp;lt;code&amp;gt;443&amp;lt;/code&amp;gt;, to synchronize with the official G1R:MP service. This is an outbound connection and does not require router port forwarding.&lt;br /&gt;
&lt;br /&gt;
If any ports are changed in &amp;lt;code&amp;gt;serverconf.cfg&amp;lt;/code&amp;gt;, update the firewall and router rules to match the configured values.&lt;br /&gt;
&lt;br /&gt;
== Recommended bind configuration ==&lt;br /&gt;
&lt;br /&gt;
The public services should normally listen on all local interfaces:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
bind=0.0.0.0&lt;br /&gt;
port=7777&lt;br /&gt;
&lt;br /&gt;
[voice]&lt;br /&gt;
enabled=true&lt;br /&gt;
bind=0.0.0.0&lt;br /&gt;
port=7778&lt;br /&gt;
&lt;br /&gt;
[http]&lt;br /&gt;
mode=auto&lt;br /&gt;
bind=0.0.0.0&lt;br /&gt;
port=7780&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep RCON restricted to the local machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[rcon]&lt;br /&gt;
enabled=true&lt;br /&gt;
allowRemote=false&lt;br /&gt;
bind=127.0.0.1&lt;br /&gt;
port=7781&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Player capacity and server password ==&lt;br /&gt;
&lt;br /&gt;
Set the player limit and optional join password in the &amp;lt;code&amp;gt;[server]&amp;lt;/code&amp;gt; section. &amp;lt;code&amp;gt;maxPlayers&amp;lt;/code&amp;gt; accepts any integer from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;5000&amp;lt;/code&amp;gt;, inclusive. The server refuses to start when the value is outside that range.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
maxPlayers=500&lt;br /&gt;
password=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; setting supports three forms:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Configuration !! Result&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;password=&amp;lt;/code&amp;gt; || No join password. The server is advertised as public.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;password=a-literal-secret&amp;lt;/code&amp;gt; || Uses the literal value from &amp;lt;code&amp;gt;serverconf.cfg&amp;lt;/code&amp;gt;. A non-empty password must contain from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;password=env:VARIABLE&amp;lt;/code&amp;gt; || Reads the password from the named environment variable when the server starts. The resolved value must contain from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The environment-variable form keeps the credential out of &amp;lt;code&amp;gt;serverconf.cfg&amp;lt;/code&amp;gt; and is recommended for hosted servers. The variable name must be a valid environment-variable identifier, and the server stops during configuration loading if the variable is missing, empty, longer than 128 bytes, or contains a forbidden control character.&lt;br /&gt;
&lt;br /&gt;
Do not set &amp;lt;code&amp;gt;listing.passworded&amp;lt;/code&amp;gt; manually. The advertised &amp;lt;code&amp;gt;passworded&amp;lt;/code&amp;gt; value is derived automatically from the resolved &amp;lt;code&amp;gt;[server] password&amp;lt;/code&amp;gt;, so the server list and health response cannot claim a password policy different from the one enforced by the server.&lt;br /&gt;
&lt;br /&gt;
Before downloading resources, the launcher checks the server health response. It stops early when &amp;lt;code&amp;gt;players&amp;lt;/code&amp;gt; has reached &amp;lt;code&amp;gt;maxPlayers&amp;lt;/code&amp;gt;, and it requests a password when &amp;lt;code&amp;gt;passworded&amp;lt;/code&amp;gt; is true. These checks provide immediate feedback only: the dedicated server independently enforces the slot limit and validates the password during admission. A stale server-list entry or modified client cannot bypass either rule.&lt;br /&gt;
&lt;br /&gt;
== Resource package limits ==&lt;br /&gt;
&lt;br /&gt;
These expanded values apply from &#039;&#039;&#039;update 0.1.3 BUILD81&#039;&#039;&#039;. Older 0.1.3 clients must be updated. See [[Scripting limits]] and [[Server configuration limits]] for all other budgets and exact units.&lt;br /&gt;
&lt;br /&gt;
The dedicated server and client enforce matching compatibility limits for Lua scripts and downloadable resources. Values at a stated hard boundary are accepted; a resource that exceeds that boundary is rejected before it can run.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Limit !! Value !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| Lua script size || &amp;lt;code&amp;gt;128 MiB&amp;lt;/code&amp;gt; || Each individual &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; script.&lt;br /&gt;
|-&lt;br /&gt;
| Resource file size || &amp;lt;code&amp;gt;256 MiB&amp;lt;/code&amp;gt; || Each individual file included in the client resource catalog.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog file count || &amp;lt;code&amp;gt;262,144&amp;lt;/code&amp;gt; files || All client scripts and downloadable files across the complete catalog.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog payload || &amp;lt;code&amp;gt;32 GiB&amp;lt;/code&amp;gt; || Sum of the file sizes declared by the complete client resource catalog.&lt;br /&gt;
|-&lt;br /&gt;
| Catalog JSON document || &amp;lt;code&amp;gt;128 MiB&amp;lt;/code&amp;gt; || Serialized &amp;lt;code&amp;gt;catalog.json&amp;lt;/code&amp;gt; metadata returned by the resource service.&lt;br /&gt;
|-&lt;br /&gt;
| Lua VM memory || &amp;lt;code&amp;gt;1024 MiB&amp;lt;/code&amp;gt; by default || Each client-side resource Lua VM uses the 1024 MiB default. For each server-side resource Lua VM, &amp;lt;code&amp;gt;[lua] memoryLimitMB&amp;lt;/code&amp;gt; is configurable from &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; MiB; the shipped default is &amp;lt;code&amp;gt;1024&amp;lt;/code&amp;gt; MiB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The dedicated server validates manifests, script sizes, file counts, payload totals, and catalog JSON size while building the catalog. The client validates the catalog and every downloaded file again before caching or executing it. When &amp;lt;code&amp;gt;http.mode=external&amp;lt;/code&amp;gt; is used, a CDN or reverse proxy may impose stricter transfer limits, but it cannot raise the limits enforced by the client.&lt;br /&gt;
&lt;br /&gt;
== Firewall examples ==&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Run PowerShell as Administrator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
New-NetFirewallRule -DisplayName &amp;quot;G1R:MP Gameplay&amp;quot; -Direction Inbound -Action Allow -Protocol UDP -LocalPort 7777&lt;br /&gt;
New-NetFirewallRule -DisplayName &amp;quot;G1R:MP Voice&amp;quot; -Direction Inbound -Action Allow -Protocol UDP -LocalPort 7778&lt;br /&gt;
New-NetFirewallRule -DisplayName &amp;quot;G1R:MP Resources&amp;quot; -Direction Inbound -Action Allow -Protocol TCP -LocalPort 7780&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux with UFW ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ufw allow 7777/udp&lt;br /&gt;
sudo ufw allow 7778/udp&lt;br /&gt;
sudo ufw allow 7780/tcp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a VPS or cloud host, add equivalent inbound rules to the provider firewall or security group as well as the operating-system firewall.&lt;br /&gt;
&lt;br /&gt;
== Testing reachability ==&lt;br /&gt;
&lt;br /&gt;
Test the server from a different Internet connection, such as another household or a mobile hotspot. Testing only from the same LAN can give misleading results because routers handle NAT loopback differently.&lt;br /&gt;
&lt;br /&gt;
A server appearing in the master list confirms that its outbound heartbeat reached the official service. It does not by itself prove that UDP &amp;lt;code&amp;gt;7777&amp;lt;/code&amp;gt;, UDP &amp;lt;code&amp;gt;7778&amp;lt;/code&amp;gt;, and TCP &amp;lt;code&amp;gt;7780&amp;lt;/code&amp;gt; are reachable from the Internet.&lt;br /&gt;
&lt;br /&gt;
Do not solve a connection problem by opening RCON or MariaDB publicly. Those services should remain private.&lt;br /&gt;
&lt;br /&gt;
[[Category:Server administration]]&lt;br /&gt;
[[Category:Networking]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Lua_API_catalogs&amp;diff=866</id>
		<title>Lua API catalogs</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Lua_API_catalogs&amp;diff=866"/>
		<updated>2026-09-12T11:51:34Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Lua API catalogs}}&lt;br /&gt;
&lt;br /&gt;
See [[Scripting limits|current Lua, resource and API limits for 0.1.3 BUILD81]], [[Server configuration limits|all numeric server configuration bounds]] and [[Player statistic limits|all 59 statistic ranges]].&lt;br /&gt;
&#039;&#039;&#039;Lua API catalogs&#039;&#039;&#039; collect stable, server-validated keys used by G1R:MP resources. Prefer catalog keys and enumeration functions over hard-coded Unreal paths.&lt;br /&gt;
&lt;br /&gt;
== Static catalogs ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Catalog !! Used by&lt;br /&gt;
|-&lt;br /&gt;
| [[Player skin catalog]] || [[setPlayerSkin]], [[setNpcSkin]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player body catalog]] || deprecated compatibility reference for [[setPlayerBody]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player face catalog]] || deprecated compatibility reference for [[setPlayerFace]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player head catalog]] || deprecated compatibility reference for [[setPlayerHead]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player identity catalog]] || supported complete identity setter [[setPlayerIdentity]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player tattoo catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.3)&amp;lt;/span&amp;gt; || [[setPlayerTattoo]], [[getPlayerTattooNames]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Synchronized spell catalog]] || basic synchronized spell set for G1R:MP 0.1a&lt;br /&gt;
|-&lt;br /&gt;
| [[Monster type catalog]] || [[spawnMonster]]&lt;br /&gt;
|-&lt;br /&gt;
| [[World item catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || [[spawnItem]] and [[spawnTestItem]]&lt;br /&gt;
|-&lt;br /&gt;
| [[NPC and monster navigation collision]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || NPC and monster collision-source modes and resource-owned AI navigation blockers&lt;br /&gt;
|-&lt;br /&gt;
| [[Player animation catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || [[startAnim]] and [[stopAnim]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Camera scripting ==&lt;br /&gt;
[[Scripted camera]] and [[:Category:Camera Functions|Camera Functions]] document camera poses, units, state fields, movement, paths, orbits and client/server ownership. These new functions and their client events are &#039;&#039;&#039;available from update 0.1.3&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Player customization ==&lt;br /&gt;
[[Player customization]] documents the &#039;&#039;&#039;seven skin-color and tattoo functions available from update 0.1.3&#039;&#039;&#039;, including RGB ranges, independent resets, tattoo removal and persistence. Existing [[setPlayerIdentity]] head/armor handling is &#039;&#039;&#039;improved from update 0.1.3&#039;&#039;&#039;; it is not a newly introduced identity API or a full NPC body replacement.&lt;br /&gt;
&lt;br /&gt;
== Observer-specific nameplates ==&lt;br /&gt;
[[Observer nameplates]] documents the &#039;&#039;&#039;12 observer/nameplate-ID functions available from update 0.1.3&#039;&#039;&#039;. Text, whole-label visibility and numeric-ID policy resolve independently for each observer/target pair. The guide covers explicit versus effective getters, exclusive per-field resource ownership, lifecycle, configurable limits, developer-owned acquaintance persistence, and the optional &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; resource. This is overhead presentation, not network anonymity.&lt;br /&gt;
&lt;br /&gt;
== Runtime catalogs ==&lt;br /&gt;
These functions return the authoritative keys supported by the running server build:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function !! Values&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerArmorNames]] || Armor keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerTattooNames]] || Tattoo preset keys (available from update 0.1.3)&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerWeaponNames]] || Melee weapon keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerRangedWeaponNames]] || Bow and crossbow keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerAmmunitionNames]] || Ammunition keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerRuneNames]] || All rune/spell-item keys; not a synchronization-support list&lt;br /&gt;
|-&lt;br /&gt;
| [[getSpellCatalog]] || All spell definitions and their &amp;lt;code&amp;gt;implemented&amp;lt;/code&amp;gt; status; see [[Synchronized spell catalog]]&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerStatNames]] || Progression statistic keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerSkillNames]] || Skill keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerGuildNames]] || Guild keys&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local function contains(values, wanted)&lt;br /&gt;
    for _, value in ipairs(values) do&lt;br /&gt;
        if value == wanted then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if contains(getPlayerArmorNames(), &amp;quot;none&amp;quot;) then&lt;br /&gt;
    setPlayerArmor(playerId, &amp;quot;none&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&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=Main_Page&amp;diff=865</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=865"/>
		<updated>2026-09-12T11:51:33Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;OBSERVER NAMEPLATES — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;12 new server-side functions&#039;&#039;&#039; add per-observer text, whole-label visibility and numeric-ID policy. Build directional acquaintance presentation with exclusive resource-owned fields and reliable relevance replay. See [[Observer nameplates]] for APIs, lifecycle, database integration and the optional three-client &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; sequence. Overhead customization does not anonymize other packets, chat or player lists.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;PLAYER CUSTOMIZATION — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;7 new server-side functions&#039;&#039;&#039; provide independent skin-color and tattoo overrides. Existing identity selection has improved head and armor compatibility from update 0.1.3. See [[Player customization]] for examples and reset behavior, and [[Player tattoo catalog]] for all 12 keys.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Skin color:&amp;lt;/strong&amp;gt; [[setPlayerSkinColor]] &amp;amp;bull; [[getPlayerSkinColor]] &amp;amp;bull; [[resetPlayerSkinColor]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Tattoos:&amp;lt;/strong&amp;gt; [[setPlayerTattoo]] &amp;amp;bull; [[getPlayerTattoo]] &amp;amp;bull; [[resetPlayerTattoo]] &amp;amp;bull; [[getPlayerTattooNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Improved existing API:&amp;lt;/strong&amp;gt; [[setPlayerIdentity]] keeps the game-owned body and equipped armor. These are cosmetic controls, not a full NPC body/outfit replacement.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;SCRIPTED CAMERA — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;15 camera functions&#039;&#039;&#039; and &#039;&#039;&#039;2 client camera events&#039;&#039;&#039; are available from G1R:MP 0.1.3. Build login backgrounds, fixed shots, smooth transitions, paths and orbits. See [[Scripted camera]] for examples, limits and client/server differences.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client and server (10):&amp;lt;/strong&amp;gt; [[setCameraPos]] &amp;amp;bull; [[setCameraRot]] &amp;amp;bull; [[setCameraLookAt]] &amp;amp;bull; [[setCameraFOV]] &amp;amp;bull; [[setCameraPose]] &amp;amp;bull; [[moveCameraTo]] &amp;amp;bull; [[playCameraPath]] &amp;amp;bull; [[orbitCamera]] &amp;amp;bull; [[stopCameraMovement]] &amp;amp;bull; [[resetCameraPos]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client read-back (5):&amp;lt;/strong&amp;gt; [[getCameraPos]] &amp;amp;bull; [[getCameraRot]] &amp;amp;bull; [[getCameraFOV]] &amp;amp;bull; [[getCameraState]] &amp;amp;bull; [[requestCameraState]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client events (2):&amp;lt;/strong&amp;gt; [[onClientCameraCommandResult]] &amp;amp;bull; [[onClientCameraReset]]. Client commands use asynchronous acknowledgements; server calls return only a queued boolean.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE AND IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;The following &#039;&#039;&#039;40 Lua functions&#039;&#039;&#039; &amp;amp;mdash; 29 server-side and 11 client-side &amp;amp;mdash; are available from G1R:MP 0.1.2. Existing lifecycle, inventory, JSON, NPC, monster, and world-item APIs also include corrected or expanded behavior from this update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Accounts and consumables (4):&amp;lt;/strong&amp;gt; [[completePlayerConsumableFinalize]] &amp;amp;bull; [[completePlayerConsumableUse]] &amp;amp;bull; [[getPlayerAccountBindingSerial]] &amp;amp;bull; [[getPlayerConsumableNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;World items (1):&amp;lt;/strong&amp;gt; [[spawnItem]] &amp;amp;mdash; see also the [[World item catalog]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster identity, health, and combat (5):&amp;lt;/strong&amp;gt; [[setMonsterName]] &amp;amp;bull; [[setMonsterIdVisible]] &amp;amp;bull; [[setMonsterMaxHealth]] &amp;amp;bull; [[getMonsterAttackDamage]] &amp;amp;bull; [[setMonsterAttackDamage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster navigation (6):&amp;lt;/strong&amp;gt; [[setMonsterNavigationMode]] &amp;amp;bull; [[setMonsterNavigationCollisionMode]] &amp;amp;bull; [[setMonsterMoveGoal]] &amp;amp;bull; [[stopMonsterMovement]] &amp;amp;bull; [[testMonsterMove]] &amp;amp;bull; [[walkMonsterTo]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;NPC identity and navigation (7):&amp;lt;/strong&amp;gt; [[setNpcIdVisible]] &amp;amp;bull; [[setNpcObstacleBehavior]] &amp;amp;bull; [[setNpcNavigationMode]] &amp;amp;bull; [[setNpcNavigationCollisionMode]] &amp;amp;bull; [[setNpcMoveGoal]] &amp;amp;bull; [[stopNpcMovement]] &amp;amp;bull; [[testNpcMove]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Custom navigation blockers (6):&amp;lt;/strong&amp;gt; [[createAiNavigationBlocker]] &amp;amp;bull; [[updateAiNavigationBlocker]] &amp;amp;bull; [[setAiNavigationBlockerEnabled]] &amp;amp;bull; [[destroyAiNavigationBlocker]] &amp;amp;bull; [[getAiNavigationBlockerData]] &amp;amp;bull; [[getAiNavigationBlockers]] &amp;amp;mdash; see [[NPC and monster navigation collision]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client audio (11):&amp;lt;/strong&amp;gt; [[playSound]] &amp;amp;bull; [[playSound3D]] &amp;amp;bull; [[stopSound]] &amp;amp;bull; [[setSoundVolume]] &amp;amp;bull; [[getSoundVolume]] &amp;amp;bull; [[setSoundPaused]] &amp;amp;bull; [[isSoundPaused]] &amp;amp;bull; [[isSoundPlaying]] &amp;amp;bull; [[setSoundLooped]] &amp;amp;bull; [[setSound3DPosition]] &amp;amp;bull; [[setSound3DMinMaxDistance]] &amp;amp;mdash; see [[Client audio]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Events available from 0.1.2 (8):&amp;lt;/strong&amp;gt; [[onNpcIdVisibilityChange]] &amp;amp;bull; [[onMonsterNameChange]] &amp;amp;bull; [[onMonsterIdVisibilityChange]] &amp;amp;bull; [[onMonsterMoveBlocked]] &amp;amp;bull; [[onMonsterMoveComplete]] &amp;amp;bull; [[onNpcMoveBlocked]] &amp;amp;bull; [[onNpcMoveComplete]] &amp;amp;bull; [[onWorldItemDrop]]. Existing [[onPlayerJoin]], [[onPlayerQuit]], [[onWorldItemPickup]], and [[onWorldItemSpawn]] contracts are also improved from 0.1.2.&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; 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 — 0.1.3 BUILD81]]&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;[[Scripted camera|Scripted camera and moving login backgrounds (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Observer nameplates|Observer-specific labels and acquaintance presentation (0.1.3)]]&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;[[: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|Client audio functions]]&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;[[Known issue: MySQL error 2006 (Server has gone away)|Known MySQL/MariaDB issue]]&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;The reference contains &#039;&#039;&#039;310 Lua functions&#039;&#039;&#039; and &#039;&#039;&#039;94 events&#039;&#039;&#039;, including &#039;&#039;&#039;12 observer/nameplate-ID functions, 7 skin-color/tattoo functions, 15 camera functions and 2 camera events available from update 0.1.3&#039;&#039;&#039;. Version notices distinguish newly available APIs from improved contracts in earlier APIs. See [[Observer nameplates]] for directional labels, [[Player customization]] for identity, color and tattoos, [[Lua API catalogs]] for validated gameplay keys, and [[Scripted camera]] for camera state and lifecycle rules. APIs marked [[:Category:Experimental Lua API|experimental]] may still change while the multiplayer runtime is under active development.&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=Player_statistic_limits&amp;diff=864</id>
		<title>Player statistic limits</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Player_statistic_limits&amp;diff=864"/>
		<updated>2026-09-12T11:51:32Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Player statistic limits}}&lt;br /&gt;
&#039;&#039;&#039;Current in update 0.1.3, expanded-budget BUILD81; audited 2026-09-12.&#039;&#039;&#039; These statistic ranges were &#039;&#039;&#039;not raised&#039;&#039;&#039; by the scripting-capacity update: gameplay values are separate from Lua VM storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;setPlayerStat&amp;lt;/code&amp;gt; and its named stat setters reject unknown keys/non-finite values and clamp finite numeric values to the catalog range below. Further authoritative rules still apply (for example current health versus max health, life state and equipment). This table is not a promise that every underlying single-player attribute has independent gameplay support. Query [[getPlayerStatLimits]] and [[getPlayerStatNames]] rather than copying assumptions into a gamemode. See [[Scripting limits]].&lt;br /&gt;
&lt;br /&gt;
== All 59 catalog ranges ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Stat key !! Minimum !! Maximum&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;alcohol&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_alcohol&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;alcohol_depletion_rate&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;super_armor&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_super_armor&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_blunt&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_edge&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_point&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_fire&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_energy&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_ice&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_wind&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resistance_falling&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dexterity&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fatigue&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_fatigue&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fatigue_fill_ratio&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fatigue_fill_ratio_period&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fatigue_max_threshold_index&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fatigue_recovery_per_sleep_hour&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;health&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_health&amp;lt;/code&amp;gt; || 1 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;damage_multiplier&amp;lt;/code&amp;gt; || 0 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;health_recovery_per_sleep_hour&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; || 0 || 1000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;experience&amp;lt;/code&amp;gt; || 0 || 1000000000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_points&amp;lt;/code&amp;gt; || 0 || 1000000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;xp_executed_bounty&amp;lt;/code&amp;gt; || 0 || 1000000000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;xp_kill_or_defeat_bounty&amp;lt;/code&amp;gt; || 0 || 1000000000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toughness&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toughness_a&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toughness_b&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toughness_c&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lockpick_durability&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lockpick_precision&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mana&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_mana&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;magician_level&amp;lt;/code&amp;gt; || 0 || 6&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mana_recovery_per_sleep_hour&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;speed_modifier&amp;lt;/code&amp;gt; || 0 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oxygen&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_oxygen&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oxygen_depletion_rate&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oxygen_recovery_rate&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oxygen_critical_level_percent&amp;lt;/code&amp;gt; || 0 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pickpocketing&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleep_time&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_sleep_time&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleep_recovery_amount&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sleep_recovery_period&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_rest_time&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;strength&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;critical_fists&amp;lt;/code&amp;gt; || 0 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;critical_one_hand&amp;lt;/code&amp;gt; || 0 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;critical_two_hand&amp;lt;/code&amp;gt; || 0 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;critical_orc&amp;lt;/code&amp;gt; || 0 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;swampweed&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_swampweed&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;swampweed_depletion_rate&amp;lt;/code&amp;gt; || 0 || 100000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source audit ==&lt;br /&gt;
&amp;lt;code&amp;gt;shared/PlayerProgressionCatalog.hpp&amp;lt;/code&amp;gt; (Stats, 59 entries); &amp;lt;code&amp;gt;server/src/scripting/ScriptRuntime.cpp&amp;lt;/code&amp;gt; (set_player_stat_value).&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=Server_configuration_limits&amp;diff=863</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=863"/>
		<updated>2026-09-12T11:51:31Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&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;
&amp;lt;code&amp;gt;server/src/config/ServerConfig.cpp&amp;lt;/code&amp;gt; (every numeric &amp;lt;code&amp;gt;parse_unsigned&amp;lt;/code&amp;gt; setting), &amp;lt;code&amp;gt;ServerConfig.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;server/src/database/DatabaseTypes.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shared/native_protocol.hpp&amp;lt;/code&amp;gt;. Audit: 2026-09-12, protocol 34, expanded-budget 0.1.3 BUILD81.&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=Scripting_limits&amp;diff=862</id>
		<title>Scripting limits</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Scripting_limits&amp;diff=862"/>
		<updated>2026-09-12T11:51:30Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document expanded scripting capacities and complete audited limits for 0.1.3 BUILD81&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;CURRENT IN 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;
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;os&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;package&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ffi&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;string.dump&amp;lt;/code&amp;gt; are unavailable. Lua bytecode is rejected. Increasing capacity does not weaken sandbox, hash, ownership, path or network validation.&lt;br /&gt;
&lt;br /&gt;
== Timers, handlers and commands ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Capacity !! Client, per resource !! Server&lt;br /&gt;
|-&lt;br /&gt;
| Timers || 8192 (previously 256) || No additional fixed timer-count cap in the server Lua API; still subject to memory and execution cost.&lt;br /&gt;
|-&lt;br /&gt;
| Timer callbacks selected per tick || 256 (previously 32), oldest deadline first || No matching fixed per-tick callback-count cap. Due timers are processed by the server runtime.&lt;br /&gt;
|-&lt;br /&gt;
| Event handlers, total || 8192 (previously 256) || No additional fixed count cap in the registration API.&lt;br /&gt;
|-&lt;br /&gt;
| Handlers for one event || 512 (previously 32) || No matching fixed per-event count cap.&lt;br /&gt;
|-&lt;br /&gt;
| Declared remote event names || 4096 (previously 256) || No additional fixed registration-count cap.&lt;br /&gt;
|-&lt;br /&gt;
| Key bindings || 1024 (previously 128) || Client-only feature.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both timer APIs require an interval of at least &#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;
== 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 this update.&lt;br /&gt;
&lt;br /&gt;
== requestRemote ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Limit !! Value&lt;br /&gt;
|-&lt;br /&gt;
| Workers / queued work / pending per resource || 8 / 256 / 32 (compiled defaults)&lt;br /&gt;
|-&lt;br /&gt;
| URL || 2048 bytes&lt;br /&gt;
|-&lt;br /&gt;
| Request body / response body || 4 MiB / 8 MiB&lt;br /&gt;
|-&lt;br /&gt;
| Request headers / response headers || 128 / 256&lt;br /&gt;
|-&lt;br /&gt;
| Aggregate header bytes || 64 KiB&lt;br /&gt;
|-&lt;br /&gt;
| Header name / username / password || 128 / 512 / 512 bytes&lt;br /&gt;
|-&lt;br /&gt;
| Connection attempts || 1..3; default 1&lt;br /&gt;
|-&lt;br /&gt;
| Connect timeout || 500..10000 ms; default 5000&lt;br /&gt;
|-&lt;br /&gt;
| Total timeout || 1000..30000 ms; default 15000&lt;br /&gt;
|-&lt;br /&gt;
| Redirect count || 0..3; default 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Allowed methods are GET, POST, PUT, PATCH, DELETE, HEAD and OPTIONS. Only the supported HTTP/HTTPS destinations are accepted. Loopback/private-address restrictions, DNS and redirect validation stay enabled in production. Capacity or validation rejection returns an error; asynchronous transfers also report completion errors. Keep callbacks short. The larger download-catalog file limit is &#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 uses the 27-key validated animation catalog. &amp;lt;code&amp;gt;startAnim&amp;lt;/code&amp;gt; blend argument range is 0..2 seconds. Catalog keys are not raw montage paths.&lt;br /&gt;
* Account binding key: 3..24 bytes with its validated identifier syntax; serial: 32 hexadecimal characters. Kick/ban reason: nonempty, at most 160 bytes, valid text without controls. Ban duration: 0 (permanent) or at most 5256000 minutes.&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
Camera safety/representation ranges were not changed by this capacity update. &#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;
* 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;
== Source audit and practical use ==&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. Main sources:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;shared/resource_limits.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_event_protocol.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;client_ipc_protocol.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scripting/LuaJson.hpp&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.cpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CameraProtocol.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PlayerProgressionCatalog.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PlayerAnimationCatalog.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NameplateValidation.hpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;server/src/config/ServerConfig.cpp&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;server/src/scripting/ScriptRuntime.cpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;server/src/resources/ResourceManager.cpp&amp;lt;/code&amp;gt;, resource catalog/manifest, database, HTTP, voice and world implementations, &amp;lt;code&amp;gt;server/enet_server.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;client-runtime/src/scripting/ClientScriptRuntime.cpp&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.hpp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;app/ClientRuntimeMain.cpp&amp;lt;/code&amp;gt;, catalog, audio and UI implementations.&lt;br /&gt;
&lt;br /&gt;
The test suite executes the real Lua runtimes with 8192 client timers / 8193 server timers, expanded handler/remote-event/key-binding capacities, JSON boundary and overflow cases, client timer fairness and restart/cleanup. Capacity boundaries are not a full in-game performance benchmark. Use staged loading, staggered timers, asynchronous DB/HTTP, pagination and explicit cleanup even on fast computers. Always check API results and the runtime logs.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Category:Nameplate_Functions&amp;diff=861</id>
		<title>Category:Nameplate Functions</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Category:Nameplate_Functions&amp;diff=861"/>
		<updated>2026-09-09T03:08:57Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- This category is synchronized from the verified Lua API catalog. --&amp;gt;&lt;br /&gt;
Server-side functions for reliable, validated overhead player labels. Twelve observer-specific and numeric-ID policy functions are available from update 0.1.3; see [[Observer nameplates]] for directional overrides, field ownership, resets, lifecycle and privacy boundaries.&lt;br /&gt;
&lt;br /&gt;
[[Category:Player Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Lua_API_catalogs&amp;diff=860</id>
		<title>Lua API catalogs</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Lua_API_catalogs&amp;diff=860"/>
		<updated>2026-09-09T03:08:56Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Lua API catalogs}}&lt;br /&gt;
&#039;&#039;&#039;Lua API catalogs&#039;&#039;&#039; collect stable, server-validated keys used by G1R:MP resources. Prefer catalog keys and enumeration functions over hard-coded Unreal paths.&lt;br /&gt;
&lt;br /&gt;
== Static catalogs ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Catalog !! Used by&lt;br /&gt;
|-&lt;br /&gt;
| [[Player skin catalog]] || [[setPlayerSkin]], [[setNpcSkin]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player body catalog]] || deprecated compatibility reference for [[setPlayerBody]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player face catalog]] || deprecated compatibility reference for [[setPlayerFace]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player head catalog]] || deprecated compatibility reference for [[setPlayerHead]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player identity catalog]] || supported complete identity setter [[setPlayerIdentity]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player tattoo catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.3)&amp;lt;/span&amp;gt; || [[setPlayerTattoo]], [[getPlayerTattooNames]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Synchronized spell catalog]] || basic synchronized spell set for G1R:MP 0.1a&lt;br /&gt;
|-&lt;br /&gt;
| [[Monster type catalog]] || [[spawnMonster]]&lt;br /&gt;
|-&lt;br /&gt;
| [[World item catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || [[spawnItem]] and [[spawnTestItem]]&lt;br /&gt;
|-&lt;br /&gt;
| [[NPC and monster navigation collision]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || NPC and monster collision-source modes and resource-owned AI navigation blockers&lt;br /&gt;
|-&lt;br /&gt;
| [[Player animation catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || [[startAnim]] and [[stopAnim]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Camera scripting ==&lt;br /&gt;
[[Scripted camera]] and [[:Category:Camera Functions|Camera Functions]] document camera poses, units, state fields, movement, paths, orbits and client/server ownership. These new functions and their client events are &#039;&#039;&#039;available from update 0.1.3&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Player customization ==&lt;br /&gt;
[[Player customization]] documents the &#039;&#039;&#039;seven skin-color and tattoo functions available from update 0.1.3&#039;&#039;&#039;, including RGB ranges, independent resets, tattoo removal and persistence. Existing [[setPlayerIdentity]] head/armor handling is &#039;&#039;&#039;improved from update 0.1.3&#039;&#039;&#039;; it is not a newly introduced identity API or a full NPC body replacement.&lt;br /&gt;
&lt;br /&gt;
== Observer-specific nameplates ==&lt;br /&gt;
[[Observer nameplates]] documents the &#039;&#039;&#039;12 observer/nameplate-ID functions available from update 0.1.3&#039;&#039;&#039;. Text, whole-label visibility and numeric-ID policy resolve independently for each observer/target pair. The guide covers explicit versus effective getters, exclusive per-field resource ownership, lifecycle, configurable limits, developer-owned acquaintance persistence, and the optional &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; resource. This is overhead presentation, not network anonymity.&lt;br /&gt;
&lt;br /&gt;
== Runtime catalogs ==&lt;br /&gt;
These functions return the authoritative keys supported by the running server build:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function !! Values&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerArmorNames]] || Armor keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerTattooNames]] || Tattoo preset keys (available from update 0.1.3)&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerWeaponNames]] || Melee weapon keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerRangedWeaponNames]] || Bow and crossbow keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerAmmunitionNames]] || Ammunition keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerRuneNames]] || All rune/spell-item keys; not a synchronization-support list&lt;br /&gt;
|-&lt;br /&gt;
| [[getSpellCatalog]] || All spell definitions and their &amp;lt;code&amp;gt;implemented&amp;lt;/code&amp;gt; status; see [[Synchronized spell catalog]]&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerStatNames]] || Progression statistic keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerSkillNames]] || Skill keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerGuildNames]] || Guild keys&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local function contains(values, wanted)&lt;br /&gt;
    for _, value in ipairs(values) do&lt;br /&gt;
        if value == wanted then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if contains(getPlayerArmorNames(), &amp;quot;none&amp;quot;) then&lt;br /&gt;
    setPlayerArmor(playerId, &amp;quot;none&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&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=Main_Page&amp;diff=859</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Main_Page&amp;diff=859"/>
		<updated>2026-09-09T03:08:55Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;OBSERVER NAMEPLATES — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;12 new server-side functions&#039;&#039;&#039; add per-observer text, whole-label visibility and numeric-ID policy. Build directional acquaintance presentation with exclusive resource-owned fields and reliable relevance replay. See [[Observer nameplates]] for APIs, lifecycle, database integration and the optional three-client &amp;lt;code&amp;gt;/nametest&amp;lt;/code&amp;gt; sequence. Overhead customization does not anonymize other packets, chat or player lists.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;PLAYER CUSTOMIZATION — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;7 new server-side functions&#039;&#039;&#039; provide independent skin-color and tattoo overrides. Existing identity selection has improved head and armor compatibility from update 0.1.3. See [[Player customization]] for examples and reset behavior, and [[Player tattoo catalog]] for all 12 keys.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Skin color:&amp;lt;/strong&amp;gt; [[setPlayerSkinColor]] &amp;amp;bull; [[getPlayerSkinColor]] &amp;amp;bull; [[resetPlayerSkinColor]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Tattoos:&amp;lt;/strong&amp;gt; [[setPlayerTattoo]] &amp;amp;bull; [[getPlayerTattoo]] &amp;amp;bull; [[resetPlayerTattoo]] &amp;amp;bull; [[getPlayerTattooNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Improved existing API:&amp;lt;/strong&amp;gt; [[setPlayerIdentity]] keeps the game-owned body and equipped armor. These are cosmetic controls, not a full NPC body/outfit replacement.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;SCRIPTED CAMERA — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;&#039;&#039;&#039;15 camera functions&#039;&#039;&#039; and &#039;&#039;&#039;2 client camera events&#039;&#039;&#039; are available from G1R:MP 0.1.3. Build login backgrounds, fixed shots, smooth transitions, paths and orbits. See [[Scripted camera]] for examples, limits and client/server differences.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client and server (10):&amp;lt;/strong&amp;gt; [[setCameraPos]] &amp;amp;bull; [[setCameraRot]] &amp;amp;bull; [[setCameraLookAt]] &amp;amp;bull; [[setCameraFOV]] &amp;amp;bull; [[setCameraPose]] &amp;amp;bull; [[moveCameraTo]] &amp;amp;bull; [[playCameraPath]] &amp;amp;bull; [[orbitCamera]] &amp;amp;bull; [[stopCameraMovement]] &amp;amp;bull; [[resetCameraPos]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client read-back (5):&amp;lt;/strong&amp;gt; [[getCameraPos]] &amp;amp;bull; [[getCameraRot]] &amp;amp;bull; [[getCameraFOV]] &amp;amp;bull; [[getCameraState]] &amp;amp;bull; [[requestCameraState]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client events (2):&amp;lt;/strong&amp;gt; [[onClientCameraCommandResult]] &amp;amp;bull; [[onClientCameraReset]]. Client commands use asynchronous acknowledgements; server calls return only a queued boolean.&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;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin:0 0 1.25rem;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; font-size:1.05rem; font-weight:bold; letter-spacing:0.04em;&amp;quot;&amp;gt;AVAILABLE AND IMPROVED FROM UPDATE 0.1.2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.55;&amp;quot;&amp;gt;The following &#039;&#039;&#039;40 Lua functions&#039;&#039;&#039; &amp;amp;mdash; 29 server-side and 11 client-side &amp;amp;mdash; are available from G1R:MP 0.1.2. Existing lifecycle, inventory, JSON, NPC, monster, and world-item APIs also include corrected or expanded behavior from this update.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Accounts and consumables (4):&amp;lt;/strong&amp;gt; [[completePlayerConsumableFinalize]] &amp;amp;bull; [[completePlayerConsumableUse]] &amp;amp;bull; [[getPlayerAccountBindingSerial]] &amp;amp;bull; [[getPlayerConsumableNames]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;World items (1):&amp;lt;/strong&amp;gt; [[spawnItem]] &amp;amp;mdash; see also the [[World item catalog]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster identity, health, and combat (5):&amp;lt;/strong&amp;gt; [[setMonsterName]] &amp;amp;bull; [[setMonsterIdVisible]] &amp;amp;bull; [[setMonsterMaxHealth]] &amp;amp;bull; [[getMonsterAttackDamage]] &amp;amp;bull; [[setMonsterAttackDamage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Monster navigation (6):&amp;lt;/strong&amp;gt; [[setMonsterNavigationMode]] &amp;amp;bull; [[setMonsterNavigationCollisionMode]] &amp;amp;bull; [[setMonsterMoveGoal]] &amp;amp;bull; [[stopMonsterMovement]] &amp;amp;bull; [[testMonsterMove]] &amp;amp;bull; [[walkMonsterTo]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;NPC identity and navigation (7):&amp;lt;/strong&amp;gt; [[setNpcIdVisible]] &amp;amp;bull; [[setNpcObstacleBehavior]] &amp;amp;bull; [[setNpcNavigationMode]] &amp;amp;bull; [[setNpcNavigationCollisionMode]] &amp;amp;bull; [[setNpcMoveGoal]] &amp;amp;bull; [[stopNpcMovement]] &amp;amp;bull; [[testNpcMove]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Custom navigation blockers (6):&amp;lt;/strong&amp;gt; [[createAiNavigationBlocker]] &amp;amp;bull; [[updateAiNavigationBlocker]] &amp;amp;bull; [[setAiNavigationBlockerEnabled]] &amp;amp;bull; [[destroyAiNavigationBlocker]] &amp;amp;bull; [[getAiNavigationBlockerData]] &amp;amp;bull; [[getAiNavigationBlockers]] &amp;amp;mdash; see [[NPC and monster navigation collision]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.35rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Client audio (11):&amp;lt;/strong&amp;gt; [[playSound]] &amp;amp;bull; [[playSound3D]] &amp;amp;bull; [[stopSound]] &amp;amp;bull; [[setSoundVolume]] &amp;amp;bull; [[getSoundVolume]] &amp;amp;bull; [[setSoundPaused]] &amp;amp;bull; [[isSoundPaused]] &amp;amp;bull; [[isSoundPlaying]] &amp;amp;bull; [[setSoundLooped]] &amp;amp;bull; [[setSound3DPosition]] &amp;amp;bull; [[setSound3DMinMaxDistance]] &amp;amp;mdash; see [[Client audio]].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:#111; margin-top:0.65rem; line-height:1.65;&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Events available from 0.1.2 (8):&amp;lt;/strong&amp;gt; [[onNpcIdVisibilityChange]] &amp;amp;bull; [[onMonsterNameChange]] &amp;amp;bull; [[onMonsterIdVisibilityChange]] &amp;amp;bull; [[onMonsterMoveBlocked]] &amp;amp;bull; [[onMonsterMoveComplete]] &amp;amp;bull; [[onNpcMoveBlocked]] &amp;amp;bull; [[onNpcMoveComplete]] &amp;amp;bull; [[onWorldItemDrop]]. Existing [[onPlayerJoin]], [[onPlayerQuit]], [[onWorldItemPickup]], and [[onWorldItemSpawn]] contracts are also improved from 0.1.2.&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; 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;[[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;[[Scripted camera|Scripted camera and moving login backgrounds (0.1.3)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Observer nameplates|Observer-specific labels and acquaintance presentation (0.1.3)]]&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;[[: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|Client audio functions]]&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;[[Known issue: MySQL error 2006 (Server has gone away)|Known MySQL/MariaDB issue]]&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;The reference contains &#039;&#039;&#039;310 Lua functions&#039;&#039;&#039; and &#039;&#039;&#039;94 events&#039;&#039;&#039;, including &#039;&#039;&#039;12 observer/nameplate-ID functions, 7 skin-color/tattoo functions, 15 camera functions and 2 camera events available from update 0.1.3&#039;&#039;&#039;. Version notices distinguish newly available APIs from improved contracts in earlier APIs. See [[Observer nameplates]] for directional labels, [[Player customization]] for identity, color and tattoos, [[Lua API catalogs]] for validated gameplay keys, and [[Scripted camera]] for camera state and lifecycle rules. APIs marked [[:Category:Experimental Lua API|experimental]] may still change while the multiplayer runtime is under active development.&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=Observer_nameplates&amp;diff=858</id>
		<title>Observer nameplates</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Observer_nameplates&amp;diff=858"/>
		<updated>2026-09-09T03:08:52Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Observer nameplates}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff8f8; border:1px solid #d13b3b; border-left:5px solid #d13b3b; color:#111; padding:0.95rem 1.1rem; margin-bottom:1rem; font-weight:bold;&amp;quot;&amp;gt;OBSERVER NAMEPLATES — AVAILABLE FROM UPDATE 0.1.3&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These &#039;&#039;&#039;12 new server-side functions&#039;&#039;&#039; control overhead labels for an ordered pair of connected human players: &#039;&#039;&#039;observer → target&#039;&#039;&#039;. They are universal presentation primitives: the gamemode owns acquaintance rules, permissions, character/account identifiers and database persistence. They do not replace [[setPlayerName]] or change the player&#039;s character appearance.&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;
| [[setPlayerNameplateTextFor]] / [[getPlayerNameplateTextFor]] / [[resetPlayerNameplateTextFor]] || Set, read or remove an explicit text override for one pair.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayerNameplateVisibleFor]] / [[isPlayerNameplateVisibleFor]] / [[resetPlayerNameplateVisibleFor]] || Control the complete overhead label for one pair, including numeric ID and speaking suffix.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayerNameplateIdVisibleFor]] / [[isPlayerNameplateIdVisibleFor]] / [[resetPlayerNameplateIdVisibleFor]] || Control only the numeric session-ID suffix for one pair.&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerNameplateStateFor]] || Read effective policy, explicit override flags and raw values together.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayerNameplateIdVisible]] / [[isPlayerNameplateIdVisible]] || Set/read the global numeric-ID fallback, default &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
All twelve functions have PascalCase aliases, for example &amp;lt;code&amp;gt;SetPlayerNameplateTextFor&amp;lt;/code&amp;gt;. The first ten take &amp;lt;code&amp;gt;observerId, targetId&amp;lt;/code&amp;gt;; both must be different connected human-player session IDs. NPC IDs, persistent character IDs, invalid IDs and self-pairs are rejected.&lt;br /&gt;
&lt;br /&gt;
== Independent fields and current defaults ==&lt;br /&gt;
Each field resolves independently: &#039;&#039;&#039;pair override → current global field → native default&#039;&#039;&#039;. A text override does not force visibility or suppress the numeric ID. An ID override does not hide the name or mute voice. Whole-label visibility &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; hides text, ID and the speaking suffix; voice audio routing is unchanged.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- A sees B as a stranger; C knows B. B&#039;s view of A is unchanged.&lt;br /&gt;
setPlayerNameplateTextFor(playerA, playerB, &amp;quot;Stranger&amp;quot;)&lt;br /&gt;
setPlayerNameplateTextFor(playerC, playerB, &amp;quot;Known friend&amp;quot;)&lt;br /&gt;
setPlayerNameplateIdVisibleFor(playerA, playerB, false)&lt;br /&gt;
&lt;br /&gt;
-- Reset only A&#039;s text. A now uses B&#039;s CURRENT global text/name,&lt;br /&gt;
-- while A&#039;s explicit ID-hidden override remains.&lt;br /&gt;
resetPlayerNameplateTextFor(playerA, playerB)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Existing [[setPlayerNameplateText]], [[resetPlayerNameplateText]] and [[setPlayerNameplateVisible]] remain global fallback controls; they do not clear pair overrides. [[getPlayerNameplateText]] returns global custom text or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when unset. [[isPlayerNameplateVisible]] reads the global visibility policy, not the observer-specific result. Global settings are not resource-owned and are not reverted automatically when the writing resource stops.&lt;br /&gt;
&lt;br /&gt;
== Reading explicit versus effective state ==&lt;br /&gt;
[[getPlayerNameplateTextFor]] returns &#039;&#039;&#039;only an explicit pair text string&#039;&#039;&#039;, otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. It never returns inherited text. The two &amp;lt;code&amp;gt;is...For&amp;lt;/code&amp;gt; getters return the effective boolean after inheritance; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; can also mean an invalid pair.&lt;br /&gt;
&lt;br /&gt;
[[getPlayerNameplateStateFor]] returns this table, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid pair/unavailable service:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;idVisible&amp;lt;/code&amp;gt; || Effective text string and boolean policies. Text excludes the system ID and speaking suffixes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;textOverridden&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;visibilityOverridden&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;idVisibilityOverridden&amp;lt;/code&amp;gt; || Whether the corresponding explicit pair field exists.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;textOverride&amp;lt;/code&amp;gt; || Explicit string, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when absent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;visibleOverride&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;idVisibleOverride&amp;lt;/code&amp;gt; || Explicit boolean, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when absent. Use the flag to distinguish absent from explicitly false.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local state = getPlayerNameplateStateFor(observerId, targetId)&lt;br /&gt;
if state then&lt;br /&gt;
    outputDebugString(state.text)&lt;br /&gt;
    if state.visibilityOverridden and state.visibleOverride == false then&lt;br /&gt;
        outputDebugString(&amp;quot;Explicitly hidden for this observer&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The table is a &#039;&#039;&#039;resource-global, read-only server view&#039;&#039;&#039;: it includes fields owned by other resources. It is not an AOI test or client-render acknowledgement. Effective text may be non-empty while visibility is false. Distance, native presentation rules and asynchronous delivery still determine whether pixels are rendered.&lt;br /&gt;
&lt;br /&gt;
== Validation and exclusive resource ownership ==&lt;br /&gt;
* New boolean setters require real Lua booleans; &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, strings and &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; are not substitutes. IDs must be finite positive integers. Invalid argument counts return &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Text must be valid UTF-8, at most &#039;&#039;&#039;48 Unicode code points and 96 bytes&#039;&#039;&#039;. It is rejected, not truncated, on invalid UTF-8, controls, &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;, BOM, or the shared validator&#039;s disallowed zero-width/bidirectional formatting characters. Empty text means reset.&lt;br /&gt;
* The resource that first writes a pair field owns that field exclusively. &#039;&#039;&#039;Another resource cannot overwrite or reset it until the owner releases it.&#039;&#039;&#039; Different fields of the same pair can have different owners.&lt;br /&gt;
* An identical owned write or reset of an absent field succeeds without a state change. A foreign write/reset fails. Always check the returned boolean; a failed mutation does not grant ownership.&lt;br /&gt;
* Reset removes only the selected owned field and follows the &#039;&#039;&#039;current&#039;&#039;&#039; fallback. It does not restore a captured old global value.&lt;br /&gt;
* The core does not impose an RP permission or acquaintance policy. Validate permissions and remote-event senders in your own trusted server resource.&lt;br /&gt;
&lt;br /&gt;
== Relevance, reconnect and resource stop ==&lt;br /&gt;
Accepted changes are sent reliably to the affected observer when relevant. Pair overrides remain stored outside synchronization range; the current resolved state is replayed on late join and AOI re-entry. Resource stop removes only that resource&#039;s fields. Disconnect of either endpoint clears affected pairs, and session-generation checks prevent stale state from applying to a reused numeric player ID.&lt;br /&gt;
&lt;br /&gt;
These overrides are &#039;&#039;&#039;runtime state, not persistent database relations&#039;&#039;&#039;. After reconnect or resource restart the gamemode must restore its policy. Global nameplate state also ends when that player disconnects. A setter returning &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; means server acceptance, not proof that another client has rendered the label.&lt;br /&gt;
&lt;br /&gt;
== Configurable bounds ==&lt;br /&gt;
Default server configuration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[nameplates]&lt;br /&gt;
maxPairs=250000&lt;br /&gt;
maxPairsPerResource=250000&lt;br /&gt;
mutationsPerSecond=4096&lt;br /&gt;
mutationBurst=8192&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Capacity keys accept &amp;lt;code&amp;gt;1..1000000&amp;lt;/code&amp;gt;; mutation rate/burst accept &amp;lt;code&amp;gt;1..250000&amp;lt;/code&amp;gt;. A pair counts once globally and once per resource owning any of its fields. The per-resource token bucket charges changed, non-reset field writes. Identical writes, resets and cleanup do not consume tokens. A capacity/rate rejection returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;; batch large restores over ticks and retry with bounded scheduling, not a tight loop.&lt;br /&gt;
&lt;br /&gt;
Defaults can hold all &amp;lt;code&amp;gt;500 × 499&amp;lt;/code&amp;gt; directed pairs. A sparse global-default-plus-known-exceptions design usually uses fewer entries and less work.&lt;br /&gt;
&lt;br /&gt;
== Building a persistent acquaintance system ==&lt;br /&gt;
The server developer supplies the database schema and adapter. Store directional relationships by stable &#039;&#039;&#039;character IDs&#039;&#039;&#039;, not temporary &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt;. Decide whether &amp;lt;code&amp;gt;A knows B&amp;lt;/code&amp;gt; implies a reciprocal relationship; the engine deliberately does not assume this.&lt;br /&gt;
&lt;br /&gt;
A possible policy:&lt;br /&gt;
# When a character becomes ready, establish its global label as &amp;lt;code&amp;gt;Stranger (&amp;amp;lt;characterId&amp;amp;gt;)&amp;lt;/code&amp;gt; and global numeric-ID policy as false. Choose one resource to own this global policy, and do so before exposing the character under your gamemode&#039;s login/spawn flow.&lt;br /&gt;
# For each observer who knows that character, set a pair text override with the known name. Do not call [[setPlayerName]] to simulate a stranger: that changes the canonical name used by other systems.&lt;br /&gt;
# On new acquaintances or forgotten relations, update/reset only the relevant directional pair. Check returned booleans for resource conflicts or rate limits.&lt;br /&gt;
# On reconnect/resource restart, rebuild policy in bounded batches from your own database. Core pair cleanup does not revert global settings for you.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guard asynchronous DB results against both endpoints changing.&#039;&#039;&#039; Capture both session objects/generations, both stable character IDs, and your resource&#039;s load epoch before starting a query. Before applying its result, verify every captured value is still current and both players are connected and character-ready. &amp;lt;code&amp;gt;isPlayerConnected&amp;lt;/code&amp;gt; alone cannot detect ID reuse or a character switch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Integration sketch: sessions, loadEpoch and queryAcquaintance are YOUR&lt;br /&gt;
-- gamemode&#039;s state/DB adapter, not extra G1R:MP API functions.&lt;br /&gt;
local observerSession = sessions[observerId]&lt;br /&gt;
local targetSession = sessions[targetId]&lt;br /&gt;
local requestEpoch = loadEpoch&lt;br /&gt;
local observerCharacter = observerSession.characterId&lt;br /&gt;
local targetCharacter = targetSession.characterId&lt;br /&gt;
&lt;br /&gt;
queryAcquaintance(observerCharacter, targetCharacter, function(knownName)&lt;br /&gt;
    if loadEpoch ~= requestEpoch&lt;br /&gt;
        or sessions[observerId] ~= observerSession&lt;br /&gt;
        or sessions[targetId] ~= targetSession&lt;br /&gt;
        or observerSession.characterId ~= observerCharacter&lt;br /&gt;
        or targetSession.characterId ~= targetCharacter&lt;br /&gt;
        or not observerSession.characterReady or not targetSession.characterReady&lt;br /&gt;
        or not isPlayerConnected(observerId) or not isPlayerConnected(targetId) then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    -- Adapter returns a validated name or false; handle DB failures separately.&lt;br /&gt;
    local accepted&lt;br /&gt;
    if type(knownName) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        accepted = setPlayerNameplateTextFor(observerId, targetId, knownName)&lt;br /&gt;
    elseif knownName == false then&lt;br /&gt;
        accepted = resetPlayerNameplateTextFor(observerId, targetId)&lt;br /&gt;
    end&lt;br /&gt;
    if accepted == false then&lt;br /&gt;
        outputDebugString(&amp;quot;Acquaintance presentation rejected; check ownership or limits&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Initialize and validate both session objects before entering this sketch; replace them on session/character changes and invalidate &amp;lt;code&amp;gt;loadEpoch&amp;lt;/code&amp;gt; when abandoning a restore batch.&lt;br /&gt;
&lt;br /&gt;
== Privacy boundary ==&lt;br /&gt;
&#039;&#039;&#039;Hiding an overhead label is not network anonymity.&#039;&#039;&#039; Canonical names still exist in identity packets, [[getPlayerName]], ordinary player-list and chat flows unless those systems independently become recipient-aware. This feature neither changes account credentials nor guarantees that a client cannot inspect canonical identity elsewhere. For consistent stranger RP, apply one server-side recipient-aware resolver to each relevant chat/roster/UI path as a separate gamemode concern.&lt;br /&gt;
&lt;br /&gt;
== Optional three-client test ==&lt;br /&gt;
The shipped &amp;lt;code&amp;gt;nameplate_test&amp;lt;/code&amp;gt; resource is &#039;&#039;&#039;not autostarted&#039;&#039;&#039;. Start it explicitly in the server console:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
start nameplate_test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The bundled GothicRP adapter requires an authenticated test operator with &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;. All participants must be logged in and fully spawned. An authenticated test owner can still stop the test after permissions/settings change. Other gamemodes need their own trusted server-resource adapter; do not expose the test event as remotely callable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/nametest start &amp;lt;A ID&amp;gt; &amp;lt;B ID&amp;gt; &amp;lt;C ID&amp;gt;&lt;br /&gt;
/nametest next&lt;br /&gt;
/nametest status&lt;br /&gt;
/nametest stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use three different connected players with no existing overrides on the six directed pairs. Only the starter controls the active sequence. English chat messages guide &#039;&#039;&#039;10 steps&#039;&#039;&#039;: directional text, ID hiding, complete-label hiding, visibility restore, acquaintance text, reverse direction, text reset, visibility/ID reset, AOI re-entry and final cleanup.&lt;br /&gt;
&lt;br /&gt;
Step 9 requires moving B outside the server synchronization range and back, then checking each client&#039;s intended label without a stale/canonical-name flash. Optional disconnect or resource-stop checks terminate the sequence and clear test-owned fields. The test does not change globals, database records, equipment or player positions; global controls have separate C++ tests. Chat readback verifies server state, so &#039;&#039;&#039;all three clients must still inspect actual visuals&#039;&#039;&#039;. Use matching protocol-34 server/client builds.&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Lua Examples]]&lt;br /&gt;
[[Category:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateVisible&amp;diff=857</id>
		<title>SetPlayerNameplateVisible</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateVisible&amp;diff=857"/>
		<updated>2026-09-09T03:08:51Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerNameplateVisible =&lt;br /&gt;
Sets a player&#039;s global overhead visibility fallback for observers without an explicit visibility override.&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 setPlayerNameplateVisible(int playerId, bool 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;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;visible&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || yes || Whether the overhead label should be rendered.&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 state was accepted; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Hide a label while disguised:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setPlayerNameplateVisible(playerId, false)&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;
* Visibility is reliable, server-authoritative and replayed on relevance entry. A per-observer visibility override takes precedence.&lt;br /&gt;
* False hides the complete overhead label, including its numeric ID and speaking suffix; it does not mute voice audio. Text and ID policy are preserved.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateVisible&amp;diff=856</id>
		<title>IsPlayerNameplateVisible</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateVisible&amp;diff=856"/>
		<updated>2026-09-09T03:08:50Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= isPlayerNameplateVisible =&lt;br /&gt;
Reads the global overhead nameplate visibility policy, before per-observer overrides.&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 isPlayerNameplateVisible(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 the global visibility boolean, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid player. This does not report rendered pixels, distance or per-observer overrides.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Check label visibility:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
if not isPlayerNameplateVisible(playerId) then&lt;br /&gt;
    outputDebugString(&amp;quot;Nameplate hidden&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;
* Use [[isPlayerNameplateVisibleFor]] for a particular observer/target pair.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateText&amp;diff=855</id>
		<title>ResetPlayerNameplateText</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateText&amp;diff=855"/>
		<updated>2026-09-09T03:08:49Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= resetPlayerNameplateText =&lt;br /&gt;
Removes a player&#039;s global custom overhead text, restoring the canonical player name as the fallback.&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 resetPlayerNameplateText(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 state was reset; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Remove a temporary roleplay label:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
resetPlayerNameplateText(playerId)&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;
* Does not clear per-observer text overrides or change visibility/ID policy. See [[Observer nameplates]].&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateText&amp;diff=854</id>
		<title>SetPlayerNameplateText</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateText&amp;diff=854"/>
		<updated>2026-09-09T03:08:48Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerNameplateText =&lt;br /&gt;
Changes a player&#039;s server-authoritative overhead nameplate text.&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 setPlayerNameplateText(int playerId, string text)&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;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || Validated UTF-8 text, or an empty string to restore the default player name.&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 global text was accepted; otherwise returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. This is not a client-render acknowledgement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Show a roleplay label:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setPlayerNameplateText(playerId, &amp;quot;Militia Guard&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;
* Text is limited to 48 Unicode code points and 96 UTF-8 bytes.&lt;br /&gt;
* Control characters, HTML delimiters, ampersands, byte-order marks and bidirectional formatting characters are rejected.&lt;br /&gt;
* The reliable state is replayed during relevance entry and late join.&lt;br /&gt;
* Changes the global fallback only. An explicit [[setPlayerNameplateTextFor|per-observer text override]] still wins; visibility and ID policy are preserved. Custom text does not automatically hide the numeric ID.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=GetPlayerNameplateText&amp;diff=853</id>
		<title>GetPlayerNameplateText</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=GetPlayerNameplateText&amp;diff=853"/>
		<updated>2026-09-09T03:08:46Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= getPlayerNameplateText =&lt;br /&gt;
Returns a player&#039;s custom overhead nameplate text.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
string|false getPlayerNameplateText(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 the global custom UTF-8 text, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when no global custom text is set or the player is invalid.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Read a roleplay label:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local text = getPlayerNameplateText(playerId)&lt;br /&gt;
if text and text ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    outputDebugString(text)&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;
* Reads the global field, not a per-observer override. Use [[getPlayerNameplateStateFor]] for the resolved observer/target view.&lt;br /&gt;
* The numeric ID and speaking marker are not part of the returned text. Numeric ID visibility has separate global and per-observer controls from 0.1.3.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateIdVisible&amp;diff=852</id>
		<title>IsPlayerNameplateIdVisible</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateIdVisible&amp;diff=852"/>
		<updated>2026-09-09T03:08:45Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= isPlayerNameplateIdVisible =&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.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 G1R:MP 0.1.3 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;
Reads the global numeric-ID visibility policy before per-observer overrides.&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 isPlayerNameplateIdVisible(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 the global ID visibility boolean (default true), or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid player/service. It does not report whether a nameplate is currently rendered.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Read global ID policy:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local visible = isPlayerNameplateIdVisible(playerId)&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;
* Use [[isPlayerNameplateIdVisibleFor]] or [[getPlayerNameplateStateFor]] for a particular observer. A globally visible ID can still be hidden because the whole nameplate is hidden.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;IsPlayerNameplateIdVisible&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateIdVisible&amp;diff=851</id>
		<title>SetPlayerNameplateIdVisible</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateIdVisible&amp;diff=851"/>
		<updated>2026-09-09T03:08:43Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerNameplateIdVisible =&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.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 G1R:MP 0.1.3 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 the global numeric session-ID visibility fallback for a human player&#039;s overhead label.&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 setPlayerNameplateIdVisible(int playerId, bool 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;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;visible&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || yes || Strict boolean; true restores the normal ID suffix, false hides only that suffix.&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 global policy; otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. This is not a client-render acknowledgement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Keep a roleplay label while removing its numeric session ID:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
setPlayerNameplateText(playerId, &amp;quot;Stranger&amp;quot;)&lt;br /&gt;
setPlayerNameplateIdVisible(playerId, false)&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;
* Defaults to true. A per-observer ID override takes precedence. Text, whole-label visibility and speaking state are preserved; custom text never automatically hides IDs.&lt;br /&gt;
* Uses existing global-state semantics: not resource-owned and not automatically reverted when the calling resource stops. The runtime state ends on player disconnect; persistent policy must be reapplied by the gamemode.&lt;br /&gt;
* Not a permission boundary or anonymous networking mode; canonical identity remains available in other packets/UI. See [[Observer nameplates]].&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;SetPlayerNameplateIdVisible&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=GetPlayerNameplateStateFor&amp;diff=850</id>
		<title>GetPlayerNameplateStateFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=GetPlayerNameplateStateFor&amp;diff=850"/>
		<updated>2026-09-09T03:08:42Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= getPlayerNameplateStateFor =&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.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 G1R:MP 0.1.3 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;
Returns the resolved server-side overhead policy and explicit override flags for an observer/target pair.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
table|false getPlayerNameplateStateFor(int observerId, int targetId)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns a table with effective &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; (string), &amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt; (bool), &amp;lt;code&amp;gt;idVisible&amp;lt;/code&amp;gt; (bool); flags &amp;lt;code&amp;gt;textOverridden&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;visibilityOverridden&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;idVisibilityOverridden&amp;lt;/code&amp;gt;; and raw &amp;lt;code&amp;gt;textOverride&amp;lt;/code&amp;gt; (string or false), &amp;lt;code&amp;gt;visibleOverride&amp;lt;/code&amp;gt; (bool), &amp;lt;code&amp;gt;idVisibleOverride&amp;lt;/code&amp;gt; (bool). Unset raw fields are false, so use the corresponding flag to distinguish unset from an explicit false. Returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid pair or unavailable service.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Distinguish inherited visibility from an explicit hidden override:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local state = getPlayerNameplateStateFor(observerId, targetId)&lt;br /&gt;
if state then&lt;br /&gt;
    outputDebugString(state.text)&lt;br /&gt;
    if state.visibilityOverridden and state.visibleOverride == false then&lt;br /&gt;
        outputDebugString(&amp;quot;Explicitly hidden for this observer&amp;quot;)&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 ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* Effective text excludes the system numeric-ID suffix and speaking marker. It can be non-empty even when visible is false.&lt;br /&gt;
* The read-only view includes fields owned by any resource. It is not a render acknowledgement, AOI test, or a secure concealment of canonical identity.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;GetPlayerNameplateStateFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateIdVisibleFor&amp;diff=849</id>
		<title>ResetPlayerNameplateIdVisibleFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateIdVisibleFor&amp;diff=849"/>
		<updated>2026-09-09T03:08:40Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= resetPlayerNameplateIdVisibleFor =&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.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 G1R:MP 0.1.3 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;
Removes only the calling resource&#039;s numeric session-ID visibility override for one observer/target pair.&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 resetPlayerNameplateIdVisibleFor(int observerId, int targetId)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&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 owned field is removed or was already absent; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid pair/service or a field owned by another resource.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Resume inheritance from the current global setting:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
resetPlayerNameplateIdVisibleFor(observerId, targetId)&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 ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* A pair field is exclusively owned by the resource that first sets it. Another resource cannot overwrite or reset that field; other fields remain independent. An absent reset and an identical owned write are successful no-ops.&lt;br /&gt;
* Pair overrides survive leaving the synchronization range, but are cleared for both endpoints on disconnect and for their owning resource on stop. State is replayed reliably when the target becomes relevant again; no database persistence is automatic.&lt;br /&gt;
* Limits default to 250,000 active pairs globally and per resource, with a per-resource mutation token bucket of 4,096/s and an 8,192 burst. New/changed non-reset writes consume tokens; resets and cleanup do not. See the guide for configuration keys.&lt;br /&gt;
* Does not restore a saved global snapshot or clear another field. The current target fallback is used immediately in server state; rendering remains asynchronous.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;ResetPlayerNameplateIdVisibleFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateIdVisibleFor&amp;diff=848</id>
		<title>IsPlayerNameplateIdVisibleFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateIdVisibleFor&amp;diff=848"/>
		<updated>2026-09-09T03:08:39Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= isPlayerNameplateIdVisibleFor =&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.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 G1R:MP 0.1.3 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;
Reads the effective numeric session-ID visibility policy for one observer/target pair.&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 isPlayerNameplateIdVisibleFor(int observerId, int targetId)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns the effective boolean after pair/global inheritance, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid pair/service. Use [[getPlayerNameplateStateFor]] to distinguish an explicit false from an unset override.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Read the selected pair without changing state:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local value = isPlayerNameplateIdVisibleFor(observerId, targetId)&lt;br /&gt;
outputDebugString(tostring(value))&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 ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* The read-only view is resource-global; it is not limited to fields owned by the calling resource.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;IsPlayerNameplateIdVisibleFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateIdVisibleFor&amp;diff=847</id>
		<title>SetPlayerNameplateIdVisibleFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateIdVisibleFor&amp;diff=847"/>
		<updated>2026-09-09T03:08:37Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerNameplateIdVisibleFor =&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.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 G1R:MP 0.1.3 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;
Overrides a target player&#039;s overhead numeric session-ID visibility for one observer only.&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 setPlayerNameplateIdVisibleFor(int observerId, int targetId, bool 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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || yes || Strict boolean: false removes only the numeric ID suffix, retaining text and any speaking marker.&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 change or an identical owned no-op; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for invalid arguments/endpoints, ownership conflicts, unavailable service or exhausted limits. Acceptance is not a client-render acknowledgement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Change only observer A&#039;s view of target B:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local accepted = setPlayerNameplateIdVisibleFor(observerId, targetId, false)&lt;br /&gt;
if not accepted then&lt;br /&gt;
    outputDebugString(&amp;quot;Nameplate override 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;
* The ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* A pair field is exclusively owned by the resource that first sets it. Another resource cannot overwrite or reset that field; other fields remain independent. An absent reset and an identical owned write are successful no-ops.&lt;br /&gt;
* Pair overrides survive leaving the synchronization range, but are cleared for both endpoints on disconnect and for their owning resource on stop. State is replayed reliably when the target becomes relevant again; no database persistence is automatic.&lt;br /&gt;
* Limits default to 250,000 active pairs globally and per resource, with a per-resource mutation token bucket of 4,096/s and an 8,192 burst. New/changed non-reset writes consume tokens; resets and cleanup do not. See the guide for configuration keys.&lt;br /&gt;
* Only actual Lua booleans are accepted; numbers, strings, nil and missing arguments return false. Voice audio routing is not changed.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;SetPlayerNameplateIdVisibleFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateVisibleFor&amp;diff=846</id>
		<title>ResetPlayerNameplateVisibleFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateVisibleFor&amp;diff=846"/>
		<updated>2026-09-09T03:08:36Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= resetPlayerNameplateVisibleFor =&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.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 G1R:MP 0.1.3 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;
Removes only the calling resource&#039;s whole-label visibility override for one observer/target pair.&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 resetPlayerNameplateVisibleFor(int observerId, int targetId)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&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 owned field is removed or was already absent; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid pair/service or a field owned by another resource.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Resume inheritance from the current global setting:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
resetPlayerNameplateVisibleFor(observerId, targetId)&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 ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* A pair field is exclusively owned by the resource that first sets it. Another resource cannot overwrite or reset that field; other fields remain independent. An absent reset and an identical owned write are successful no-ops.&lt;br /&gt;
* Pair overrides survive leaving the synchronization range, but are cleared for both endpoints on disconnect and for their owning resource on stop. State is replayed reliably when the target becomes relevant again; no database persistence is automatic.&lt;br /&gt;
* Limits default to 250,000 active pairs globally and per resource, with a per-resource mutation token bucket of 4,096/s and an 8,192 burst. New/changed non-reset writes consume tokens; resets and cleanup do not. See the guide for configuration keys.&lt;br /&gt;
* Does not restore a saved global snapshot or clear another field. The current target fallback is used immediately in server state; rendering remains asynchronous.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;ResetPlayerNameplateVisibleFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateVisibleFor&amp;diff=845</id>
		<title>IsPlayerNameplateVisibleFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=IsPlayerNameplateVisibleFor&amp;diff=845"/>
		<updated>2026-09-09T03:08:34Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= isPlayerNameplateVisibleFor =&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.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 G1R:MP 0.1.3 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;
Reads the effective whole-label visibility policy for one observer/target pair.&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 isPlayerNameplateVisibleFor(int observerId, int targetId)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns the effective boolean after pair/global inheritance, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid pair/service. Use [[getPlayerNameplateStateFor]] to distinguish an explicit false from an unset override.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Read the selected pair without changing state:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local value = isPlayerNameplateVisibleFor(observerId, targetId)&lt;br /&gt;
outputDebugString(tostring(value))&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 ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* The read-only view is resource-global; it is not limited to fields owned by the calling resource.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;IsPlayerNameplateVisibleFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateVisibleFor&amp;diff=844</id>
		<title>SetPlayerNameplateVisibleFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateVisibleFor&amp;diff=844"/>
		<updated>2026-09-09T03:08:33Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerNameplateVisibleFor =&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.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 G1R:MP 0.1.3 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;
Overrides a target player&#039;s overhead whole-label visibility for one observer only.&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 setPlayerNameplateVisibleFor(int observerId, int targetId, bool 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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || yes || Strict boolean: false hides the entire label, including ID and speaking suffix; true permits it under normal rendering rules.&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 change or an identical owned no-op; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for invalid arguments/endpoints, ownership conflicts, unavailable service or exhausted limits. Acceptance is not a client-render acknowledgement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Change only observer A&#039;s view of target B:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local accepted = setPlayerNameplateVisibleFor(observerId, targetId, false)&lt;br /&gt;
if not accepted then&lt;br /&gt;
    outputDebugString(&amp;quot;Nameplate override 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;
* The ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* A pair field is exclusively owned by the resource that first sets it. Another resource cannot overwrite or reset that field; other fields remain independent. An absent reset and an identical owned write are successful no-ops.&lt;br /&gt;
* Pair overrides survive leaving the synchronization range, but are cleared for both endpoints on disconnect and for their owning resource on stop. State is replayed reliably when the target becomes relevant again; no database persistence is automatic.&lt;br /&gt;
* Limits default to 250,000 active pairs globally and per resource, with a per-resource mutation token bucket of 4,096/s and an 8,192 burst. New/changed non-reset writes consume tokens; resets and cleanup do not. See the guide for configuration keys.&lt;br /&gt;
* Only actual Lua booleans are accepted; numbers, strings, nil and missing arguments return false. Voice audio routing is not changed.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;SetPlayerNameplateVisibleFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateTextFor&amp;diff=843</id>
		<title>ResetPlayerNameplateTextFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=ResetPlayerNameplateTextFor&amp;diff=843"/>
		<updated>2026-09-09T03:08:31Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= resetPlayerNameplateTextFor =&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.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 G1R:MP 0.1.3 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;
Removes only the calling resource&#039;s text override for one observer/target pair.&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 resetPlayerNameplateTextFor(int observerId, int targetId)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&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 owned field is removed or was already absent; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for an invalid pair/service or a field owned by another resource.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Resume inheritance from the current global setting:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
resetPlayerNameplateTextFor(observerId, targetId)&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 ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* A pair field is exclusively owned by the resource that first sets it. Another resource cannot overwrite or reset that field; other fields remain independent. An absent reset and an identical owned write are successful no-ops.&lt;br /&gt;
* Pair overrides survive leaving the synchronization range, but are cleared for both endpoints on disconnect and for their owning resource on stop. State is replayed reliably when the target becomes relevant again; no database persistence is automatic.&lt;br /&gt;
* Limits default to 250,000 active pairs globally and per resource, with a per-resource mutation token bucket of 4,096/s and an 8,192 burst. New/changed non-reset writes consume tokens; resets and cleanup do not. See the guide for configuration keys.&lt;br /&gt;
* Does not restore a saved global snapshot or clear another field. The current target fallback is used immediately in server state; rendering remains asynchronous.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;ResetPlayerNameplateTextFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=GetPlayerNameplateTextFor&amp;diff=842</id>
		<title>GetPlayerNameplateTextFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=GetPlayerNameplateTextFor&amp;diff=842"/>
		<updated>2026-09-09T03:08:30Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= getPlayerNameplateTextFor =&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.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 G1R:MP 0.1.3 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;
Returns the explicit text override for one observer/target pair, not its inherited global/default text.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
string|false getPlayerNameplateTextFor(int observerId, int targetId)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Returns ==&lt;br /&gt;
Returns the explicit pair text string, or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; when no pair text override exists or the pair/service is invalid. Use [[getPlayerNameplateStateFor]] for inherited effective text.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Read the selected pair without changing state:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local value = getPlayerNameplateTextFor(observerId, targetId)&lt;br /&gt;
outputDebugString(tostring(value))&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 ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* The read-only view is resource-global; it is not limited to fields owned by the calling resource.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;GetPlayerNameplateTextFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateTextFor&amp;diff=841</id>
		<title>SetPlayerNameplateTextFor</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=SetPlayerNameplateTextFor&amp;diff=841"/>
		<updated>2026-09-09T03:08:28Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document universal per-observer nameplates and test resource available from update 0.1.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= setPlayerNameplateTextFor =&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.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 G1R:MP 0.1.3 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;
Overrides a target player&#039;s overhead text for one observer only.&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 setPlayerNameplateTextFor(int observerId, int targetId, string text)&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;observerId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The connected human player who will see the label.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;targetId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || yes || The different connected human player whose overhead label is controlled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || yes || UTF-8 label; an empty string resets this pair&#039;s text override.&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 change or an identical owned no-op; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; for invalid arguments/endpoints, ownership conflicts, unavailable service or exhausted limits. Acceptance is not a client-render acknowledgement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Change only observer A&#039;s view of target B:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line&amp;gt;&lt;br /&gt;
local accepted = setPlayerNameplateTextFor(observerId, targetId, &amp;quot;Known friend&amp;quot;)&lt;br /&gt;
if not accepted then&lt;br /&gt;
    outputDebugString(&amp;quot;Nameplate override 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;
* The ordered pair is observer -&amp;gt; target; the reverse pair is independent. Both IDs must be distinct, connected session IDs, not persistent character IDs or NPC IDs.&lt;br /&gt;
* Each field resolves independently: explicit pair override, then the target&#039;s current global field, then the native default. Getters expose server policy, not whether pixels are currently rendered.&lt;br /&gt;
* No built-in acquaintance database or gamemode permission policy is assumed. See [[Observer nameplates]] for resource ownership, limits, persistence and privacy boundaries.&lt;br /&gt;
* A pair field is exclusively owned by the resource that first sets it. Another resource cannot overwrite or reset that field; other fields remain independent. An absent reset and an identical owned write are successful no-ops.&lt;br /&gt;
* Pair overrides survive leaving the synchronization range, but are cleared for both endpoints on disconnect and for their owning resource on stop. State is replayed reliably when the target becomes relevant again; no database persistence is automatic.&lt;br /&gt;
* Limits default to 250,000 active pairs globally and per resource, with a per-resource mutation token bucket of 4,096/s and an 8,192 burst. New/changed non-reset writes consume tokens; resets and cleanup do not. See the guide for configuration keys.&lt;br /&gt;
* Text is limited to 48 Unicode code points and 96 UTF-8 bytes. Invalid UTF-8, control characters, &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;, byte-order marks, zero-width and bidirectional formatting characters rejected by the shared validator are not accepted.&lt;br /&gt;
* Custom text never changes the canonical player name and does not implicitly hide the ID. Use [[setPlayerNameplateIdVisibleFor]] separately.&lt;br /&gt;
* PascalCase alias: &amp;lt;code&amp;gt;SetPlayerNameplateTextFor&amp;lt;/code&amp;gt;.&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:Nameplate Functions]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=Category:Appearance_Functions&amp;diff=840</id>
		<title>Category:Appearance Functions</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Category:Appearance_Functions&amp;diff=840"/>
		<updated>2026-09-09T02:32:39Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document skin color and tattoos available from 0.1.3; identity/armor improvements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- This category is synchronized from the verified Lua API catalog. --&amp;gt;&lt;br /&gt;
Server-side functions for authoritative identity and cosmetic appearance. Seven independent skin-color and tattoo functions are available from update 0.1.3; see [[Player customization]] and [[Player tattoo catalog]]. Existing [[setPlayerIdentity]] head/armor handling is improved from update 0.1.3 while retaining the game-owned body and equipped armor. Older body/face compatibility APIs remain separately marked deprecated.&lt;br /&gt;
&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=Lua_API_catalogs&amp;diff=839</id>
		<title>Lua API catalogs</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=Lua_API_catalogs&amp;diff=839"/>
		<updated>2026-09-09T02:32:38Z</updated>

		<summary type="html">&lt;p&gt;QCherry: Document skin color and tattoos available from 0.1.3; identity/armor improvements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Lua API catalogs}}&lt;br /&gt;
&#039;&#039;&#039;Lua API catalogs&#039;&#039;&#039; collect stable, server-validated keys used by G1R:MP resources. Prefer catalog keys and enumeration functions over hard-coded Unreal paths.&lt;br /&gt;
&lt;br /&gt;
== Static catalogs ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Catalog !! Used by&lt;br /&gt;
|-&lt;br /&gt;
| [[Player skin catalog]] || [[setPlayerSkin]], [[setNpcSkin]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player body catalog]] || deprecated compatibility reference for [[setPlayerBody]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player face catalog]] || deprecated compatibility reference for [[setPlayerFace]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player head catalog]] || deprecated compatibility reference for [[setPlayerHead]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player identity catalog]] || supported complete identity setter [[setPlayerIdentity]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Player tattoo catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.3)&amp;lt;/span&amp;gt; || [[setPlayerTattoo]], [[getPlayerTattooNames]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Synchronized spell catalog]] || basic synchronized spell set for G1R:MP 0.1a&lt;br /&gt;
|-&lt;br /&gt;
| [[Monster type catalog]] || [[spawnMonster]]&lt;br /&gt;
|-&lt;br /&gt;
| [[World item catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || [[spawnItem]] and [[spawnTestItem]]&lt;br /&gt;
|-&lt;br /&gt;
| [[NPC and monster navigation collision]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || NPC and monster collision-source modes and resource-owned AI navigation blockers&lt;br /&gt;
|-&lt;br /&gt;
| [[Player animation catalog]] &amp;lt;span style=&amp;quot;color:#000; background:#ffcdd2; border:1px solid #c62828; font-weight:bold; padding:0.08em 0.35em; border-radius:0.2em;&amp;quot;&amp;gt;(available from update 0.1.2)&amp;lt;/span&amp;gt; || [[startAnim]] and [[stopAnim]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Camera scripting ==&lt;br /&gt;
[[Scripted camera]] and [[:Category:Camera Functions|Camera Functions]] document camera poses, units, state fields, movement, paths, orbits and client/server ownership. These new functions and their client events are &#039;&#039;&#039;available from update 0.1.3&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Player customization ==&lt;br /&gt;
[[Player customization]] documents the &#039;&#039;&#039;seven skin-color and tattoo functions available from update 0.1.3&#039;&#039;&#039;, including RGB ranges, independent resets, tattoo removal and persistence. Existing [[setPlayerIdentity]] head/armor handling is &#039;&#039;&#039;improved from update 0.1.3&#039;&#039;&#039;; it is not a newly introduced identity API or a full NPC body replacement.&lt;br /&gt;
&lt;br /&gt;
== Runtime catalogs ==&lt;br /&gt;
These functions return the authoritative keys supported by the running server build:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function !! Values&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerArmorNames]] || Armor keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerTattooNames]] || Tattoo preset keys (available from update 0.1.3)&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerWeaponNames]] || Melee weapon keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerRangedWeaponNames]] || Bow and crossbow keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerAmmunitionNames]] || Ammunition keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerRuneNames]] || All rune/spell-item keys; not a synchronization-support list&lt;br /&gt;
|-&lt;br /&gt;
| [[getSpellCatalog]] || All spell definitions and their &amp;lt;code&amp;gt;implemented&amp;lt;/code&amp;gt; status; see [[Synchronized spell catalog]]&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerStatNames]] || Progression statistic keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerSkillNames]] || Skill keys&lt;br /&gt;
|-&lt;br /&gt;
| [[getPlayerGuildNames]] || Guild keys&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local function contains(values, wanted)&lt;br /&gt;
    for _, value in ipairs(values) do&lt;br /&gt;
        if value == wanted then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if contains(getPlayerArmorNames(), &amp;quot;none&amp;quot;) then&lt;br /&gt;
    setPlayerArmor(playerId, &amp;quot;none&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua API]]&lt;br /&gt;
[[Category:Lua Catalogs]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
</feed>