mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
162 lines
3.4 KiB
Lua
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
|
|
|
|
|