mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
182 lines
3.9 KiB
Lua
182 lines
3.9 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 BUILDER, PART = pac.PartTemplate("base")
|
|
|
|
PART.ClassName = "submaterial"
|
|
|
|
PART.Icon = 'icon16/picture_edit.png'
|
|
PART.Group = {'model', 'entity'}
|
|
|
|
BUILDER:StartStorableVars()
|
|
BUILDER:GetSet("Material", "")
|
|
BUILDER:GetSet("SubMaterialId", 1, {
|
|
editor_onchange = function(self, num)
|
|
num = tonumber(num) or 0
|
|
local maxnum = 16
|
|
|
|
return math.floor(math.Clamp(num, 0, maxnum))
|
|
end,
|
|
|
|
enums = function(part)
|
|
local tbl = {}
|
|
for i,v in ipairs(part:GetSubMaterialIdList()) do
|
|
tbl[v] = tostring(i)
|
|
end
|
|
return tbl
|
|
end,
|
|
})
|
|
BUILDER:GetSet("RootOwner", false, { hide_in_editor = true })
|
|
BUILDER:EndStorableVars()
|
|
|
|
function PART:SetRootOwner(b)
|
|
self:SetRootOwnerDeprecated(b)
|
|
end
|
|
|
|
function PART:GetSubMaterialIdList()
|
|
local out = {}
|
|
|
|
local ent = self:GetOwner()
|
|
|
|
if ent:IsValid() and ent.GetMaterials and #ent:GetMaterials() > 0 then
|
|
out = ent:GetMaterials()
|
|
end
|
|
|
|
return out
|
|
end
|
|
|
|
function PART:UpdateSubMaterialId(id, material)
|
|
id = tonumber(id) or self.SubMaterialId
|
|
local ent = self:GetOwner()
|
|
|
|
if ent ~= self.sub_last_owner then
|
|
if IsValid(self.sub_last_owner) then
|
|
self.sub_last_owner:SetSubMaterial(self.sub_last_owner_sub_id - 1, "")
|
|
|
|
if self.sub_last_owner.pac_submaterials then
|
|
self.sub_last_owner.pac_submaterials[self.sub_last_owner_sub_id] = nil
|
|
end
|
|
end
|
|
|
|
self.sub_last_owner = ent
|
|
self.sub_last_owner_sub_id = id
|
|
end
|
|
|
|
if not ent:IsValid() or not ent.GetMaterials then return end
|
|
ent.pac_submaterials = ent.pac_submaterials or {}
|
|
|
|
local mat = self.Materialm
|
|
|
|
if not material then
|
|
if self.Material and self.Material ~= "" and mat and not mat:IsError() then
|
|
local matName = mat:GetName()
|
|
material = matName:find("/", 1, true) and matName or "!" .. matName
|
|
else
|
|
material = ''
|
|
end
|
|
end
|
|
|
|
if id > 0 then
|
|
ent.pac_submaterials[id] = material
|
|
ent:SetSubMaterial(id - 1, material)
|
|
end
|
|
end
|
|
|
|
function PART:PostApplyFixes()
|
|
self:UpdateSubMaterialId()
|
|
end
|
|
|
|
function PART:SetSubMaterialId(num)
|
|
self:UpdateSubMaterialId(self.SubMaterialId, "")
|
|
self.SubMaterialId = tonumber(num) or 1
|
|
self:UpdateSubMaterialId()
|
|
end
|
|
|
|
function PART:FixMaterial()
|
|
local mat = self.Materialm
|
|
if not mat then return end
|
|
|
|
local shader = mat:GetShader()
|
|
if shader ~= "UnlitGeneric" then return end
|
|
local tex_path = mat:GetString("$basetexture")
|
|
|
|
if not tex_path then return end
|
|
local params = {}
|
|
|
|
params["$basetexture"] = tex_path
|
|
params["$vertexcolor"] = 1
|
|
params["$additive"] = 1
|
|
|
|
self.Materialm = pac.CreateMaterial('pac_submat_fix_' .. pac.Hash(mat:GetName()), "VertexLitGeneric", params)
|
|
end
|
|
|
|
function PART:UrlTextHandler()
|
|
return function(...)
|
|
return self:Handleurltex(...)
|
|
end
|
|
end
|
|
|
|
function PART:Handleurltex(mat, tex)
|
|
if not IsValid(self) then return end
|
|
if not mat or mat:IsError() or tex:IsError() then self.Materialm = nil return end
|
|
|
|
self.Materialm = mat
|
|
self:CallRecursive("OnMaterialChanged")
|
|
|
|
self:UpdateSubMaterialId()
|
|
end
|
|
|
|
function PART:SetMaterial(var)
|
|
var = var or ""
|
|
|
|
if not pac.Handleurltex(self, var, self:UrlTextHandler()) then
|
|
if var == "" then
|
|
self.Materialm = nil
|
|
else
|
|
self.Materialm = pac.Material(var, self)
|
|
self:FixMaterial()
|
|
self:CallRecursive("OnMaterialChanged")
|
|
end
|
|
end
|
|
|
|
self.Material = var
|
|
self:UpdateSubMaterialId()
|
|
end
|
|
|
|
function PART:OnShow()
|
|
local ent = self:GetOwner()
|
|
|
|
if ent:IsValid() then
|
|
self:UpdateSubMaterialId()
|
|
end
|
|
end
|
|
|
|
function PART:OnHide(force)
|
|
if self.DefaultOnHide or force then
|
|
self:UpdateSubMaterialId(nil, "")
|
|
end
|
|
end
|
|
|
|
function PART:OnRemove()
|
|
self:OnHide(true)
|
|
end
|
|
|
|
function PART:OnUnParent(part)
|
|
if not part:IsValid() then return end
|
|
self:OnHide(true)
|
|
end
|
|
|
|
function PART:Clear()
|
|
self:RemoveChildren()
|
|
self:UpdateSubMaterialId(nil, "")
|
|
end
|
|
|
|
BUILDER:Register()
|