Revision Difference
Entity:SetNW2String#564550
<function name="SetNW2String" parent="Entity" type="classfunc">
<description>
Sets a networked string value on the entity.
The value can then be accessed with <page>Entity:GetNW2String</page> both from client and server.
<bug issue="5455">You should not use the NW2 System on entities that are based on a Lua Entity or else NW2Vars could get mixed up, updated multiple times or not be set.</bug>
<warning>The value will only be updated clientside if the entity is or enters the clients PVS. use <page>Entity:SetNWString</page> instead</warning>
<note>Running this function clientside will only set it for the client it is called on.
The value will only be networked if it isn't the same as the current value and unlike SetNW*
the value will only be networked once and not every 10 seconds.</note>
</description>
<realm>Shared</realm>
<args>
<arg name="key" type="string">The key to associate the value with</arg>⤶
<arg name="key" type="string">The key to associate the value with, up to 1023 characters</arg>⤶
<arg name="value" type="string">The value to set, up to 511 characters.</arg>
</args>
</function>
<example>
<description>
If you need more than 511 characters, you can use something like this.
This uses the NW2 Name limit which is 1023 charcters that we can use for networking.⤶
<warning>⤶
This works by setting the given value as the NW2 Name but this will quickly fill the NW2 Stringtable(networkvars). ⤶
If the Stringtable gets filled, you won't be able so set new NW2Vars. ⤶
So you should only use this way of networking, if you want to network something like a table once.⤶
</warning>⤶
Adds a tag after player's hud target (When you aim at someone)
</description>
<code>
local identifier = string.char(13, 13)
⤶
local meta = FindMetaTable( "Entity" )⤶
function meta:SetNW2BigString( name, value )⤶
self:SetNW2String( value, identifier .. name )
end⤶
⤶
NW2String_Cache = NW2String_Cache or {}⤶
function meta:GetNW2BigString( name, fallback )⤶
fallback = fallback or ""⤶
local ent_cache = NW2String_Cache[self]⤶
if !ent_cache then return fallback end⤶
⤶
local var = ent_cache[name]⤶
if !var then return fallback end⤶
return var.value or fallback⤶
end⤶
⤶
-- new will be our Name and name will be our value to store.⤶
hook.Add( "EntityNetworkedVarChanged","BiggerNW2String_Example", function( ent, name, old, new )
if !string.StartWith( new, identifier ) then return end -- we check, if the string starts with the identifier⤶
local ent_cache = NW2String_Cache[ent] -- gets the cache of the given Entity.⤶
if !ent_cache then⤶
ent_cache = {}
end⤶
⤶
new = string.sub( new, 3 ) -- removes the identifier from the string⤶
local var = ent_cache[new] -- gets the Var Table⤶
if !var then⤶
var = {}⤶
end⤶
⤶
var["type"] = "BigString" -- were using the same structure there as the NW2 System. type = [type] and value = [value]⤶
var["value"] = name⤶
⤶
ent_cache[new] = var⤶
NW2String_Cache[ent] = ent_cache -- sets the cache of the ⤶
end )⤶
⤶
⤶
-- tesing it.⤶
if SERVER then⤶
local str = ""⤶
for k=1, 1023 do -- creates a string with the maximum length⤶
str = str .. "a"⤶
end⤶
⤶
Entity(1):SetNW2BigString( "Test", str ) ⤶
end⤶
⤶
timer.Simple( 1, function() -- we use a delay because networking takes a bit of time for the client.⤶
print( string.len( Entity(1):GetNW2BigString( "Test", "" ) ) ) -- prints the length of the NW2 String⤶
end )⤶
hook.Add("PlayerSay", "WriteTag", function(ply, text)
if not text:StartsWith("!tag ") then return end⤶
⤶
--Gets the text after "!tag "⤶
local tag = text:sub(6)
if tag == "" then⤶
return "Tag cannot be empty!"⤶
elseif #tag > 511 then --Text cannot be longer than 511 characters⤶
return "Tag is too long! (Max 511 characters)"⤶
end⤶
⤶
ply:SetNW2String("PlayerTag", tag)⤶
return ply:Nick() .. " changed his tag to: " .. tag --Notifies players of such change⤶
end)⤶
⤶
hook.Add("HUDDrawTargetID", "DrawTag", function()
local target = LocalPlayer():GetEyeTrace().Entity⤶
if not IsValid(target) or not target:IsPlayer() then return end --If we are not looking at a player, do nothing⤶
⤶
local tag = target:GetNW2String("PlayerTag", "")
if tag == "" then return end --If the player has no tag, do nothing⤶
⤶
--Displays tag after player name + health⤶
draw.SimpleText(tag, "TargetIDSmall", ScrW() / 2, ScrH() / 2 + 48, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)⤶
end)
</code>
<output>⤶
Server and Client Output:⤶
```lua⤶
1023⤶
```⤶
</output>⤶
</example>