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

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()