101 lines
4.1 KiB
Lua
101 lines
4.1 KiB
Lua
DarkRP.RegisteredDarkRPVarsMaxId = DarkRP.RegisteredDarkRPVarsMaxId or 0
|
|
DarkRP.RegisteredDarkRPVars = DarkRP.RegisteredDarkRPVars or {}
|
|
DarkRP.RegisteredDarkRPVarsById = DarkRP.RegisteredDarkRPVarsById or {}
|
|
|
|
-- the amount of bits assigned to the value that determines which DarkRPVar we're sending/receiving
|
|
local DARKRP_ID_BITS = 8
|
|
local UNKNOWN_DARKRPVAR = 255 -- Should be equal to 2^DARKRP_ID_BITS - 1
|
|
DarkRP.DARKRP_ID_BITS = DARKRP_ID_BITS
|
|
|
|
function DarkRP.registerDarkRPVar(name, writeFn, readFn)
|
|
-- After a reload, only update the write and read function
|
|
if DarkRP.RegisteredDarkRPVars[name] then
|
|
DarkRP.RegisteredDarkRPVars[name].writeFn = writeFn
|
|
DarkRP.RegisteredDarkRPVars[name].readFn = readFn
|
|
return
|
|
end
|
|
|
|
DarkRP.RegisteredDarkRPVarsMaxId = DarkRP.RegisteredDarkRPVarsMaxId + 1
|
|
|
|
-- UNKNOWN_DARKRPVAR is reserved for unknown values
|
|
if DarkRP.RegisteredDarkRPVarsMaxId >= UNKNOWN_DARKRPVAR then DarkRP.error(string.format("Too many DarkRPVar registrations! DarkRPVar '%s' triggered this error", name), 2) end
|
|
|
|
DarkRP.RegisteredDarkRPVars[name] = {id = DarkRP.RegisteredDarkRPVarsMaxId, name = name, writeFn = writeFn, readFn = readFn}
|
|
DarkRP.RegisteredDarkRPVarsById[DarkRP.RegisteredDarkRPVarsMaxId] = DarkRP.RegisteredDarkRPVars[name]
|
|
end
|
|
|
|
-- Unknown values have unknown types and unknown identifiers, so this is sent inefficiently
|
|
local function writeUnknown(name, value)
|
|
net.WriteUInt(UNKNOWN_DARKRPVAR, DARKRP_ID_BITS)
|
|
net.WriteString(name)
|
|
net.WriteType(value)
|
|
end
|
|
|
|
-- Read the value of a DarkRPVar that was not registered
|
|
local function readUnknown()
|
|
return net.ReadString(), net.ReadType(net.ReadUInt(8))
|
|
end
|
|
|
|
function DarkRP.writeNetDarkRPVar(name, value)
|
|
local DarkRPVar = DarkRP.RegisteredDarkRPVars[name]
|
|
if not DarkRPVar then return writeUnknown(name, value) end
|
|
|
|
net.WriteUInt(DarkRPVar.id, DARKRP_ID_BITS)
|
|
return DarkRPVar.writeFn(value)
|
|
end
|
|
|
|
function DarkRP.writeNetDarkRPVarRemoval(name)
|
|
local DarkRPVar = DarkRP.RegisteredDarkRPVars[name]
|
|
if not DarkRPVar then
|
|
net.WriteUInt(UNKNOWN_DARKRPVAR, DARKRP_ID_BITS)
|
|
net.WriteString(name)
|
|
return
|
|
end
|
|
|
|
net.WriteUInt(DarkRPVar.id, DARKRP_ID_BITS)
|
|
end
|
|
|
|
function DarkRP.readNetDarkRPVar()
|
|
local DarkRPVarId = net.ReadUInt(DARKRP_ID_BITS)
|
|
local DarkRPVar = DarkRP.RegisteredDarkRPVarsById[DarkRPVarId]
|
|
|
|
if DarkRPVarId == UNKNOWN_DARKRPVAR then
|
|
local name, value = readUnknown()
|
|
|
|
return name, value
|
|
end
|
|
|
|
local val = DarkRPVar.readFn(value)
|
|
|
|
return DarkRPVar.name, val
|
|
end
|
|
|
|
function DarkRP.readNetDarkRPVarRemoval()
|
|
local id = net.ReadUInt(DARKRP_ID_BITS)
|
|
return id == UNKNOWN_DARKRPVAR and net.ReadString() or DarkRP.RegisteredDarkRPVarsById[id].name
|
|
end
|
|
|
|
-- The money is a double because it accepts higher values than Int and UInt, which are undefined for >32 bits
|
|
DarkRP.registerDarkRPVar("money", net.WriteDouble, net.ReadDouble)
|
|
DarkRP.registerDarkRPVar("salary", fp{fn.Flip(net.WriteInt), 32}, fp{net.ReadInt, 32})
|
|
DarkRP.registerDarkRPVar("rpname", net.WriteString, net.ReadString)
|
|
DarkRP.registerDarkRPVar("job", net.WriteString, net.ReadString)
|
|
DarkRP.registerDarkRPVar("HasGunlicense", net.WriteBit, fc{tobool, net.ReadBit})
|
|
DarkRP.registerDarkRPVar("Arrested", net.WriteBit, fc{tobool, net.ReadBit})
|
|
DarkRP.registerDarkRPVar("wanted", net.WriteBit, fc{tobool, net.ReadBit})
|
|
DarkRP.registerDarkRPVar("wantedReason", net.WriteString, net.ReadString)
|
|
DarkRP.registerDarkRPVar("agenda", net.WriteString, net.ReadString)
|
|
|
|
--[[---------------------------------------------------------------------------
|
|
RP name override
|
|
---------------------------------------------------------------------------]]
|
|
local pmeta = FindMetaTable("Player")
|
|
pmeta.SteamName = pmeta.SteamName or pmeta.Name
|
|
function pmeta:Name()
|
|
if not self:IsValid() then DarkRP.error("Attempt to call Name/Nick/GetName on a non-existing player!", SERVER and 1 or 2) end
|
|
return GAMEMODE.Config.allowrpnames and self:getDarkRPVar("rpname")
|
|
or self:SteamName()
|
|
end
|
|
pmeta.GetName = pmeta.Name
|
|
pmeta.Nick = pmeta.Name
|