Files
wnsrc/lua/pac3/core/client/owner_name.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

152 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/
--]]
pac.OwnerNames = {
"self",
"viewmodel",
"hands",
"active vehicle",
"active weapon",
"world",
}
local function find_ent(ent, str)
return
pac.StringFind(ent:GetClass(), str) or
pac.StringFind(ent:GetClass(), str, true) or
(ent.GetName and pac.StringFind(ent:GetName(), str)) or
(ent.GetName and pac.StringFind(ent:GetName(), str, true)) or
pac.StringFind(ent:GetModel(), str) or
pac.StringFind(ent:GetModel(), str, true)
end
local function check_owner(a, b)
return a:GetOwner() == b or (not b.CPPIGetOwner or b:CPPIGetOwner() == a or b:CPPIGetOwner() == true)
end
local function calc_entity_crc(ent)
local pos = ent:GetPos()
local ang = ent:GetAngles()
local mdl = ent:GetModel():lower():gsub("\\", "/")
local x, y, z = math.Round(pos.x / 10) * 10, math.Round(pos.y / 10) * 10, math.Round(pos.z / 10) * 10
local p, _y, r = math.Round(ang.p / 10) * 10, math.Round(ang.y / 10) * 10, math.Round(ang.r / 10) * 10
local crc = x .. y .. z .. p .. _y .. r .. mdl
return pac.Hash(crc)
end
SafeRemoveEntity(pac.WorldEntity)
pac.WorldEntity = NULL
function pac.GetWorldEntity()
if not pac.WorldEntity:IsValid() then
local ent = pac.CreateEntity("models/error.mdl")
ent:SetPos(Vector(0,0,0))
-- go away ugh
ent:SetModelScale(0,0)
ent.IsPACWorldEntity = true
pac.WorldEntity = ent
end
return pac.WorldEntity
end
function pac.HandleOwnerName(owner, name, ent, part, check_func)
local idx = tonumber(name)
if idx then
ent = Entity(idx)
if ent:IsValid() then
if owner:IsValid() and owner.GetViewModel and ent == owner:GetViewModel() then
part:SetOwnerName("viewmodel")
return ent
end
if owner:IsValid() and owner.GetHands and ent == owner:GetHands() then
part:SetOwnerName("hands")
return ent
end
if ent == pac.LocalPlayer then
part:SetOwnerName("self")
return ent
end
if ent.GetPersistent and ent:GetPersistent() then
part:SetOwnerName("persist " .. calc_entity_crc(ent))
end
return ent
end
return pac.GetWorldEntity()
end
if name == "world" or name == "worldspawn" then
return pac.GetWorldEntity()
end
if name == "self" then
return owner
end
if owner:IsValid() then
if name == "active weapon" and owner.GetActiveWeapon and owner:GetActiveWeapon():IsValid() then
return owner:GetActiveWeapon()
end
if name == "active vehicle" and owner.GetVehicle and owner:GetVehicle():IsValid() then
return owner:GetVehicle()
end
if name == "hands" and owner == pac.LocalPlayer and pac.LocalHands:IsValid() then
return pac.LocalHands
end
if name == "hands" and owner.GetHands then
return owner:GetHands()
end
if name == "viewmodel" and owner.GetViewModel then
return owner:GetViewModel()
end
if IsValid(ent) and (not check_func or check_func(ent)) and check_owner(ent, owner) and find_ent(ent, name) then
return ent
end
for _, val in pairs(ents.GetAll()) do
if val:IsValid() and (not check_func or check_func(val)) and check_owner(val, owner) and find_ent(val, name) then
return val
end
end
end
if name:find("persist ", nil, true) then
local crc = name:match("persist (.+)")
for _, val in pairs(ents.GetAll()) do
if val.GetPersistent and val:GetModel() and val:GetPersistent() and crc == calc_entity_crc(val) then
return val
end
end
end
return NULL
end