From 14d9ecb8a3aa76c40d2f428476915f3fadb6d4f1 Mon Sep 17 00:00:00 2001 From: AlexALX Date: Thu, 30 Jul 2026 15:00:06 +0300 Subject: [PATCH 1/2] Add wire_digitalscreen_rate convar This convar multiply all digital screen limits in sync, so wire_digitalscreen_rate 10 make it work exactly 10x faster. --- lua/entities/gmod_wire_digitalscreen/cl_init.lua | 6 +++--- lua/entities/gmod_wire_digitalscreen/init.lua | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lua/entities/gmod_wire_digitalscreen/cl_init.lua b/lua/entities/gmod_wire_digitalscreen/cl_init.lua index ae6aedef67..0e6ae1fbc8 100644 --- a/lua/entities/gmod_wire_digitalscreen/cl_init.lua +++ b/lua/entities/gmod_wire_digitalscreen/cl_init.lua @@ -1,6 +1,6 @@ include("shared.lua") - +local dsRate = GetConVar("wire_digitalscreen_rate") function ENT:SendData() net.Start("wire_interactiveprop_action") @@ -143,7 +143,7 @@ end function ENT:Think() if self.buffer[1] ~= nil then - local maxtime = SysTime() + RealFrameTime() * 0.05 -- do more depending on client FPS. Higher fps = more work + local maxtime = SysTime() + RealFrameTime() * (0.05*dsRate:GetFloat()) -- do more depending on client FPS. Higher fps = more work while SysTime() < maxtime and self.buffer[1] do if not self.co or coroutine.status(self.co) == "dead" then @@ -320,7 +320,7 @@ function ENT:Draw(flags) if self.NeedRefresh then self.NeedRefresh = false - local maxtime = SysTime() + RealFrameTime() * 0.01 + local maxtime = SysTime() + RealFrameTime() * (0.01*dsRate:GetFloat()) self.GPU:RenderToGPU(function() local idx = 0 diff --git a/lua/entities/gmod_wire_digitalscreen/init.lua b/lua/entities/gmod_wire_digitalscreen/init.lua index 3be26fc1ee..17d8b452dd 100644 --- a/lua/entities/gmod_wire_digitalscreen/init.lua +++ b/lua/entities/gmod_wire_digitalscreen/init.lua @@ -5,6 +5,7 @@ DEFINE_BASECLASS( "base_wire_entity" ) ENT.WireDebugName = "DigitalScreen" +local dsRate = CreateConVar("wire_digitalscreen_rate", 1, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) function ENT:InitInteractive() local model = self:GetModel() @@ -170,9 +171,20 @@ end ---------------------------------------------------- -- Processing limiters and global bandwidth limiters local maxProcessingTime = engine.TickInterval() * 0.9 -local defaultMaxBandwidth = 10000 -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. -local defaultMaxGlobalBandwidth = 20000 -- 20k is a good global limit in my testing. higher than that seems to cause issues + +local dsRateValue = dsRate:GetFloat() +local defaultMaxBandwidth = 100000 * dsRateValue -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. +local defaultMaxGlobalBandwidth = 200000 * dsRateValue -- 20k is a good global limit in my testing. higher than that seems to cause issues local maxBandwidth = defaultMaxBandwidth + +local function updateBW() + local dsRateValue = dsRate:GetFloat() + + defaultMaxBandwidth = 100000 * dsRateValue + defaultMaxGlobalBandwidth = 200000 * dsRateValue +end +cvars.AddChangeCallback("wire_digitalscreen_rate", updateBW) + local globalBandwidthLookup = {} local function calcGlobalBW() maxBandwidth = defaultMaxGlobalBandwidth From eb95d91faf81a0512ec07330770e9b2c15f5bfac Mon Sep 17 00:00:00 2001 From: AlexALX Date: Thu, 30 Jul 2026 15:14:07 +0300 Subject: [PATCH 2/2] add a way to read digital screen rate --- lua/entities/gmod_wire_digitalscreen/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/entities/gmod_wire_digitalscreen/init.lua b/lua/entities/gmod_wire_digitalscreen/init.lua index 17d8b452dd..3a6c6d0655 100644 --- a/lua/entities/gmod_wire_digitalscreen/init.lua +++ b/lua/entities/gmod_wire_digitalscreen/init.lua @@ -6,6 +6,7 @@ DEFINE_BASECLASS( "base_wire_entity" ) ENT.WireDebugName = "DigitalScreen" local dsRate = CreateConVar("wire_digitalscreen_rate", 1, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) +local dsRateValue = dsRate:GetFloat() function ENT:InitInteractive() local model = self:GetModel() @@ -129,6 +130,7 @@ function ENT:ReadCell(Address) Address = math.floor(Address) if Address < 0 then return nil end if Address >= 1048577 then return nil end + if (Address==1048576) then return dsRateValue end -- report its rate return self.Memory[Address] or 0 end @@ -172,13 +174,12 @@ end -- Processing limiters and global bandwidth limiters local maxProcessingTime = engine.TickInterval() * 0.9 -local dsRateValue = dsRate:GetFloat() local defaultMaxBandwidth = 100000 * dsRateValue -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. local defaultMaxGlobalBandwidth = 200000 * dsRateValue -- 20k is a good global limit in my testing. higher than that seems to cause issues local maxBandwidth = defaultMaxBandwidth local function updateBW() - local dsRateValue = dsRate:GetFloat() + dsRateValue = dsRate:GetFloat() defaultMaxBandwidth = 100000 * dsRateValue defaultMaxGlobalBandwidth = 200000 * dsRateValue