<?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>Sat, 19 Sep 2026 07:34:52 +0000</pubDate>
		<generator>MyBB</generator>
		<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">RhyZe</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">RhyZe</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">RhyZe</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[mouse handler and equip weapon fix]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=58</link>
			<pubDate>Thu, 17 Sep 2026 10:31:45 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=62">asvra</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=58</guid>
			<description><![CDATA[- add handling mouse movements<br />
- setplayerweapon function adding properly only melee weapons but not ranged]]></description>
			<content:encoded><![CDATA[- add handling mouse movements<br />
- setplayerweapon function adding properly only melee weapons but not ranged]]></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>
		<item>
			<title><![CDATA[Feedback & Suggestions After the Release]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=32</link>
			<pubDate>Sun, 30 Aug 2026 14:50:25 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=49">Gummik</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=32</guid>
			<description><![CDATA[So, I’ve been testing it since the release, and honestly, it’s a really impressive piece of work. You can definitely see that it’s still in its early stages, but I have to give a <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">big shout-out to everyone working on it</span></span>. It’s already looking very promising.<br />
<br />
With that said, here are a few ideas / things I would personally find useful — and I don’t think I’m the only one. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">My suggestions / needs:</span></span><br />
<span style="font-weight: bold;" class="mycode_b"><br />
- Ability to place objects in the world</span><br />
  For example, placing a sword or another item on the ground, on a table, etc.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">- Some way to track `equip` / `unequip` interactions</span><br />
  Something similar to `onPlayerJoin` or other events would be extremely useful. This could allow us to prevent certain items from automatically being equipped from the inventory when a player joins the game — although I assume something like this may already be<span style="text-decoration: underline;" class="mycode_u"><span style="font-style: italic;" class="mycode_i"> in work</span></span>.<br />
  Alternatively, it could be useful to have some kind of client/server native or event that sends something like:<br />
 `interaction("equip")`<br />
  This would allow developers to listen for and log these interactions themselves.<br />
  It’s also possible that something like this already exists and I simply missed it on the wiki. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">- NPC clothing / skins</span><br />
  I’m having some trouble properly applying clothing or skins to NPCs. It’s entirely possible that I’m doing something wrong. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
  However, since weapons are working perfectly fine for me, I’m not entirely sure if that’s the case.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">- Spawn IDs on the wiki</span><br />
  I think it would be really useful to have a list of spawn IDs on the wiki — for things like armor, weapons, and other usable objects. Having these documented in one place would make development much easier.<br />
<br />
<br />
I think these features would provide a really solid foundation for building more advanced systems on top of this.<br />
Of course, I completely understand that this is the **first release and still an alpha**, so I’m not expecting everything to be available right away.<br />
I mainly wanted to share some feedback and ideas based on what I’ve tried so far.<br />
<br />
And once again, <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">huge respect to everyone working on thi</span></span><span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">s</span></span>. It’s already a great piece of work, and I’m looking forward to seeing where it goes. &lt;3]]></description>
			<content:encoded><![CDATA[So, I’ve been testing it since the release, and honestly, it’s a really impressive piece of work. You can definitely see that it’s still in its early stages, but I have to give a <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">big shout-out to everyone working on it</span></span>. It’s already looking very promising.<br />
<br />
With that said, here are a few ideas / things I would personally find useful — and I don’t think I’m the only one. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">My suggestions / needs:</span></span><br />
<span style="font-weight: bold;" class="mycode_b"><br />
- Ability to place objects in the world</span><br />
  For example, placing a sword or another item on the ground, on a table, etc.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">- Some way to track `equip` / `unequip` interactions</span><br />
  Something similar to `onPlayerJoin` or other events would be extremely useful. This could allow us to prevent certain items from automatically being equipped from the inventory when a player joins the game — although I assume something like this may already be<span style="text-decoration: underline;" class="mycode_u"><span style="font-style: italic;" class="mycode_i"> in work</span></span>.<br />
  Alternatively, it could be useful to have some kind of client/server native or event that sends something like:<br />
 `interaction("equip")`<br />
  This would allow developers to listen for and log these interactions themselves.<br />
  It’s also possible that something like this already exists and I simply missed it on the wiki. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">- NPC clothing / skins</span><br />
  I’m having some trouble properly applying clothing or skins to NPCs. It’s entirely possible that I’m doing something wrong. <img src="https://g1r-mp.com/forum/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
  However, since weapons are working perfectly fine for me, I’m not entirely sure if that’s the case.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">- Spawn IDs on the wiki</span><br />
  I think it would be really useful to have a list of spawn IDs on the wiki — for things like armor, weapons, and other usable objects. Having these documented in one place would make development much easier.<br />
<br />
<br />
I think these features would provide a really solid foundation for building more advanced systems on top of this.<br />
Of course, I completely understand that this is the **first release and still an alpha**, so I’m not expecting everything to be available right away.<br />
I mainly wanted to share some feedback and ideas based on what I’ve tried so far.<br />
<br />
And once again, <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">huge respect to everyone working on thi</span></span><span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">s</span></span>. It’s already a great piece of work, and I’m looking forward to seeing where it goes. &lt;3]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Monster combat]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=28</link>
			<pubDate>Sun, 30 Aug 2026 10:02:13 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://g1r-mp.com/forum/member.php?action=profile&uid=40">Tormund</a>]]></dc:creator>
			<guid isPermaLink="false">https://g1r-mp.com/forum/showthread.php?tid=28</guid>
			<description><![CDATA[Feature suggestions for monsters:<br />
<br />
1. commandMonsterAttack(monsterId) - a command that makes the monster perform an attack, so the server can tell it to strike when it is in range of its target.<br />
<br />
2. Stopping distance at the target. The monster should stop at the attack range of its species instead of running into the player and passing through them.<br />
<br />
3. walkMonsterTo(monsterId, x, y, z) - moving a monster to a point. NPCs have routes, monsters can only chase or be teleported. This would make it possible to recreate the pack circling behaviour from the single player.<br />
<br />
4. Raising a monster's maximum health. Right now setMonsterHealth silently clamps the value to the template maximum and still returns true. This is needed for elite monsters and bosses.<br />
<br />
5. Collision between monsters, so groups stop walking into each other and "levitating".]]></description>
			<content:encoded><![CDATA[Feature suggestions for monsters:<br />
<br />
1. commandMonsterAttack(monsterId) - a command that makes the monster perform an attack, so the server can tell it to strike when it is in range of its target.<br />
<br />
2. Stopping distance at the target. The monster should stop at the attack range of its species instead of running into the player and passing through them.<br />
<br />
3. walkMonsterTo(monsterId, x, y, z) - moving a monster to a point. NPCs have routes, monsters can only chase or be teleported. This would make it possible to recreate the pack circling behaviour from the single player.<br />
<br />
4. Raising a monster's maximum health. Right now setMonsterHealth silently clamps the value to the template maximum and still returns true. This is needed for elite monsters and bosses.<br />
<br />
5. Collision between monsters, so groups stop walking into each other and "levitating".]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[PlayerDimension]]></title>
			<link>https://g1r-mp.com/forum/showthread.php?tid=21</link>
			<pubDate>Wed, 26 Aug 2026 09:29:28 +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=21</guid>
			<description><![CDATA[Hey,<br />
<br />
it would be great to create new dimension for players.<br />
<br />
Good examples:<br />
Register -&gt; Char creation -&gt; createNewDimension -&gt; deleteAfterCreation (anti-overlap)<br />
Instanced Arena PvP<br />
Dungeons/Raids<br />
<br />
If its possible already and ive overlooked it, flame me pls.<br />
<br />
Greetings<br />
<br />
Chen]]></description>
			<content:encoded><![CDATA[Hey,<br />
<br />
it would be great to create new dimension for players.<br />
<br />
Good examples:<br />
Register -&gt; Char creation -&gt; createNewDimension -&gt; deleteAfterCreation (anti-overlap)<br />
Instanced Arena PvP<br />
Dungeons/Raids<br />
<br />
If its possible already and ive overlooked it, flame me pls.<br />
<br />
Greetings<br />
<br />
Chen]]></content:encoded>
		</item>
	</channel>
</rss>