
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[G1R:MP Forum - G1 Remake Multiplayer Community - Suggestions]]></title>
		<link>https://g1r-mp.com/forum/</link>
		<description><![CDATA[G1R:MP Forum - G1 Remake Multiplayer Community - https://g1r-mp.com/forum]]></description>
		<pubDate>Wed, 04 Nov 2026 01:06:57 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Monster/NPC-Animation / World Snap / Torches / Magic]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=72</link>
			<pubDate>Fri, 23 Oct 2026 05:51:44 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=12">Chenentano</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=72</guid>
			<description><![CDATA[Would be great, if we get some functions to script monsters, so we can script the monsters entirely, when a monster gets hit he goes for a dodge for example. Right now its a bit easy to outplay them, and i cant script a real fight like the minecrawler queen.<br />
<br />
Examples:<br />
setMonsterAnim(sleep)<br />
SetMonsterAttackSpeed(2)<br />
SetNativeAI(true)<br />
<br />
setNPCNativeAI(true) or smth<br />
<br />
__<br />
<br />
Right now monsters can run trough walls etc, would be great if it's possible to fix it engine sided.<br />
<br />
__<br />
<br />
I cant find a way to equip torches right now except the via native menu. The same with magic runes and scrolls.]]></description>
			<content:encoded><![CDATA[Would be great, if we get some functions to script monsters, so we can script the monsters entirely, when a monster gets hit he goes for a dodge for example. Right now its a bit easy to outplay them, and i cant script a real fight like the minecrawler queen.<br />
<br />
Examples:<br />
setMonsterAnim(sleep)<br />
SetMonsterAttackSpeed(2)<br />
SetNativeAI(true)<br />
<br />
setNPCNativeAI(true) or smth<br />
<br />
__<br />
<br />
Right now monsters can run trough walls etc, would be great if it's possible to fix it engine sided.<br />
<br />
__<br />
<br />
I cant find a way to equip torches right now except the via native menu. The same with magic runes and scrolls.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Własne animacje + propy]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=71</link>
			<pubDate>Wed, 21 Oct 2026 14:49:18 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=27">JoePL</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=71</guid>
			<description><![CDATA[Dodać możliwość dodawania swoich animacji oraz modeli.]]></description>
			<content:encoded><![CDATA[Dodać możliwość dodawania swoich animacji oraz modeli.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[setLoadingScreenSkip]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=65</link>
			<pubDate>Sun, 27 Sep 2026 09:36:33 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=20">Rul3zZ</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=65</guid>
			<description><![CDATA[After joining, players always get the native "click to continue" screen before our own UI starts. On an RP server that breaks the flow into our login and character selection.<br />
__________ <br />
<br />
setLoadingScreenSkip(true)<br />
<br />
addEventHandler("onClientLoadingScreenFinished", root, function()<br />
    showLoginMenu()<br />
end)<br />
<br />
__________<br />
<ul class="mycode_list"><li>Default stays as it is today (false), so nothing changes for other servers.<br />
</li>
<li>Nice to have: setLoadingScreenText("...") for our own hint text on the loading screen.<br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[After joining, players always get the native "click to continue" screen before our own UI starts. On an RP server that breaks the flow into our login and character selection.<br />
__________ <br />
<br />
setLoadingScreenSkip(true)<br />
<br />
addEventHandler("onClientLoadingScreenFinished", root, function()<br />
    showLoginMenu()<br />
end)<br />
<br />
__________<br />
<ul class="mycode_list"><li>Default stays as it is today (false), so nothing changes for other servers.<br />
</li>
<li>Nice to have: setLoadingScreenText("...") for our own hint text on the loading screen.<br />
</li>
</ul>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[playSoundFromGame]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=64</link>
			<pubDate>Sun, 27 Sep 2026 09:25:14 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=20">Rul3zZ</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=64</guid>
			<description><![CDATA[Play a sound or voice line directly from the installed game, with the same behavior and handle as <span style="font-weight: bold;" class="mycode_b">playSound playSound3D</span>.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>local handle = playSoundFromGame("GVL_G1R_VOICE24_CONVERSATIONSMALLTALK_3", false, 0.8)</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>local handle = playSoundFromGame3D("GVL_G1R_VOICE24_CONVERSATIONSMALLTALK_3", x, y, z, false, 0.72, 1.5, 18.0)</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>stopSound(handle)</code></div></div><ul class="mycode_list"><li>Plays in the player's own game language.<br />
</li>
<li>Returns <span style="font-weight: bold;" class="mycode_b">false </span>if the key doesn't exist.<br />
</li>
<li>The handle works with the existing audio functions (stopSound, setSoundVolume, setSound3DPosition, ...).<br />
</li>
</ul>
<br />
Use case: ambient NPC chatter on RP servers using the game's own voice types.]]></description>
			<content:encoded><![CDATA[Play a sound or voice line directly from the installed game, with the same behavior and handle as <span style="font-weight: bold;" class="mycode_b">playSound playSound3D</span>.<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>local handle = playSoundFromGame("GVL_G1R_VOICE24_CONVERSATIONSMALLTALK_3", false, 0.8)</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>local handle = playSoundFromGame3D("GVL_G1R_VOICE24_CONVERSATIONSMALLTALK_3", x, y, z, false, 0.72, 1.5, 18.0)</code></div></div><div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>stopSound(handle)</code></div></div><ul class="mycode_list"><li>Plays in the player's own game language.<br />
</li>
<li>Returns <span style="font-weight: bold;" class="mycode_b">false </span>if the key doesn't exist.<br />
</li>
<li>The handle works with the existing audio functions (stopSound, setSoundVolume, setSound3DPosition, ...).<br />
</li>
</ul>
<br />
Use case: ambient NPC chatter on RP servers using the game's own voice types.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Kilka sugestii]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=63</link>
			<pubDate>Wed, 23 Sep 2026 21:24:17 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=27">JoePL</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=63</guid>
			<description><![CDATA[1. Tryb broni gracza (wyciągnięta czy schowana)<br />
Dziś serwer widzi tylko, co gracz ma w slotach, a nie to, czy trzyma broń w dłoni. Dla magii jest to już dostępne (<br />
inHand w onPlayerSpellEquip), dla broni białej i łuku nie.<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>getPlayerWeaponMode(playerId)  --&gt; "none"|"fist"|"melee"|"bow"|"crossbow"|"magic"
onPlayerWeaponModeChange(playerId, previousMode, newMode)</code></div></div><br />
<br />
<br />
2. Obrażenia NPC<br />
Dziś żadne zdarzenie nie mówi, że gracz uderzył NPC. onPlayerHitdotyczy tylko walki gracz–gracz.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>onNpcDamage(npcId, attackerId, damage, damageType, healthAfter)
setNpcHealth(npcId, hp) / setNpcMaxHealth(npcId, hp) / getNpcHealth(npcId)
setNpcInvulnerable(npcId, true)  -- kupiec, którego nie da się zabić
onNpcDeath(npcId, killerId)</code></div></div><br />
<br />
<br />
3. Wyciąganie broni przez NPC<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>setNpcWeaponMode(npcId, "melee")  -- wyciąga broń z setNpcWeapon
setNpcWeaponMode(npcId, "none")    -- chowa</code></div></div><br />
<br />
<br />
4. Obrót NPC w stronę gracza<br />
Dziś jedyną drogą jest setNpcPosition z nowym kątem, czyli teleport, który przerywa trasę.<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>setNpcLookAt(npcId, playerId)      -- obraca się i śledzi gracza wzrokiem
setNpcLookAt(npcId, false)        -- koniec</code></div></div><br />
<br />
<br />
<br />
5. Atak NPC na gracza (potwory już to mają przez setMonsterTarget)<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>setNpcCombatTarget(npcId, playerId)  -- strażnik atakuje
setNpcCombatTarget(npcId, false)      -- przerywa walkę
setNpcAttackDamage(npcId, 15)
onNpcAttack(npcId, targetPlayerId, damage)</code></div></div><br />
<br />
6. Animacje NPC (ten sam katalog 118 animacji co startAnim dla graczy)<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>startNpcAnim(npcId, "threaten", false, 0.15)  -- gest „schowaj to!”
stopNpcAnim(npcId)</code></div></div><br />
<br />
<br />
7. Percepcja NPC (wzrok z przeszkodami, jak isPlayerInTarget, ale dla NPC)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>isNpcSeeingPlayer(npcId, playerId [, maxDist = 15, fov = 120])  --&gt; bool</code></div></div>]]></description>
			<content:encoded><![CDATA[1. Tryb broni gracza (wyciągnięta czy schowana)<br />
Dziś serwer widzi tylko, co gracz ma w slotach, a nie to, czy trzyma broń w dłoni. Dla magii jest to już dostępne (<br />
inHand w onPlayerSpellEquip), dla broni białej i łuku nie.<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>getPlayerWeaponMode(playerId)  --&gt; "none"|"fist"|"melee"|"bow"|"crossbow"|"magic"
onPlayerWeaponModeChange(playerId, previousMode, newMode)</code></div></div><br />
<br />
<br />
2. Obrażenia NPC<br />
Dziś żadne zdarzenie nie mówi, że gracz uderzył NPC. onPlayerHitdotyczy tylko walki gracz–gracz.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>onNpcDamage(npcId, attackerId, damage, damageType, healthAfter)
setNpcHealth(npcId, hp) / setNpcMaxHealth(npcId, hp) / getNpcHealth(npcId)
setNpcInvulnerable(npcId, true)  -- kupiec, którego nie da się zabić
onNpcDeath(npcId, killerId)</code></div></div><br />
<br />
<br />
3. Wyciąganie broni przez NPC<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>setNpcWeaponMode(npcId, "melee")  -- wyciąga broń z setNpcWeapon
setNpcWeaponMode(npcId, "none")    -- chowa</code></div></div><br />
<br />
<br />
4. Obrót NPC w stronę gracza<br />
Dziś jedyną drogą jest setNpcPosition z nowym kątem, czyli teleport, który przerywa trasę.<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>setNpcLookAt(npcId, playerId)      -- obraca się i śledzi gracza wzrokiem
setNpcLookAt(npcId, false)        -- koniec</code></div></div><br />
<br />
<br />
<br />
5. Atak NPC na gracza (potwory już to mają przez setMonsterTarget)<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>setNpcCombatTarget(npcId, playerId)  -- strażnik atakuje
setNpcCombatTarget(npcId, false)      -- przerywa walkę
setNpcAttackDamage(npcId, 15)
onNpcAttack(npcId, targetPlayerId, damage)</code></div></div><br />
<br />
6. Animacje NPC (ten sam katalog 118 animacji co startAnim dla graczy)<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>startNpcAnim(npcId, "threaten", false, 0.15)  -- gest „schowaj to!”
stopNpcAnim(npcId)</code></div></div><br />
<br />
<br />
7. Percepcja NPC (wzrok z przeszkodami, jak isPlayerInTarget, ale dla NPC)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>isNpcSeeingPlayer(npcId, playerId [, maxDist = 15, fov = 120])  --&gt; bool</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Cancellable pre-action hooks for custom resources]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=61</link>
			<pubDate>Thu, 17 Sep 2026 16:02:48 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=20">Rul3zZ</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=61</guid>
			<description><![CDATA[Hi! <br />
<br />
Could G1R:MP expose server-side hooks that let custom resources reject gameplay actions before their effects are applied?<br />
According to the wiki, pickup, drop and damage events report completed changes.<br />
For RP servers, public pre-action hooks would allow ownership checks, protected items and custom combat restrictions.<br />
<br />
For example.:<br />
<br />
_____________________________________________________<br />
<br />
addEventHandler("onPlayerRequestPickup", root,<br />
    function(playerId, objectId)<br />
        -- Custom permission check<br />
        if not canPlayerTakeItem(playerId, objectId) then<br />
            cancelEvent()<br />
        end<br />
    end<br />
)<br />
<br />
_____________________________________________________<br />
<br />
<br />
Similar hooks for dropping, equipping, consuming items and applying damage would be useful. Cancellation should prevent the action without requiring scripts to undo inventory or health changes afterward.<br />
<br />
This would complement the existing native validation and completion events. Are public pre-action hooks planned?]]></description>
			<content:encoded><![CDATA[Hi! <br />
<br />
Could G1R:MP expose server-side hooks that let custom resources reject gameplay actions before their effects are applied?<br />
According to the wiki, pickup, drop and damage events report completed changes.<br />
For RP servers, public pre-action hooks would allow ownership checks, protected items and custom combat restrictions.<br />
<br />
For example.:<br />
<br />
_____________________________________________________<br />
<br />
addEventHandler("onPlayerRequestPickup", root,<br />
    function(playerId, objectId)<br />
        -- Custom permission check<br />
        if not canPlayerTakeItem(playerId, objectId) then<br />
            cancelEvent()<br />
        end<br />
    end<br />
)<br />
<br />
_____________________________________________________<br />
<br />
<br />
Similar hooks for dropping, equipping, consuming items and applying damage would be useful. Cancellation should prevent the action without requiring scripts to undo inventory or health changes afterward.<br />
<br />
This would complement the existing native validation and completion events. Are public pre-action hooks planned?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Instances / Virtual Worlds]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=60</link>
			<pubDate>Thu, 17 Sep 2026 15:58:47 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=20">Rul3zZ</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=60</guid>
			<description><![CDATA[Hi! <br />
<br />
For our Roleplay server, this would be useful for character creation, private RP events and separate dungeon groups.<br />
<br />
Players in different instances should not see, hear or interact with each other. NPCs, world items, combat and spatial voice should respect the same separation.<br />
<br />
For example.:<br />
 __________________________________________ <br />
<br />
local instanceId = createInstance()<br />
<br />
setPlayerInstance(playerId, instanceId)<br />
setNpcInstance(npcId, instanceId)<br />
<br />
-- Return to the main world<br />
setPlayerInstance(playerId, 0)<br />
<br />
-- Once players have left<br />
destroyInstance(instanceId)<br />
<br />
__________________________________________<br />
<br />
Server-controlled membership and clear cleanup rules would help prevent entities or interactions leaking between instances.<br />
<br />
I couldn't find this in the wiki. Is something similar already available or planned?]]></description>
			<content:encoded><![CDATA[Hi! <br />
<br />
For our Roleplay server, this would be useful for character creation, private RP events and separate dungeon groups.<br />
<br />
Players in different instances should not see, hear or interact with each other. NPCs, world items, combat and spatial voice should respect the same separation.<br />
<br />
For example.:<br />
 __________________________________________ <br />
<br />
local instanceId = createInstance()<br />
<br />
setPlayerInstance(playerId, instanceId)<br />
setNpcInstance(npcId, instanceId)<br />
<br />
-- Return to the main world<br />
setPlayerInstance(playerId, 0)<br />
<br />
-- Once players have left<br />
destroyInstance(instanceId)<br />
<br />
__________________________________________<br />
<br />
Server-controlled membership and clear cleanup rules would help prevent entities or interactions leaking between instances.<br />
<br />
I couldn't find this in the wiki. Is something similar already available or planned?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Object placement previews and editing API]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=59</link>
			<pubDate>Thu, 17 Sep 2026 15:55:56 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=20">Rul3zZ</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=59</guid>
			<description><![CDATA[Hi! <br />
<br />
For our Roleplay server, we are building an in-game world editor.<br />
<br />
`spawnItem` already supports exact coordinates, yaw and ground snapping. <br />
<br />
To complement this, could we get:<br />
<br />
- Transparent, client-only previews without collision or pickup.<br />
- Camera raycasts for placement targeting.<br />
- Functions to move, rotate and delete existing world items.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u">an small Example.:</span><br />
____________________________________________________________<br />
<br />
-- Client: local preview<br />
local preview = createObjectPreview("itfo_apple", x, y, z)<br />
setObjectPreviewOpacity(preview, 0.45)<br />
<br />
local hit = raycastFromCamera(maxDistance)<br />
if hit then<br />
    setObjectPreviewPosition(preview, hit.x, hit.y, hit.z)<br />
    setObjectPreviewRotation(preview, yaw)<br />
end<br />
<br />
destroyObjectPreview(preview)<br />
<br />
-- Server: edit an existing item<br />
setWorldItemPosition(objectId, x, y, z)<br />
setWorldItemRotation(objectId, yaw)<br />
destroyWorldItem(objectId)<br />
<br />
________________________________________________________<br />
<br />
Placement would use the existing `spawnItem` after server validation. <br />
These additions would allow preview → adjust → confirm, plus editing placed items.<br />
<br />
I couldn't find these features in the wiki. If equivalents already exist, a short example would be appreciated!<br />
<br />
Cheers!]]></description>
			<content:encoded><![CDATA[Hi! <br />
<br />
For our Roleplay server, we are building an in-game world editor.<br />
<br />
`spawnItem` already supports exact coordinates, yaw and ground snapping. <br />
<br />
To complement this, could we get:<br />
<br />
- Transparent, client-only previews without collision or pickup.<br />
- Camera raycasts for placement targeting.<br />
- Functions to move, rotate and delete existing world items.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u">an small Example.:</span><br />
____________________________________________________________<br />
<br />
-- Client: local preview<br />
local preview = createObjectPreview("itfo_apple", x, y, z)<br />
setObjectPreviewOpacity(preview, 0.45)<br />
<br />
local hit = raycastFromCamera(maxDistance)<br />
if hit then<br />
    setObjectPreviewPosition(preview, hit.x, hit.y, hit.z)<br />
    setObjectPreviewRotation(preview, yaw)<br />
end<br />
<br />
destroyObjectPreview(preview)<br />
<br />
-- Server: edit an existing item<br />
setWorldItemPosition(objectId, x, y, z)<br />
setWorldItemRotation(objectId, yaw)<br />
destroyWorldItem(objectId)<br />
<br />
________________________________________________________<br />
<br />
Placement would use the existing `spawnItem` after server validation. <br />
These additions would allow preview → adjust → confirm, plus editing placed items.<br />
<br />
I couldn't find these features in the wiki. If equivalents already exist, a short example would be appreciated!<br />
<br />
Cheers!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Feature request] IsPlayerCombatMode]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=57</link>
			<pubDate>Tue, 15 Sep 2026 17:40:36 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=4">PaolSon44</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=57</guid>
			<description><![CDATA[Hey,<br />
<br />
Something like that will be cool:<br />
<br />
<span style="font-size: large;" class="mycode_size">isPlayerCombatMode</span><br />
<hr class="mycode_hr" />
Checks wheter player is in combat mode. Usually like held melee / distance weapon, fists or use magic.<br />
<br />
<span style="font-size: large;" class="mycode_size">Syntax</span><br />
<hr class="mycode_hr" />
<blockquote class="mycode_quote"><cite>Quote:</cite>bool isPlayerCombatMode(int playerId)  </blockquote>
<br />
<span style="font-size: large;" class="mycode_size">Examples</span><br />
<hr class="mycode_hr" />
<blockquote class="mycode_quote"><cite>Quote:</cite>if isPlayerCombatMode(playerId) then<br />
    unbindKey("tab", "both", handleScoreboard)<br />
end </blockquote>
<br />
In this way server can check player combat state, so this will enable to protect other functions which would be disturb a combat.  <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />]]></description>
			<content:encoded><![CDATA[Hey,<br />
<br />
Something like that will be cool:<br />
<br />
<span style="font-size: large;" class="mycode_size">isPlayerCombatMode</span><br />
<hr class="mycode_hr" />
Checks wheter player is in combat mode. Usually like held melee / distance weapon, fists or use magic.<br />
<br />
<span style="font-size: large;" class="mycode_size">Syntax</span><br />
<hr class="mycode_hr" />
<blockquote class="mycode_quote"><cite>Quote:</cite>bool isPlayerCombatMode(int playerId)  </blockquote>
<br />
<span style="font-size: large;" class="mycode_size">Examples</span><br />
<hr class="mycode_hr" />
<blockquote class="mycode_quote"><cite>Quote:</cite>if isPlayerCombatMode(playerId) then<br />
    unbindKey("tab", "both", handleScoreboard)<br />
end </blockquote>
<br />
In this way server can check player combat state, so this will enable to protect other functions which would be disturb a combat.  <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Nameplate Color]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=55</link>
			<pubDate>Sun, 13 Sep 2026 17:14:36 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=11">Xardas0327</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=55</guid>
			<description><![CDATA[It would be useful, if we can change the nameplates' color.<br />
I think it can be useful for deathmatch teams or for guilds.<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>SetPlayerNameplateColor(playerid, r, g, b)</blockquote>
<blockquote class="mycode_quote"><cite>Quote:</cite>local r, g, b =  GetPlayerNameplateColor(playerid)</blockquote>
<br />
I think it is useless if the name and the id can has different color, but who knows. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />]]></description>
			<content:encoded><![CDATA[It would be useful, if we can change the nameplates' color.<br />
I think it can be useful for deathmatch teams or for guilds.<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>SetPlayerNameplateColor(playerid, r, g, b)</blockquote>
<blockquote class="mycode_quote"><cite>Quote:</cite>local r, g, b =  GetPlayerNameplateColor(playerid)</blockquote>
<br />
I think it is useless if the name and the id can has different color, but who knows. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Random Number]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=54</link>
			<pubDate>Sun, 13 Sep 2026 17:04:38 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=11">Xardas0327</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=54</guid>
			<description><![CDATA[It would be good if we have random number generator.<br />
<br />
For example:<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>getRandomInt(includeMinInt, excludeMaxInt) -- Maybe it also should be fine if the top number is include too. </blockquote>
<br />
and<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>getRandomFloat (includeMinFloat, includeMaxFloat ) -- The top number should be included here.</blockquote>
<br />
Note:<br />
I tried to use this code. But if I use this code, the server drop my character and the server reconnected it. (even on 0.1.3)<br />
Moreover, this is not true random. I should use something similar like this <span style="font-style: italic;" class="mycode_i">math.randomseed(os.time()),</span> but the os is not available from 0.1.3.<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>local startPositions = {<br />
    { x = 1116.75, y = -1007.51, z = -36.66 },<br />
    { x = 1106.01, y = -1049.35, z = -29.86 },<br />
    { x = 1100.28, y = -1050.55, z = -35.44 },<br />
    { x = 1115.40, y = -1049.39, z = -37.10 },<br />
    { x = 1161.29, y = -1050.89, z = -42.04 },<br />
    { x = 1154.55, y = -1011.29, z = -42.16 },<br />
}<br />
<br />
addCommandHandler("castle", function(playerId, commandName)<br />
    local randomIndex = math.random(1, #startPositions)<br />
    setPlayerPosition(<br />
        playerId,<br />
        startPositions[randomIndex].x,<br />
        startPositions[randomIndex].y,<br />
        startPositions[randomIndex].z<br />
    )<br />
end)</blockquote>
]]></description>
			<content:encoded><![CDATA[It would be good if we have random number generator.<br />
<br />
For example:<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>getRandomInt(includeMinInt, excludeMaxInt) -- Maybe it also should be fine if the top number is include too. </blockquote>
<br />
and<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>getRandomFloat (includeMinFloat, includeMaxFloat ) -- The top number should be included here.</blockquote>
<br />
Note:<br />
I tried to use this code. But if I use this code, the server drop my character and the server reconnected it. (even on 0.1.3)<br />
Moreover, this is not true random. I should use something similar like this <span style="font-style: italic;" class="mycode_i">math.randomseed(os.time()),</span> but the os is not available from 0.1.3.<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>local startPositions = {<br />
    { x = 1116.75, y = -1007.51, z = -36.66 },<br />
    { x = 1106.01, y = -1049.35, z = -29.86 },<br />
    { x = 1100.28, y = -1050.55, z = -35.44 },<br />
    { x = 1115.40, y = -1049.39, z = -37.10 },<br />
    { x = 1161.29, y = -1050.89, z = -42.04 },<br />
    { x = 1154.55, y = -1011.29, z = -42.16 },<br />
}<br />
<br />
addCommandHandler("castle", function(playerId, commandName)<br />
    local randomIndex = math.random(1, #startPositions)<br />
    setPlayerPosition(<br />
        playerId,<br />
        startPositions[randomIndex].x,<br />
        startPositions[randomIndex].y,<br />
        startPositions[randomIndex].z<br />
    )<br />
end)</blockquote>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Webp format]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=52</link>
			<pubDate>Wed, 09 Sep 2026 14:10:10 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=27">JoePL</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=52</guid>
			<description><![CDATA[Would it be possible to add support for the **WebP format to RMLUI**? This would be very useful for textures and UI icons, as WebP allows for significantly smaller file sizes while maintaining good quality. Ideally, it would work similarly to the current support for PNG/JPG.]]></description>
			<content:encoded><![CDATA[Would it be possible to add support for the **WebP format to RMLUI**? This would be very useful for textures and UI icons, as WebP allows for significantly smaller file sizes while maintaining good quality. Ideally, it would work similarly to the current support for PNG/JPG.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[SpawnItemAt]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=49</link>
			<pubDate>Sun, 06 Sep 2026 19:08:54 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=12">Chenentano</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=49</guid>
			<description><![CDATA[Hey,<br />
<br />
it would be great if we get a new function to randomize the position of the spawned items<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>spawnItemAt(itemKey, x, y, z)</code></div></div><br />
<br />
Greetings <img src="https://g1r-mp.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" />]]></description>
			<content:encoded><![CDATA[Hey,<br />
<br />
it would be great if we get a new function to randomize the position of the spawned items<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>spawnItemAt(itemKey, x, y, z)</code></div></div><br />
<br />
Greetings <img src="https://g1r-mp.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[# Feature request: per-observer nameplate state]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=45</link>
			<pubDate>Sun, 06 Sep 2026 12:02:57 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=27">JoePL</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=45</guid>
			<description><![CDATA[<span style="color: #bbbebf;" class="mycode_color"><span style="font-family: Consolas, 'Courier New', monospace;" class="mycode_font"><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"># Feature request: per-observer nameplate state</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Target:**</span></span> G1R:MP scripting API (server-side)<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Requested by:**</span></span> Eldoria RolePlay<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Verified against:**</span></span> documentation dump 1.2.1 / platform update 0.1.2<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Status of workarounds:**</span></span> all known alternatives verified and ruled out (§4)<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 1. What we are trying to build</span></span><br />
<br />
A <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**stranger system**</span></span>: a roleplay server where a character's name is not public<br />
knowledge. You do not know who someone is until they tell you.<br />
<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Two players who have never met see each other as <span style="color: #79c0ff;" class="mycode_color">`Nieznajomy (147)`</span><br />
  ("Stranger #147") — a stable per-character number, not a name.<br />
<span style="color: #ffa657;" class="mycode_color">-</span> After an in-character introduction (<span style="color: #79c0ff;" class="mycode_color">`/przedstaw`</span>), each side learns the<br />
  other's real name <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**permanently**</span></span>, and only for themselves.<br />
<span style="color: #ffa657;" class="mycode_color">-</span> The relation is directional and per-pair: A knowing B says nothing about<br />
  whether C knows B.<br />
<br />
The chat side of this already works — we send chat messages per recipient, so<br />
each observer can be given a different sender label.<br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**The overhead nameplate is the only thing we cannot do**</span></span>, and it defeats the<br />
whole feature: the name floats above the character's head for everyone<br />
regardless of what the observer has learned.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 2. What we are asking for</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">### 2.1 Preferred: per-observer nameplate text</span></span></span></span><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool setPlayerNameplateTextFor(int observerId, int targetId, string text)</code></div></div><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool resetPlayerNameplateTextFor(int observerId, int targetId)</code></div></div><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>string|false getPlayerNameplateTextFor(int observerId, int targetId)</code></div></div><br />
<br />
<span style="color: #bbbebf;" class="mycode_color"><span style="font-family: Consolas, 'Courier New', monospace;" class="mycode_font"><br />
Sets the nameplate text that <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`observerId`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"> sees above </span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`targetId`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span>, overriding<br />
the global value set by <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateText`</span>.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">### 2.2 Minimal acceptable: per-observer nameplate visibility</span></span><br />
<br />
If per-observer text is too invasive, a per-observer <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**visibility**</span></span> toggle is<br />
enough to unblock us:<br />
</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool setPlayerNameplateVisibleFor(int observerId, int targetId, bool visible)</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool resetPlayerNameplateVisibleFor(int observerId, int targetId)</code></div></div><br />
<br />
<span style="color: #bbbebf;" class="mycode_color"><span style="font-family: Consolas, 'Courier New', monospace;" class="mycode_font"><br />
<br />
We would then keep the global nameplate text as the character's <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**real name**</span></span><br />
and hide it from observers who have not been introduced. Strangers see no<br />
nameplate at all; the <span style="color: #79c0ff;" class="mycode_color">`Nieznajomy (147)`</span> label is carried by chat only.<br />
<br />
This is strictly smaller than 2.1 and reuses state the engine already<br />
replicates. <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Either one unblocks the feature — we do not need both.**</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 3. Semantics we need</span></span><br />
<br />
These apply to both variants.<br />
<br />
| Aspect | Required behaviour |<br />
| --- | --- |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Precedence**</span></span> | The per-observer value overrides the global one. With no override present, the observer sees exactly what <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateText`</span> / <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateVisible`</span> set. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Default**</span></span> | No overrides exist. Current behaviour is unchanged for every resource that does not call the new functions. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Direction**</span></span> | Strictly one-way. <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateTextFor(A, B, ...)`</span> must not affect what B sees above A. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Replication**</span></span> | Same guarantees as the existing nameplate state: reliable, server-authoritative, <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**replayed on relevance entry and late join**</span></span>. Without this, an override silently disappears when the pair walks apart and back together. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Lifetime**</span></span> | Cleared automatically when <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**either**</span></span> player disconnects. Player ids are reused; a leftover override would show one player's name above a different player. This is the single most important requirement in the table. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Ownership**</span></span> | Same model as other 0.1.2 state: only the creating resource may set or clear its overrides; they are removed when that resource stops. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Return value**</span></span> | <span style="color: #79c0ff;" class="mycode_color">`bool`</span>, consistent with the other setters, so a rejection is detectable. Returning <span style="color: #79c0ff;" class="mycode_color">`true`</span> on a no-op repeat is fine. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Validation**</span></span> | Same text rules as <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateText`</span> (48 code points / 96 UTF-8 bytes, control characters and HTML delimiters rejected). |<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">### Cost profile — why this should be cheap</span></span><br />
<br />
Overrides change <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**only when two characters are introduced**</span></span>, not per frame and<br />
not per tick. In practice that is a handful of calls per player per session.<br />
<br />
The natural shape is a sparse map keyed by <span style="color: #79c0ff;" class="mycode_color">`(observerId, targetId)`</span>, replicated<br />
only to the one observer. There is no per-frame work and no broadcast: the<br />
delta goes to a single client.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 4. Alternatives we tested and ruled out</span></span><br />
<br />
We checked these against the 1.2.1 documentation before filing. Listing them so<br />
the same ground is not covered twice.<br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNameplateText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span> — one value for everyone.<br />
<span style="color: #6a9955;" class="mycode_color">&gt;</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*"Changes a player's server-authoritative overhead nameplate text."*</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNameplateVisible`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span> — global, explicitly so.<br />
<span style="color: #6a9955;" class="mycode_color">&gt;</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*"Shows or hides a player's overhead nameplate </span><span style="font-weight: bold;" class="mycode_b">**for all observers**</span><span style="font-style: italic;" class="mycode_i">."*</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNametagText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"> / </span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNametagShowing`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span> — not a separate channel.<br />
<span style="color: #6a9955;" class="mycode_color">&gt;</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*"Compatibility alias for </span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">`setPlayerNameplateText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">."*</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`create3DText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"> with a viewer filter**</span></span> — would not scale even if <span style="color: #79c0ff;" class="mycode_color">`options`</span><br />
supported one (today it accepts only <span style="color: #79c0ff;" class="mycode_color">`drawDistance`</span>, <span style="color: #79c0ff;" class="mycode_color">`scale`</span> and <span style="color: #79c0ff;" class="mycode_color">`r/g/b/a`</span>).<br />
<br />
Overhead labels need one label per <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**(observer, target)**</span></span> pair. Twenty players<br />
standing together is 20 × 19 = 380 labels; the documented limits are **256 per<br />
resource and 2048 server-wide**, and <span style="color: #79c0ff;" class="mycode_color">`serverconf.cfg`</span> allows 500 slots. The<br />
cap is exhausted by a single crowded camp.<br />
<br />
*(A <span style="color: #79c0ff;" class="mycode_color">`visibleTo`</span> filter on <span style="color: #79c0ff;" class="mycode_color">`create3DText`</span> would still be useful for other things<br />
— private quest markers, per-player hints — but it does not solve this.)*<br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Client-side rendering**</span></span> — not possible. The client API exposes only<br />
<span style="color: #79c0ff;" class="mycode_color">`setCameraTarget`</span> and <span style="color: #79c0ff;" class="mycode_color">`resetCamera`</span>; there is no world-to-screen projection and<br />
no world-space drawing, so a client cannot position labels itself.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 5. Acceptance scenarios</span></span><br />
<br />
Concrete cases we would test against.<br />
<br />
<span style="color: #ffa657;" class="mycode_color">1.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Baseline unchanged.**</span></span> A resource that never calls the new functions<br />
   behaves exactly as today.<br />
<span style="color: #ffa657;" class="mycode_color">2.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**One-way override.**</span></span> <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateTextFor(A, B, "Gorn")`</span> → A sees<br />
   <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span> above B; C still sees the global text; B's view of A is unaffected.<br />
<span style="color: #ffa657;" class="mycode_color">3.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Survives distance.**</span></span> A and B walk out of relevance range and back. A still<br />
   sees <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span>.<br />
<span style="color: #ffa657;" class="mycode_color">4.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Survives reconnect of the observer.**</span></span> A reconnects; A still sees <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span><br />
   above B <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*(assuming the resource re-applies it — see 6)*</span></span>.<br />
<span style="color: #ffa657;" class="mycode_color">5.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Id reuse is safe.**</span></span> B disconnects, a different player joins and receives<br />
   B's old player id. A must <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**not**</span></span> see <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span> above the new player.<br />
<span style="color: #ffa657;" class="mycode_color">6.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Reset.**</span></span> <span style="color: #79c0ff;" class="mycode_color">`resetPlayerNameplateTextFor(A, B)`</span> → A falls back to the global<br />
   text, not to an empty plate.<br />
<span style="color: #ffa657;" class="mycode_color">7.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Rejection is visible.**</span></span> Invalid text, unknown player id or a target owned<br />
   by another resource returns <span style="color: #79c0ff;" class="mycode_color">`false`</span>.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 6. What we do if this is not available</span></span><br />
<br />
We hide overhead nameplates for <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**everyone**</span></span> (`setPlayerNameplateVisible(id,<br />
false)` for all players) and carry identity through chat alone.<br />
<br />
This is consistent — nobody ever sees a name that contradicts what they know —<br />
but it removes a piece of information the engine already renders well, and it<br />
means players cannot identify even their own friends at a glance. We would<br />
rather not do that, hence this request.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 7. Summary</span></span><br />
<br />
One capability is missing: **the nameplate state cannot be varied per<br />
observer.**<br />
<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Smallest change that unblocks us: <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateVisibleFor`</span>.<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Better result for players: <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateTextFor`</span> (+ <span style="color: #79c0ff;" class="mycode_color">`reset…`</span>).<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Everything else on our side is built and waiting: the <span style="color: #79c0ff;" class="mycode_color">`acquaintances`</span> table,<br />
  the per-pair lookup, the in-character introduction command and the config<br />
  switch that turns it all on.</span></span>]]></description>
			<content:encoded><![CDATA[<span style="color: #bbbebf;" class="mycode_color"><span style="font-family: Consolas, 'Courier New', monospace;" class="mycode_font"><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"># Feature request: per-observer nameplate state</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Target:**</span></span> G1R:MP scripting API (server-side)<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Requested by:**</span></span> Eldoria RolePlay<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Verified against:**</span></span> documentation dump 1.2.1 / platform update 0.1.2<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Status of workarounds:**</span></span> all known alternatives verified and ruled out (§4)<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 1. What we are trying to build</span></span><br />
<br />
A <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**stranger system**</span></span>: a roleplay server where a character's name is not public<br />
knowledge. You do not know who someone is until they tell you.<br />
<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Two players who have never met see each other as <span style="color: #79c0ff;" class="mycode_color">`Nieznajomy (147)`</span><br />
  ("Stranger #147") — a stable per-character number, not a name.<br />
<span style="color: #ffa657;" class="mycode_color">-</span> After an in-character introduction (<span style="color: #79c0ff;" class="mycode_color">`/przedstaw`</span>), each side learns the<br />
  other's real name <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**permanently**</span></span>, and only for themselves.<br />
<span style="color: #ffa657;" class="mycode_color">-</span> The relation is directional and per-pair: A knowing B says nothing about<br />
  whether C knows B.<br />
<br />
The chat side of this already works — we send chat messages per recipient, so<br />
each observer can be given a different sender label.<br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**The overhead nameplate is the only thing we cannot do**</span></span>, and it defeats the<br />
whole feature: the name floats above the character's head for everyone<br />
regardless of what the observer has learned.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 2. What we are asking for</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">### 2.1 Preferred: per-observer nameplate text</span></span></span></span><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool setPlayerNameplateTextFor(int observerId, int targetId, string text)</code></div></div><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool resetPlayerNameplateTextFor(int observerId, int targetId)</code></div></div><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>string|false getPlayerNameplateTextFor(int observerId, int targetId)</code></div></div><br />
<br />
<span style="color: #bbbebf;" class="mycode_color"><span style="font-family: Consolas, 'Courier New', monospace;" class="mycode_font"><br />
Sets the nameplate text that <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`observerId`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"> sees above </span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`targetId`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span>, overriding<br />
the global value set by <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateText`</span>.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">### 2.2 Minimal acceptable: per-observer nameplate visibility</span></span><br />
<br />
If per-observer text is too invasive, a per-observer <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**visibility**</span></span> toggle is<br />
enough to unblock us:<br />
</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool setPlayerNameplateVisibleFor(int observerId, int targetId, bool visible)</code></div></div><br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>bool resetPlayerNameplateVisibleFor(int observerId, int targetId)</code></div></div><br />
<br />
<span style="color: #bbbebf;" class="mycode_color"><span style="font-family: Consolas, 'Courier New', monospace;" class="mycode_font"><br />
<br />
We would then keep the global nameplate text as the character's <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**real name**</span></span><br />
and hide it from observers who have not been introduced. Strangers see no<br />
nameplate at all; the <span style="color: #79c0ff;" class="mycode_color">`Nieznajomy (147)`</span> label is carried by chat only.<br />
<br />
This is strictly smaller than 2.1 and reuses state the engine already<br />
replicates. <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Either one unblocks the feature — we do not need both.**</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 3. Semantics we need</span></span><br />
<br />
These apply to both variants.<br />
<br />
| Aspect | Required behaviour |<br />
| --- | --- |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Precedence**</span></span> | The per-observer value overrides the global one. With no override present, the observer sees exactly what <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateText`</span> / <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateVisible`</span> set. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Default**</span></span> | No overrides exist. Current behaviour is unchanged for every resource that does not call the new functions. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Direction**</span></span> | Strictly one-way. <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateTextFor(A, B, ...)`</span> must not affect what B sees above A. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Replication**</span></span> | Same guarantees as the existing nameplate state: reliable, server-authoritative, <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**replayed on relevance entry and late join**</span></span>. Without this, an override silently disappears when the pair walks apart and back together. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Lifetime**</span></span> | Cleared automatically when <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**either**</span></span> player disconnects. Player ids are reused; a leftover override would show one player's name above a different player. This is the single most important requirement in the table. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Ownership**</span></span> | Same model as other 0.1.2 state: only the creating resource may set or clear its overrides; they are removed when that resource stops. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Return value**</span></span> | <span style="color: #79c0ff;" class="mycode_color">`bool`</span>, consistent with the other setters, so a rejection is detectable. Returning <span style="color: #79c0ff;" class="mycode_color">`true`</span> on a no-op repeat is fine. |<br />
| <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Validation**</span></span> | Same text rules as <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateText`</span> (48 code points / 96 UTF-8 bytes, control characters and HTML delimiters rejected). |<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">### Cost profile — why this should be cheap</span></span><br />
<br />
Overrides change <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**only when two characters are introduced**</span></span>, not per frame and<br />
not per tick. In practice that is a handful of calls per player per session.<br />
<br />
The natural shape is a sparse map keyed by <span style="color: #79c0ff;" class="mycode_color">`(observerId, targetId)`</span>, replicated<br />
only to the one observer. There is no per-frame work and no broadcast: the<br />
delta goes to a single client.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 4. Alternatives we tested and ruled out</span></span><br />
<br />
We checked these against the 1.2.1 documentation before filing. Listing them so<br />
the same ground is not covered twice.<br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNameplateText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span> — one value for everyone.<br />
<span style="color: #6a9955;" class="mycode_color">&gt;</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*"Changes a player's server-authoritative overhead nameplate text."*</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNameplateVisible`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span> — global, explicitly so.<br />
<span style="color: #6a9955;" class="mycode_color">&gt;</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*"Shows or hides a player's overhead nameplate </span><span style="font-weight: bold;" class="mycode_b">**for all observers**</span><span style="font-style: italic;" class="mycode_i">."*</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNametagText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"> / </span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`setPlayerNametagShowing`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span> — not a separate channel.<br />
<span style="color: #6a9955;" class="mycode_color">&gt;</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*"Compatibility alias for </span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">`setPlayerNameplateText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">."*</span></span><br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**</span></span><span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">`create3DText`</span></span><span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b"> with a viewer filter**</span></span> — would not scale even if <span style="color: #79c0ff;" class="mycode_color">`options`</span><br />
supported one (today it accepts only <span style="color: #79c0ff;" class="mycode_color">`drawDistance`</span>, <span style="color: #79c0ff;" class="mycode_color">`scale`</span> and <span style="color: #79c0ff;" class="mycode_color">`r/g/b/a`</span>).<br />
<br />
Overhead labels need one label per <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**(observer, target)**</span></span> pair. Twenty players<br />
standing together is 20 × 19 = 380 labels; the documented limits are **256 per<br />
resource and 2048 server-wide**, and <span style="color: #79c0ff;" class="mycode_color">`serverconf.cfg`</span> allows 500 slots. The<br />
cap is exhausted by a single crowded camp.<br />
<br />
*(A <span style="color: #79c0ff;" class="mycode_color">`visibleTo`</span> filter on <span style="color: #79c0ff;" class="mycode_color">`create3DText`</span> would still be useful for other things<br />
— private quest markers, per-player hints — but it does not solve this.)*<br />
<br />
<span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Client-side rendering**</span></span> — not possible. The client API exposes only<br />
<span style="color: #79c0ff;" class="mycode_color">`setCameraTarget`</span> and <span style="color: #79c0ff;" class="mycode_color">`resetCamera`</span>; there is no world-to-screen projection and<br />
no world-space drawing, so a client cannot position labels itself.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 5. Acceptance scenarios</span></span><br />
<br />
Concrete cases we would test against.<br />
<br />
<span style="color: #ffa657;" class="mycode_color">1.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Baseline unchanged.**</span></span> A resource that never calls the new functions<br />
   behaves exactly as today.<br />
<span style="color: #ffa657;" class="mycode_color">2.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**One-way override.**</span></span> <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateTextFor(A, B, "Gorn")`</span> → A sees<br />
   <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span> above B; C still sees the global text; B's view of A is unaffected.<br />
<span style="color: #ffa657;" class="mycode_color">3.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Survives distance.**</span></span> A and B walk out of relevance range and back. A still<br />
   sees <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span>.<br />
<span style="color: #ffa657;" class="mycode_color">4.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Survives reconnect of the observer.**</span></span> A reconnects; A still sees <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span><br />
   above B <span style="color: #c9d1d9;" class="mycode_color"><span style="font-style: italic;" class="mycode_i">*(assuming the resource re-applies it — see 6)*</span></span>.<br />
<span style="color: #ffa657;" class="mycode_color">5.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Id reuse is safe.**</span></span> B disconnects, a different player joins and receives<br />
   B's old player id. A must <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**not**</span></span> see <span style="color: #79c0ff;" class="mycode_color">`Gorn`</span> above the new player.<br />
<span style="color: #ffa657;" class="mycode_color">6.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Reset.**</span></span> <span style="color: #79c0ff;" class="mycode_color">`resetPlayerNameplateTextFor(A, B)`</span> → A falls back to the global<br />
   text, not to an empty plate.<br />
<span style="color: #ffa657;" class="mycode_color">7.</span> <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**Rejection is visible.**</span></span> Invalid text, unknown player id or a target owned<br />
   by another resource returns <span style="color: #79c0ff;" class="mycode_color">`false`</span>.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 6. What we do if this is not available</span></span><br />
<br />
We hide overhead nameplates for <span style="color: #c9d1d9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">**everyone**</span></span> (`setPlayerNameplateVisible(id,<br />
false)` for all players) and carry identity through chat alone.<br />
<br />
This is consistent — nobody ever sees a name that contradicts what they know —<br />
but it removes a piece of information the engine already renders well, and it<br />
means players cannot identify even their own friends at a glance. We would<br />
rather not do that, hence this request.<br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">---</span></span><br />
<br />
<span style="color: #79c0ff;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">## 7. Summary</span></span><br />
<br />
One capability is missing: **the nameplate state cannot be varied per<br />
observer.**<br />
<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Smallest change that unblocks us: <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateVisibleFor`</span>.<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Better result for players: <span style="color: #79c0ff;" class="mycode_color">`setPlayerNameplateTextFor`</span> (+ <span style="color: #79c0ff;" class="mycode_color">`reset…`</span>).<br />
<span style="color: #ffa657;" class="mycode_color">-</span> Everything else on our side is built and waiting: the <span style="color: #79c0ff;" class="mycode_color">`acquaintances`</span> table,<br />
  the per-pair lookup, the in-character introduction command and the config<br />
  switch that turns it all on.</span></span>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Soundfiles]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=43</link>
			<pubDate>Fri, 04 Sep 2026 13:27:45 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=12">Chenentano</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=43</guid>
			<description><![CDATA[Hey <img src="https://g1r-mp.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> ,<br />
<br />
it would be great, if you can implement soundfiles.<br />
<br />
onPlayerConnect() -&gt; useSoundFile()<br />
<br />
Greetings]]></description>
			<content:encoded><![CDATA[Hey <img src="https://g1r-mp.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> ,<br />
<br />
it would be great, if you can implement soundfiles.<br />
<br />
onPlayerConnect() -&gt; useSoundFile()<br />
<br />
Greetings]]></content:encoded>
		</item>
	</channel>
</rss>