diff --git a/lua/entities/gmod_wire_expression2/core/custom/pac.lua b/lua/entities/gmod_wire_expression2/core/custom/pac.lua index 2aae52ca..b9890f78 100644 --- a/lua/entities/gmod_wire_expression2/core/custom/pac.lua +++ b/lua/entities/gmod_wire_expression2/core/custom/pac.lua @@ -1,7 +1,27 @@ E2Lib.RegisterExtension("pac", true) util.AddNetworkString("pac_e2_setkeyvalue_str") +util.AddNetworkString("pac_e2_setkeyvalue_num") +util.AddNetworkString("pac_e2_setkeyvalue_vec") +util.AddNetworkString("pac_e2_setkeyvalue_ang") + +local enabledConvar = CreateConVar("pac_e2_ratelimit_enable", "1", {FCVAR_ARCHIVE}, "If the e2 ratelimit should be enabled.", 0, 1) +local rate = CreateConVar("pac_e2_ratelimit_refill", "0.025", {FCVAR_ARCHIVE}, "The speed at which the ratelimit buffer refills.", 0, 1000) +local buffer = CreateConVar("pac_e2_ratelimit_buffer", "300", {FCVAR_ARCHIVE}, "How large the ratelimit buffer should be.", 0, 1000) + +local function canRunFunction(self) + if not enabledConvar:GetBool() then return true end + + local allowed = pac.RatelimitPlayer(self.player, "e2_extension", buffer:GetInt(), rate:GetInt()) + if not allowed then + E2Lib.raiseException("pac3 e2 ratelimit exceeded") + return false + end + return true +end + e2function void pacSetKeyValue(entity owner, string global_id, string key, string value) + if not canRunFunction(self) then return end net.Start("pac_e2_setkeyvalue_str") net.WriteEntity(self.player) net.WriteEntity(owner) @@ -12,8 +32,8 @@ e2function void pacSetKeyValue(entity owner, string global_id, string key, strin net.Broadcast() end -util.AddNetworkString("pac_e2_setkeyvalue_num") e2function void pacSetKeyValue(entity owner, string global_id, string key, number value) + if not canRunFunction(self) then return end net.Start("pac_e2_setkeyvalue_num") net.WriteEntity(self.player) net.WriteEntity(owner) @@ -24,8 +44,8 @@ e2function void pacSetKeyValue(entity owner, string global_id, string key, numbe net.Broadcast() end -util.AddNetworkString("pac_e2_setkeyvalue_vec") e2function void pacSetKeyValue(entity owner, string global_id, string key, vector value) + if not canRunFunction(self) then return end net.Start("pac_e2_setkeyvalue_vec") net.WriteEntity(self.player) net.WriteEntity(owner) @@ -36,8 +56,8 @@ e2function void pacSetKeyValue(entity owner, string global_id, string key, vecto net.Broadcast() end -util.AddNetworkString("pac_e2_setkeyvalue_ang") e2function void pacSetKeyValue(entity owner, string global_id, string key, angle value) + if not canRunFunction(self) then return end net.Start("pac_e2_setkeyvalue_ang") net.WriteEntity(self.player) net.WriteEntity(owner) @@ -46,4 +66,4 @@ e2function void pacSetKeyValue(entity owner, string global_id, string key, angle net.WriteAngle(Angle(value[1], value[2], value[3])) net.Broadcast() -end \ No newline at end of file +end diff --git a/lua/pac3/core/server/util.lua b/lua/pac3/core/server/util.lua index c990e48b..f4ecb718 100644 --- a/lua/pac3/core/server/util.lua +++ b/lua/pac3/core/server/util.lua @@ -1,3 +1,6 @@ +local CurTime = CurTime +local math_Clamp = math.Clamp + function pac.dprint(fmt, ...) if pac.debug then MsgN("\n") @@ -42,3 +45,33 @@ function pac.RemoveHook(str, id) hook.Remove(str, id) end + +function pac.RatelimitPlayer( ply, name, buffer, refill ) + local ratelimitName = "pac_ratelimit_" .. name + local checkName = "pac_ratelimit_check_" .. name + + if not ply[ratelimitName] then ply[ratelimitName] = buffer end + + local curTime = CurTime() + if not ply[checkName] then ply[checkName] = curTime end + + local dripSize = curTime - ply[checkName] + ply[checkName] = curTime + + local drip = dripSize / refill + local newVal = ply[ratelimitName] + drip + + ply[ratelimitName] = math_Clamp(newVal, 0, buffer) + + if ply[ratelimitName] >= 1 then + ply[ratelimitName] = ply[ratelimitName] - 1 + return true + else + return false + end +end + +function pac.GetRateLimitPlayerBuffer( ply, name ) + local ratelimitName = "pac_ratelimit_" .. name + return ply[ratelimitName] or 0 +end diff --git a/lua/pac3/extra/client/wire_expression_extension.lua b/lua/pac3/extra/client/wire_expression_extension.lua index 49666ded..cd01765d 100644 --- a/lua/pac3/extra/client/wire_expression_extension.lua +++ b/lua/pac3/extra/client/wire_expression_extension.lua @@ -1,3 +1,5 @@ +local IsValid = IsValid + hook.Add("pac_Initialized", "pac_e2_extension", function() if E2Helper then E2Helper.Descriptions["pacSetKeyValue"] = "Sets a property value on given part. Part unique id is recommended but you can also input name." @@ -8,6 +10,7 @@ local function SetKeyValue(ply, ent, unique_id, key, val) local set = "Set" .. key local part = pac.GetPartFromUniqueID(pac.Hash(ply), unique_id) + if not IsValid( part ) then return end if part:GetRootPart():GetOwner() == ent then if key == "EventHide" then