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