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

162 lines
3.4 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 pac = pac
local part_count = 0 -- unique id thing
local pairs = pairs
pac.registered_parts = {}
local function on_error(msg)
ErrorNoHalt(debug.traceback(msg))
end
local function initialize(part, owner)
if part.PreInitialize then
part:PreInitialize()
end
pac.AddPart(part)
if owner then
part:SetPlayerOwner(owner)
end
part:Initialize()
end
function pac.CreatePart(name, owner, tbl, make_copy, level)
level = level or 0
name = name or "base"
owner = owner or pac.LocalPlayer
local META = pac.registered_parts[name]
if not META then
pac.Message("Tried to create unknown part: " .. name .. '!')
META = pac.registered_parts.base
if not META then
return NULL
end
end
local part = setmetatable({}, META)
part.Id = part_count
part_count = part_count + 1
if not tbl or not tbl.self.UniqueID then
part:SetUniqueID(pac.Hash())
end
part.DefaultVars = {}
for key in pairs(part.StorableVars) do
if key == "UniqueID" then
part.DefaultVars[key] = ""
else
part.DefaultVars[key] = pac.CopyValue(part[key])
end
end
local ok, err = xpcall(initialize, on_error, part, owner)
if not ok then
part:Remove()
if part.ClassName ~= "base" then
return pac.CreatePart("base", owner, tbl)
end
end
if tbl then
part:SetTable(tbl, make_copy, level)
end
if not META.GloballyEnabled then
part:SetEnabled(false)
end
pac.dprint("creating %s part owned by %s", part.ClassName, tostring(owner))
return part
end
local reloading = false
function pac.RegisterPart(META)
assert(isstring(META.ClassName), "Part has no classname")
assert(istable(META.StorableVars), "Part " .. META.ClassName .. " has no StorableVars")
do
local cvarName = "pac_enable_" .. string.Replace(META.ClassName, " ", "_"):lower()
local cvar = CreateClientConVar(cvarName, "1", true)
cvars.AddChangeCallback(cvarName, function(name, old, new)
local enable = tobool(new)
META.GloballyEnabled = enable
if enable then
pac.Message("enabling parts by class " .. META.ClassName)
else
pac.Message("disabling parts by class " .. META.ClassName)
end
pac.EnablePartsByClass(META.ClassName, enable)
end)
META.GloballyEnabled = cvar:GetBool()
end
META.__index = META
pac.registered_parts[META.ClassName] = META
if pac.UpdatePartsWithMetatable and _G.pac_ReloadParts then
if PAC_RESTART then return end
if not Entity(1):IsPlayer() then return end
if pac.in_initialize then return end
if not reloading then
reloading = true
_G.pac_ReloadParts()
reloading = false
end
timer.Create("pac_reload", 0, 1, function()
for _, other_meta in pairs(pac.registered_parts) do
pac.UpdatePartsWithMetatable(other_meta)
end
end)
end
end
function pac.LoadParts()
print("loading all parts")
include("base_part.lua")
include("base_movable.lua")
include("base_drawable.lua")
local files = file.Find("pac3/core/client/parts/*.lua", "LUA")
for _, name in pairs(files) do
include("pac3/core/client/parts/" .. name)
end
local files = file.Find("pac3/core/client/parts/legacy/*.lua", "LUA")
for _, name in pairs(files) do
include("pac3/core/client/parts/legacy/" .. name)
end
end
function pac.GetRegisteredParts()
return pac.registered_parts
end