Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local enabled = CreateClientConVar("fpsoptimizer_enable", "1", true)
- local distance = CreateClientConVar("fpsoptimizer_distance", "1000", true)
- local max_distance = 100
- local emptyfunc = function() end
- local function StoreHooks(entity)
- entity.__FPSOptimizerOldThink = entity.Think
- --entity.__FPSOptimizerOldDraw = entity.Draw
- --entity.__FPSOptimizerOldDrawTranslucent = entity.DrawTranslucent
- end
- local function EnableHooks(entity)
- if not entity.__fpsoptimizer_enabled then return end
- entity.__fpsoptimizer_enabled = false
- entity.Think = entity.__FPSOptimizerOldThink
- --entity.Draw = entity.__FPSOptimizerOldDraw
- --entity.DrawTranslucent = entity.__FPSOptimizerOldDrawTranslucent
- entity.__oldnodraw = entity.__nodraw
- entity:SetNoDraw(false)
- end
- local function DisableHooks(entity)
- if entity.__fpsoptimizer_enabled then return end
- entity.__fpsoptimizer_enabled = true
- StoreHooks(entity)
- entity.Think = emptyfunc
- --entity.Draw = emptyfunc
- --entity.DrawTranslucent = emptyfunc
- entity:SetNoDraw(entity.__oldnodraw or true)
- end
- _R.Entity.OldDrawModel = _R.Entity.OldDrawModel or _R.Entity.DrawModel
- function _R.Entity:DrawModel()
- if not self.__fpsoptimizer_enabled then
- self:OldDrawModel(self)
- end
- end
- _R.Entity.OldSetNoDraw = _R.Entity.OldSetNoDraw or _R.Entity.SetNoDraw
- function _R.Entity:SetNoDraw(bool)
- self.__nodraw = bool
- self:OldSetNoDraw(bool)
- end
- --[[ cam.OldStart3D2D = cam.OldStart3D2D or cam.Start3D2D
- cam.OldEnd3D2D = cam.OldEnd3D2D or cam.End3D2D
- function cam.Start3D2D(point, ...)
- if point:Distance(EyePos()) > distance:GetInt() then
- DONT_START3D2D = true
- return end
- cam.Start3D2D(point, ...)
- end
- function cam.End3D2D()
- if DONT_START3D2D then DONT_START3D2D = false return end
- cam.End3D2D()
- end ]]
- hook.Add("OnEntityCreated", "FPSOptimizer_OnEntityCreated", function(entity)
- StoreHooks(entity)
- end)
- -- I could just use the global EyePos(), which is supposed to do this (I think)
- -- but it doesn't seem reliable and it jumps to random positions etc
- -- And LocalPlayer():EyePos() is where the player's head is
- -- So I'll just use this
- local eyepos = vector_origin
- hook.Add("CalcView", "FPSOptimizer_CalcView", function(_,point)
- eyepos = point
- end)
- local disabled = false
- local function Think()
- if disabled and not enabled:GetBool() then return end
- disabled = false
- for key, entity in pairs(ents.GetAll()) do
- if not entity:IsPlayer() then
- local distant = entity:GetPos():Distance(eyepos)
- if distant > distance:GetInt() then
- DisableHooks(entity)
- elseif distant < distance:GetInt() then
- EnableHooks(entity)
- end
- end
- end
- if not enabled:GetBool() then
- for key, entity in pairs(ents.GetAll()) do
- if not entity:IsPlayer() then
- EnableHooks(entity)
- end
- end
- disabled = true
- end
- end
- timer.Create("FPSOptimizer", 0.3, 0, Think)
Advertisement
Add Comment
Please, Sign In to add comment