mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
Upload
This commit is contained in:
155
gamemodes/helix/plugins/clientsideprops/cl_hooks.lua
Normal file
155
gamemodes/helix/plugins/clientsideprops/cl_hooks.lua
Normal file
@@ -0,0 +1,155 @@
|
||||
--[[
|
||||
| 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)
|
||||
|
||||
Reference in New Issue
Block a user