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

239 lines
5.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 ipairs = ipairs
local table_insert = table.insert
local isnumber = isnumber
local tonumber = tonumber
local isstring = isstring
local tostring = tostring
local table_Merge = table.Merge
local istable = istable
local pac = pac
local setmetatable = setmetatable
pac.PartTemplates = pac.PartTemplates or {}
pac.VariableOrder = {}
pac.GroupOrder = pac.GroupOrder or {}
do
local META = {}
META.__index = META
function META:StartStorableVars()
self.store = true
self.group = nil
return self
end
function META:EndStorableVars()
self.store = false
self.group = nil
return self
end
function META:GetPropData(key)
return self.PropertyUserdata and self.PropertyUserdata[key] or nil
end
function META:PropData(key)
self.PropertyUserdata = self.PropertyUserdata or {}
self.PropertyUserdata[key] = self.PropertyUserdata[key] or {}
return self.PropertyUserdata[key]
end
function META:StoreProp(key)
self.PART.StorableVars = self.PART.StorableVars or {}
self.PART.StorableVars[key] = key
end
function META:RemoveProp(key)
self.PropertyUserdata = self.PropertyUserdata or {}
self.PropertyUserdata[key] = nil
self.PART.StorableVars = self.PART.StorableVars or {}
self.PART.StorableVars[key] = nil
end
local function insert_key(tbl, key)
for _, k in ipairs(tbl) do
if k == key then
return
end
end
table_insert(tbl, key)
end
function META:SetPropertyGroup(name)
local tbl = self.PART
self.group = name
if tbl then
pac.GroupOrder[tbl.ClassName] = pac.GroupOrder[tbl.ClassName] or {}
insert_key(pac.GroupOrder[tbl.ClassName], name)
end
pac.GroupOrder.none = pac.GroupOrder.none or {}
insert_key(pac.GroupOrder.none, name)
return self
end
function META:PropertyOrder(key)
local tbl = self.PART
pac.VariableOrder[tbl.ClassName] = pac.VariableOrder[tbl.ClassName] or {}
insert_key(pac.VariableOrder[tbl.ClassName], key)
if self.group then
self:PropData(key).group = self.group
end
return self
end
function META:GetSet(key, def, udata)
local tbl = self.PART
pac.VariableOrder[tbl.ClassName] = pac.VariableOrder[tbl.ClassName] or {}
insert_key(pac.VariableOrder[tbl.ClassName], key)
if isnumber(def) then
tbl["Set" .. key] = tbl["Set" .. key] or function(self, var) self[key] = tonumber(var) end
tbl["Get" .. key] = tbl["Get" .. key] or function(self) return tonumber(self[key]) end
elseif isstring(def) then
tbl["Set" .. key] = tbl["Set" .. key] or function(self, var) self[key] = tostring(var) end
tbl["Get" .. key] = tbl["Get" .. key] or function(self) return tostring(self[key]) end
else
tbl["Set" .. key] = tbl["Set" .. key] or function(self, var) self[key] = var end
tbl["Get" .. key] = tbl["Get" .. key] or function(self) return self[key] end
end
tbl[key] = def
if udata then
table_Merge(self:PropData(key), udata)
end
if self.store then
self:StoreProp(key)
end
if self.group then
self:PropData(key).group = self.group
end
return self
end
function META:GetSetPart(key, udata)
udata = udata or {}
udata.editor_panel = udata.editor_panel or "part"
udata.part_key = key
local PART = self.PART
self:GetSet(key .. "UID", "", udata)
PART["Set" .. key .. "UID"] = function(self, uid)
if uid == "" or not uid then
self["Set" .. key](self, NULL)
self[key.."UID"] = ""
return
end
if istable(uid) then
uid = uid.UniqueID
end
self[key.."UID"] = uid
local owner_id = self:GetPlayerOwnerId()
local part = pac.GetPartFromUniqueID(owner_id, uid)
if part:IsValid() then
if part == self then
part = NULL
self[key.."UID"] = ""
end
self["Set" .. key](self, part)
elseif uid ~= "" then
self.unresolved_uid_parts = self.unresolved_uid_parts or {}
self.unresolved_uid_parts[owner_id] = self.unresolved_uid_parts[owner_id] or {}
self.unresolved_uid_parts[owner_id][uid] = self.unresolved_uid_parts[owner_id][uid] or {}
self.unresolved_uid_parts[owner_id][uid][key] = key
end
end
PART["Set" .. key] = PART["Set" .. key] or function(self, var)
self[key] = var
if var and var:IsValid() then
self[key.."UID"] = var:GetUniqueID()
else
self[key.."UID"] = ""
end
end
PART["Get" .. key] = PART["Get" .. key] or function(self) return self[key] end
PART[key] = NULL
PART.PartReferenceKeys = PART.PartReferenceKeys or {}
PART.PartReferenceKeys[key] = key
return self
end
function META:RemoveProperty(key)
self.PART["Set" .. key] = nil
self.PART["Get" .. key] = nil
self.PART["Is" .. key] = nil
self.PART[key] = nil
self:RemoveProp(key)
return self
end
function META:Register()
pac.PartTemplates[self.PART.ClassName] = self
pac.RegisterPart(self.PART)
return self
end
function pac.PartTemplate(name)
local builder
if name and pac.PartTemplates[name] then
builder = pac.CopyValue(pac.PartTemplates[name])
else
builder = {PART = {}}
builder.PART.Builder = builder
end
return setmetatable(builder, META), builder.PART
end
function pac.GetTemplate(name)
return pac.PartTemplates[name]
end
end
function pac.GetPropertyUserdata(obj, key)
return pac.PartTemplates[obj.ClassName] and pac.PartTemplates[obj.ClassName]:GetPropData(key) or {}
end