Files
wnsrc/gamemodes/helix/plugins/clientsideprops/cl_hooks.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

156 lines
3.5 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
function PLUGIN:KeyPress(client, key)
if (!IsFirstTimePredicted()) then return end
if (key != IN_ATTACK) then return end
local weapon = client:GetActiveWeapon()
if (!IsValid(weapon) or weapon:GetClass() != "weapon_physgun") then return end
if (!CAMI.PlayerHasAccess(client, "Helix - Manage Clientside Props")) then return end
-- Get the clientside entity that the player is looking at
local traceLength = 0
local targetEntity
local aimVector = client:GetAimVector()
local trace = {
start = client:GetShootPos(),
endpos = client:GetShootPos(),
filter = client
}
while (traceLength < 250) do -- Don't want it to go forever
if (IsValid(targetEntity)) then break end
trace.endpos = trace.start + aimVector * traceLength
for _, csent in ipairs(self.activeClientProps) do
if (csent:GetPos():DistToSqr(trace.endpos) > 62500) then continue end
local vMin, vMax = csent:GetRenderBounds()
local vPos = csent:WorldToLocal(trace.endpos)
if (!vPos:WithinAABox(vMax, vMin)) then continue end
targetEntity = csent
break
end
traceLength = traceLength + 1
end
if (!IsValid(targetEntity)) then return end
net.Start("ixClientProps.RecreateProp")
net.WriteVector(targetEntity:GetPos())
net.SendToServer()
end
local frameInterval = 5
function PLUGIN:Think()
self.coroutine = self.coroutine and coroutine.status(self.coroutine) != "dead" and self.coroutine or coroutine.create(function()
while (true) do
local maxPerFrame = ix.option.Get("csentRenderSpeed", 50)
local i = 0
for _, data in ipairs(self.clientProps) do
self:ManageClientsideProp(data)
i = i + 1
if (i == maxPerFrame) then
i = 0
coroutine.yield()
end
end
coroutine.yield()
end
end)
if (FrameNumber() % frameInterval != 0) then return end
local succ, err = coroutine.resume(self.coroutine)
if (succ) then return end
ErrorNoHalt(err)
end
function PLUGIN:InitPostEntity()
net.Start("ixClientProps.RequestProps")
net.SendToServer()
end
net.Receive("ixClientProps.NetworkProp", function()
local propData = net.ReadTable()
PLUGIN.clientProps[#PLUGIN.clientProps + 1] = propData
end)
net.Receive("ixClientProps.RecreateProp", function()
local position = net.ReadVector()
for k, data in ipairs(PLUGIN.clientProps) do
if (!data.position:IsEqualTol(position, 0.1)) then continue end
table.remove(PLUGIN.clientProps, k)
break
end
for k, csent in ipairs(PLUGIN.activeClientProps) do
if (!csent:GetPos():IsEqualTol(position, 0.1)) then continue end
csent:Remove()
table.remove(PLUGIN.activeClientProps, k)
break
end
end)
net.Receive("ixClientProps.MassRemoveProps", function()
local position = net.ReadVector()
local radius = net.ReadUInt(16)
local newTable = {}
for k, data in ipairs(PLUGIN.clientProps) do
if (data.position:Distance(position) <= radius) then continue end
newTable[#newTable + 1] = data
end
PLUGIN.clientProps = newTable
local newActiveTable = {}
for k, csent in ipairs(PLUGIN.activeClientProps) do
if (csent:GetPos():Distance(position) <= radius) then
csent:Remove()
else
newActiveTable[#newActiveTable + 1] = csent
end
end
PLUGIN.activeClientProps = newActiveTable
end)
express.Receive("ixClientProps.RequestProps", function(props)
PLUGIN.clientProps = props
end)