mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-18 14:13:46 +03:00
Upload
This commit is contained in:
239
lua/pac3/core/client/class.lua
Normal file
239
lua/pac3/core/client/class.lua
Normal file
@@ -0,0 +1,239 @@
|
||||
--[[
|
||||
| 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
|
||||
Reference in New Issue
Block a user