zombiesurvival-evolved/gamemodes/zombiesurvival/entities/weapons/swep_construction_kit/menu/models.lua

1619 lines
46 KiB
Lua
Raw Normal View History

2014-10-02 08:49:54 +08:00
local function GetVModelsText()
local wep = GetSCKSWEP( LocalPlayer() )
if (!IsValid(wep)) then return "" end
2014-10-02 08:49:54 +08:00
local str = ("SWEP.VElements = {\n")
local i = 0
local num = table.Count(wep.v_models)
for k, v in pairs( wep.v_models ) do
2014-10-02 08:49:54 +08:00
if (v.type == "Model") then
str = str.."\t[\""..k.."\"] = { type = \"Model\", model = \""..v.model.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
str = str..", angle = "..PrintAngle( v.angle )..", size = "..PrintVec(v.size)..", color = "..PrintColor( v.color )
str = str..", surpresslightning = "..tostring(v.surpresslightning)..", material = \""..v.material.."\", skin = "..v.skin
str = str..", bodygroup = {"
local i = 0
for k, v in pairs( v.bodygroup ) do
if (v <= 0) then continue end
if ( i != 0 ) then str = str..", " end
i = 1
str = str.."["..k.."] = "..v
end
str = str.."} }"
elseif (v.type == "Sprite") then
str = str.."\t[\""..k.."\"] = { type = \"Sprite\", sprite = \""..v.sprite.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
str = str..", size = { x = "..v.size.x..", y = "..v.size.y.." }, color = "..PrintColor( v.color )..", nocull = "..tostring(v.nocull)
str = str..", additive = "..tostring(v.additive)..", vertexalpha = "..tostring(v.vertexalpha)..", vertexcolor = "..tostring(v.vertexcolor)
str = str..", ignorez = "..tostring(v.ignorez).."}"
elseif (v.type == "Quad") then
str = str.."\t[\""..k.."\"] = { type = \"Quad\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)..", angle = "..PrintAngle( v.angle )
str = str..", size = "..v.size..", draw_func = nil}"
end
2014-10-02 08:49:54 +08:00
if (v.type) then
i = i + 1
if (i < num) then str = str.."," end
str = str.."\n"
end
end
str = str.."}"
return str
end
local function GetWModelsText()
local wep = GetSCKSWEP( LocalPlayer() )
if (!IsValid(wep)) then return "" end
local str = ("SWEP.WElements = {\n")
local i = 0
local num = table.Count(wep.w_models)
for k, v in pairs( wep.w_models ) do
2014-10-02 08:49:54 +08:00
if (v.type == "Model") then
str = str.."\t[\""..k.."\"] = { type = \"Model\", model = \""..v.model.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
str = str..", angle = "..PrintAngle( v.angle )..", size = "..PrintVec(v.size)..", color = "..PrintColor( v.color )
str = str..", surpresslightning = "..tostring(v.surpresslightning)..", material = \""..v.material.."\", skin = "..v.skin
str = str..", bodygroup = {"
local i = 0
for k, v in pairs( v.bodygroup ) do
if (v <= 0) then continue end
if ( i != 0 ) then str = str..", " end
i = 1
str = str.."["..k.."] = "..v
end
str = str.."} }"
elseif (v.type == "Sprite") then
str = str.."\t[\""..k.."\"] = { type = \"Sprite\", sprite = \""..v.sprite.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
str = str..", size = { x = "..v.size.x..", y = "..v.size.y.." }, color = "..PrintColor( v.color )..", nocull = "..tostring(v.nocull)
str = str..", additive = "..tostring(v.additive)..", vertexalpha = "..tostring(v.vertexalpha)..", vertexcolor = "..tostring(v.vertexcolor)
str = str..", ignorez = "..tostring(v.ignorez).."}"
elseif (v.type == "Quad") then
str = str.."\t[\""..k.."\"] = { type = \"Quad\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)..", angle = "..PrintAngle( v.angle )
str = str..", size = "..v.size..", draw_func = nil}"
end
2014-10-02 08:49:54 +08:00
if (v.type) then
i = i + 1
if (i < num) then str = str.."," end
str = str.."\n"
end
end
str = str.."}"
str = str.."\n\n"
local i = 0
for k, v in pairs( wep.w_models ) do
if (v.type == "Model") then
i = i + 1
str = str.."c:AddModel(\""..v.model.."\", "..PrintVec(v.pos)..", "..PrintAngle(v.angle)..", ".. ((not v.rel or #v.rel == 0) and "\""..v.bone.."\"" or "nil") ..", "..(v.size.x == 1 and v.size.y == 1 and v.size.z == 1 and "nil" or v.size.x == v.size.y and v.size.x == v.size.z and math.Round(v.size.x, 4) or PrintVec(v.size))..", ".. (v.material and #v.material > 0 and "\""..v.material.."\"" or "nil") ..", "..(v.color.r == 255 and v.color.g == 255 and v.color.b == 255 and v.color.a == 255 and "nil" or PrintColor( v.color ))
if v.rel and #v.rel > 0 then
str = str..", 1"
end
str = str..")\n"
end
end
return str
end
local function PopulateRelative( sourcetab, box, startchoice, ignore )
2014-10-02 08:49:54 +08:00
box:Clear()
local choose = box:AddChoice("")
for k, v in pairs( sourcetab ) do
if (v == ignore) then continue end
local id = box:AddChoice(v)
if (v == startchoice) then
choose = id
end
end
box:ChooseOptionID( choose )
2014-10-02 08:49:54 +08:00
end
-- Some hacky shit to keep the relative DComboBoxes updated
2014-10-02 08:49:54 +08:00
local v_relelements = {}
local w_relelements = {}
local boxes_to_update = {}
local function RegisterRelBox( elementname, box, w_or_v, preset_choice )
table.insert(boxes_to_update, { box, w_or_v, elementname, preset_choice })
2014-10-02 08:49:54 +08:00
end
local function RemoveRelBox( w_or_v, elementname )
for k, v in pairs( boxes_to_update ) do
if (v[2] == w_or_v and v[3] == elementname) then
table.remove(boxes_to_update, k)
break
end
end
end
local function UpdateRelBoxes( w_or_v )
local source = v_relelements
if (w_or_v == "w") then
source = w_relelements
end
2014-10-02 08:49:54 +08:00
for k, v in pairs( boxes_to_update ) do
if (IsValid(v[1]) and v[2] == w_or_v) then
2014-10-02 08:49:54 +08:00
local choose = v[1]:GetValue()
if (v[4]) then -- preset choice
2014-10-02 08:49:54 +08:00
choose = v[4]
v[4] = nil
end
PopulateRelative( source, v[1], choose, v[3] )
end
end
end
local wep = GetSCKSWEP( LocalPlayer() )
local pmodels = wep.pmodels
local pwmodels = wep.pwmodels
local lastVisible = ""
local mlabel = vgui.Create( "DLabel", pmodels )
mlabel:SetTall( 20 )
mlabel:SetText( "New viewmodel element:" )
mlabel:Dock(TOP)
local function CreateNote( text )
local templabel = vgui.Create( "DLabel" )
templabel:SetText( text )
templabel:SizeToContents()
local x, y = mlabel:GetPos()
local notif = vgui.Create( "DNotify" , pmodels )
notif:SetPos( x + 160, y )
notif:SetSize( templabel:GetWide(), 20 )
notif:SetLife( 5 )
notif:AddItem(templabel)
end
local pnewelement = SimplePanel( pmodels )
pnewelement:SetTall(20)
local mntext = vgui.Create("DTextEntry", pnewelement )
mntext:SetTall( 20 )
mntext:SetMultiline(false)
mntext:SetText( "element_name" )
mntext:Dock(FILL)
2014-10-02 08:49:54 +08:00
local mnbtn = vgui.Create( "DButton", pnewelement )
mnbtn:SetSize( 50, 20 )
mnbtn:SetText( "Add" )
mnbtn:DockMargin(5,0,0,0)
mnbtn:Dock(RIGHT)
2014-10-02 08:49:54 +08:00
local tpbox = vgui.Create( "DComboBox", pnewelement )
tpbox:SetSize( 100, 20 )
tpbox:SetText( "Model" )
tpbox:AddChoice( "Model" )
tpbox:AddChoice( "Sprite" )
tpbox:AddChoice( "Quad" )
local boxselected = "Model"
tpbox.OnSelect = function( p, index, value )
boxselected = value
end
tpbox:DockMargin(5,0,0,0)
tpbox:Dock(RIGHT)
pnewelement:DockMargin(0,5,0,5)
pnewelement:Dock(TOP)
local mlist = vgui.Create( "DListView", pmodels)
wep.v_modelListing = mlist
2014-10-02 08:49:54 +08:00
mlist:SetTall( 160 )
mlist:SetMultiSelect(false)
mlist:SetDrawBackground(true)
mlist:AddColumn("Name")
mlist:AddColumn("Type")
-- cache the created panels
2014-10-02 08:49:54 +08:00
mlist.OnRowSelected = function( panel, line )
local name = mlist:GetLine(line):GetValue(1)
2014-10-02 08:49:54 +08:00
if (wep.v_panelCache[lastVisible]) then
wep.v_panelCache[lastVisible]:SetVisible(false)
end
wep.v_panelCache[name]:SetVisible(true)
2014-10-02 08:49:54 +08:00
lastVisible = name
end
mlist:Dock(TOP)
local pbuttons = SimplePanel( pmodels )
local rmbtn = vgui.Create( "DButton", pbuttons )
rmbtn:SetSize( 160, 25 )
rmbtn:SetText( "Remove selected" )
rmbtn:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local copybtn = vgui.Create( "DButton", pbuttons )
copybtn:SetSize( 160, 25 )
copybtn:SetText( "Copy selected" )
copybtn:Dock(RIGHT)
pbuttons:DockMargin(0,5,0,5)
pbuttons:Dock(TOP)
-- Print buttons
2014-10-02 08:49:54 +08:00
local pctbtn = vgui.Create( "DButton", pmodels)
pctbtn:SetTall( 30 )
pctbtn:SetText("Copy view model table to clipboard")
pctbtn.DoClick = function()
SetClipboardText(GetVModelsText())
LocalPlayer():ChatPrint("Code copied to clipboard!")
end
pctbtn:DockMargin(0,5,0,0)
pctbtn:Dock(BOTTOM)
local prtbtn = vgui.Create( "DButton", pmodels)
prtbtn:SetTall( 30 )
prtbtn:SetText("Print view model table to console")
prtbtn.DoClick = function()
MsgN("*********************************************")
for k, v in pairs(string.Explode("\n",GetVModelsText())) do
MsgN(v)
end
MsgN("*********************************************")
LocalPlayer():ChatPrint("Code printed to console!")
end
prtbtn:Dock(BOTTOM)
local pCol = 0
local function PanelBackgroundReset()
pCol = 0
end
local function PanelApplyBackground(panel)
2014-10-02 08:49:54 +08:00
if (pCol == 1) then
panel:SetPaintBackground(true)
panel.Paint = function() surface.SetDrawColor( 85, 85, 85, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
end
2014-10-02 08:49:54 +08:00
pCol = (pCol + 1) % 2
end
local function CreatePositionModifiers( data, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(32*3)
PanelApplyBackground(panel)
2014-10-02 08:49:54 +08:00
local trlabel = vgui.Create( "DLabel", panel )
trlabel:SetText( "Position:" )
trlabel:SizeToContents()
trlabel:SetWide(45)
trlabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local mxwang = vgui.Create( "DNumSlider", panel )
mxwang:SetText("x")
mxwang:SetMinMax( -80, 80 )
mxwang:SetDecimals( 3 )
mxwang.Wang.ConVarChanged = function( p, value ) data.pos.x = tonumber(value) end
mxwang:SetValue( data.pos.x )
mxwang:DockMargin(10,0,0,0)
2014-10-02 08:49:54 +08:00
local mywang = vgui.Create( "DNumSlider", panel )
mywang:SetText("y")
2014-10-02 08:49:54 +08:00
mywang:SetMinMax( -80, 80 )
mywang:SetDecimals( 3 )
mywang.Wang.ConVarChanged = function( p, value ) data.pos.y = tonumber(value) end
mywang:SetValue( data.pos.y )
mywang:DockMargin(10,0,0,0)
2014-10-02 08:49:54 +08:00
local mzwang = vgui.Create( "DNumSlider", panel )
mzwang:SetText("z")
mzwang:SetMinMax( -80, 80 )
mzwang:SetDecimals( 3 )
mzwang.Wang.ConVarChanged = function( p, value ) data.pos.z = tonumber(value) end
mzwang:SetValue( data.pos.z )
mzwang:DockMargin(10,0,0,0)
panel.PerformLayout = function()
2014-10-02 08:49:54 +08:00
mxwang:SetWide(panel:GetWide()*4/15)
mywang:SetWide(panel:GetWide()*4/15)
2014-10-02 08:49:54 +08:00
mzwang:SetWide(panel:GetWide()*4/15)
end
2014-10-02 08:49:54 +08:00
mxwang:Dock(TOP)
mywang:Dock(TOP)
mzwang:Dock(TOP)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateAngleModifiers( data, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(32*3)
PanelApplyBackground(panel)
2014-10-02 08:49:54 +08:00
local anlabel = vgui.Create( "DLabel", panel )
anlabel:SetText( "Angle:" )
anlabel:SizeToContents()
anlabel:SetWide(45)
anlabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local mpitchwang = vgui.Create( "DNumSlider", panel )
mpitchwang:SetText("pitch")
mpitchwang:SetMinMax( -180, 180 )
mpitchwang:SetDecimals( 3 )
mpitchwang.Wang.ConVarChanged = function( p, value ) data.angle.p = tonumber(value) end
mpitchwang:SetValue( data.angle.p )
mpitchwang:DockMargin(10,0,0,0)
2014-10-02 08:49:54 +08:00
local myawwang = vgui.Create( "DNumSlider", panel )
myawwang:SetText("yaw")
myawwang:SetMinMax( -180, 180 )
myawwang:SetDecimals( 3 )
myawwang.Wang.ConVarChanged = function( p, value ) data.angle.y = tonumber(value) end
myawwang:SetValue( data.angle.y )
myawwang:DockMargin(10,0,0,0)
2014-10-02 08:49:54 +08:00
local mrollwang = vgui.Create( "DNumSlider", panel )
mrollwang:SetText("roll")
mrollwang:SetMinMax( -180, 180 )
mrollwang:SetDecimals( 3 )
mrollwang.Wang.ConVarChanged = function( p, value ) data.angle.r = tonumber(value) end
mrollwang:SetValue( data.angle.r )
mrollwang:DockMargin(10,0,0,0)
panel.PerformLayout = function()
2014-10-02 08:49:54 +08:00
mrollwang:SetWide(panel:GetWide()*4/15)
myawwang:SetWide(panel:GetWide()*4/15)
2014-10-02 08:49:54 +08:00
mpitchwang:SetWide(panel:GetWide()*4/15)
end
2014-10-02 08:49:54 +08:00
mpitchwang:Dock(TOP)
myawwang:Dock(TOP)
mrollwang:Dock(TOP)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateSizeModifiers( data, panel, dimensions )
panel:SetTall(32*dimensions)
PanelApplyBackground(panel)
2014-10-02 08:49:54 +08:00
local sizelabel = vgui.Create( "DLabel", panel )
sizelabel:SetText( "Size:" )
sizelabel:SizeToContents()
sizelabel:SetWide(45)
sizelabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local msywang, mszwang
2014-10-02 08:49:54 +08:00
local msxwang = vgui.Create( "DNumSlider", panel )
msxwang:SetMinMax( 0.01, 10 )
msxwang:SetDecimals( 3 )
2014-10-02 08:49:54 +08:00
if (dimensions > 1 ) then
2014-10-02 08:49:54 +08:00
msywang = vgui.Create( "DNumSlider", panel )
msywang:SetText("y")
msywang:SetMinMax( 0.01, 10 )
msywang:SetDecimals( 3 )
msywang.Wang.ConVarChanged = function( p, value ) data.size.y = tonumber(value) end
msywang:DockMargin(10,0,0,0)
msywang:Dock(TOP)
2014-10-02 08:49:54 +08:00
if (dimensions > 2) then
mszwang = vgui.Create( "DNumSlider", panel )
mszwang:SetText("z")
mszwang:SetMinMax( 0.01, 10 )
mszwang:SetDecimals( 3 )
mszwang.Wang.ConVarChanged = function( p, value ) data.size.z = tonumber(value) end
mszwang:DockMargin(10,0,0,0)
mszwang:Dock(TOP)
end
2014-10-02 08:49:54 +08:00
end
-- make the x numberwang set the total size
2014-10-02 08:49:54 +08:00
msxwang.Wang.ConVarChanged = function( p, value )
if (mszwang) then
mszwang:SetValue( value )
end
if (msywang) then
msywang:SetValue( value )
end
2014-10-02 08:49:54 +08:00
if (dimensions > 1) then
data.size.x = tonumber(value)
else
data.size = tonumber(value)
end
end
2014-10-02 08:49:54 +08:00
msxwang:DockMargin(10,0,0,0)
msxwang:Dock(TOP)
--[[panel.PerformLayout = function()
2014-10-02 08:49:54 +08:00
msxwang:SetWide(panel:GetWide()*4/5/dimensions)
if (dimensions > 1) then
msywang:SetWide(panel:GetWide()*4/5/dimensions)
if (dimensions > 2) then
mszwang:SetWide(panel:GetWide()*4/15)
end
end
end]]
2014-10-02 08:49:54 +08:00
if (dimensions == 1) then
2014-10-02 08:49:54 +08:00
msxwang:SetText("factor")
msxwang:SetValue( data.size )
2014-10-02 08:49:54 +08:00
else
2014-10-02 08:49:54 +08:00
local new_y = data.size.y
local new_z = data.size.z
2014-10-02 08:49:54 +08:00
msxwang:SetText("x / y")
msxwang:SetValue( data.size.x )
msywang:SetValue( new_y )
2014-10-02 08:49:54 +08:00
if (mszwang) then
msxwang:SetText("x / y / z")
mszwang:SetValue( new_z )
end
2014-10-02 08:49:54 +08:00
end
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateColorModifiers( data, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(32*4)
PanelApplyBackground(panel)
2014-10-02 08:49:54 +08:00
local collabel = vgui.Create( "DLabel", panel )
collabel:SetText( "Color:" )
collabel:SizeToContents()
collabel:SetWide(45)
collabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local colrwang = vgui.Create( "DNumSlider", panel )
colrwang:SetText("red")
colrwang:SetMinMax( 0, 255 )
colrwang:SetDecimals( 0 )
colrwang.Wang.ConVarChanged = function( p, value ) data.color.r = tonumber(value) end
colrwang:SetValue(data.color.r)
colrwang:DockMargin(10,0,0,0)
2014-10-02 08:49:54 +08:00
local colgwang = vgui.Create( "DNumSlider", panel )
colgwang:SetText("green")
colgwang:SetMinMax( 0, 255 )
colgwang:SetDecimals( 0 )
colgwang.Wang.ConVarChanged = function( p, value ) data.color.g = tonumber(value) end
colgwang:SetValue(data.color.g)
colgwang:DockMargin(10,0,0,0)
2014-10-02 08:49:54 +08:00
local colbwang = vgui.Create( "DNumSlider", panel )
colbwang:SetText("blue")
colbwang:SetMinMax( 0, 255 )
colbwang:SetDecimals( 0 )
colbwang.Wang.ConVarChanged = function( p, value ) data.color.b = tonumber(value) end
colbwang:SetValue(data.color.b)
colbwang:DockMargin(10,0,0,0)
2014-10-02 08:49:54 +08:00
local colawang = vgui.Create( "DNumSlider", panel )
colawang:SetText("alpha")
colawang:SetMinMax( 0, 255 )
colawang:SetDecimals( 0 )
colawang.Wang.ConVarChanged = function( p, value ) data.color.a = tonumber(value) end
colawang:SetValue(data.color.a)
colawang:DockMargin(10,0,0,0)
panel.PerformLayout = function()
2014-10-02 08:49:54 +08:00
colawang:SetWide(panel:GetWide()/5)
colbwang:SetWide(panel:GetWide()/5)
colgwang:SetWide(panel:GetWide()/5)
colrwang:SetWide(panel:GetWide()/5)
end
2014-10-02 08:49:54 +08:00
colrwang:Dock(TOP)
colgwang:Dock(TOP)
colbwang:Dock(TOP)
colawang:Dock(TOP)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateModelModifier( data, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(20)
2014-10-02 08:49:54 +08:00
local pmolabel = vgui.Create( "DLabel", panel )
pmolabel:SetText( "Model:" )
pmolabel:SetWide(60)
pmolabel:SizeToContentsY()
pmolabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local wtbtn = vgui.Create( "DButton", panel )
wtbtn:SetSize( 25, 20 )
wtbtn:SetText("...")
wtbtn:Dock(RIGHT)
2014-10-02 08:49:54 +08:00
local pmmtext = vgui.Create( "DTextEntry", panel )
pmmtext:SetMultiline(false)
pmmtext:SetTooltip("Path to the model file")
2014-10-02 08:49:54 +08:00
pmmtext.OnTextChanged = function()
local newmod = pmmtext:GetValue()
if file.Exists(newmod, "GAME") then
util.PrecacheModel(newmod)
data.model = newmod
end
end
pmmtext:SetText( data.model )
pmmtext.OnTextChanged()
pmmtext:DockMargin(10,0,0,0)
pmmtext:Dock(FILL)
2014-10-02 08:49:54 +08:00
wtbtn.DoClick = function()
wep:OpenBrowser( data.model, "model", function( val ) pmmtext:SetText(val) pmmtext:OnTextChanged() end )
end
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateSpriteModifier( data, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(20)
2014-10-02 08:49:54 +08:00
local pmolabel = vgui.Create( "DLabel", panel )
pmolabel:SetText( "Sprite:" )
pmolabel:SetWide(60)
pmolabel:SizeToContentsY()
pmolabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local wtbtn = vgui.Create( "DButton", panel )
wtbtn:SetSize( 25, 20 )
wtbtn:SetText("...")
wtbtn:Dock(RIGHT)
2014-10-02 08:49:54 +08:00
local pmmtext = vgui.Create( "DTextEntry", panel )
pmmtext:SetMultiline(false)
pmmtext:SetTooltip("Path to the sprite material")
2014-10-02 08:49:54 +08:00
pmmtext.OnTextChanged = function()
local newsprite = pmmtext:GetValue()
if file.Exists("materials/"..newsprite..".vmt", "GAME") then
data.sprite = newsprite
end
end
pmmtext:SetText( data.sprite )
pmmtext.OnTextChanged()
pmmtext:DockMargin(10,0,0,0)
pmmtext:Dock(FILL)
2014-10-02 08:49:54 +08:00
wtbtn.DoClick = function()
wep:OpenBrowser( data.sprite, "material", function( val ) pmmtext:SetText(val) pmmtext:OnTextChanged() end )
end
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateNameLabel( name, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(20)
2014-10-02 08:49:54 +08:00
local pnmlabel = vgui.Create( "DLabel", panel )
pnmlabel:SetText( "Name: "..name )
pnmlabel:SizeToContents()
pnmlabel:Dock(LEFT)
--[[local pnmtext = vgui.Create( "DTextEntry", panel )
2014-10-02 08:49:54 +08:00
pnmtext:SetMultiline(false)
pnmtext:SetText( name )
pnmtext:SetEditable( false )
pnmtext:Dock(FILL)]]
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateParamModifiers( data, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(45)
2014-10-02 08:49:54 +08:00
local strip1 = SimplePanel( panel )
strip1:SetTall(20)
2014-10-02 08:49:54 +08:00
local ncchbox = vgui.Create( "DCheckBoxLabel", strip1 )
ncchbox:SetText("$nocull")
ncchbox:SizeToContents()
ncchbox:SetValue( 0 )
ncchbox.OnChange = function()
data.nocull = ncchbox:GetChecked()
data.spriteMaterial = nil -- dump old material
2014-10-02 08:49:54 +08:00
end
if (data.nocull) then ncchbox:SetValue( 1 ) end
ncchbox:DockMargin(0,0,10,0)
ncchbox:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local adchbox = vgui.Create( "DCheckBoxLabel", strip1 )
adchbox:SetText("$additive")
adchbox:SizeToContents()
adchbox:SetValue( 0 )
adchbox.OnChange = function()
data.additive = adchbox:GetChecked()
data.spriteMaterial = nil -- dump old material
2014-10-02 08:49:54 +08:00
end
if (data.additive) then adchbox:SetValue( 1 ) end
adchbox:DockMargin(0,0,10,0)
adchbox:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local vtachbox = vgui.Create( "DCheckBoxLabel", strip1 )
vtachbox:SetText("$vertexalpha")
vtachbox:SizeToContents()
vtachbox:SetValue( 0 )
vtachbox.OnChange = function()
data.vertexalpha = vtachbox:GetChecked()
data.spriteMaterial = nil -- dump old material
2014-10-02 08:49:54 +08:00
end
if (data.vertexalpha) then vtachbox:SetValue( 1 ) end
vtachbox:DockMargin(0,0,10,0)
vtachbox:Dock(LEFT)
2014-10-02 08:49:54 +08:00
strip1:DockMargin(0,0,0,5)
strip1:Dock(TOP)
2014-10-02 08:49:54 +08:00
local strip2 = SimplePanel( panel )
strip2:SetTall(20)
2014-10-02 08:49:54 +08:00
local vtcchbox = vgui.Create( "DCheckBoxLabel", strip2 )
vtcchbox:SetText("$vertexcolor")
vtcchbox:SizeToContents()
vtcchbox:SetValue( 0 )
vtcchbox.OnChange = function()
data.vertexcolor = vtcchbox:GetChecked()
data.spriteMaterial = nil -- dump old material
2014-10-02 08:49:54 +08:00
end
if (data.vertexcolor) then vtcchbox:SetValue( 1 ) end
vtcchbox:DockMargin(0,0,10,0)
vtcchbox:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local izchbox = vgui.Create( "DCheckBoxLabel", strip2 )
izchbox:SetText("$ignorez")
izchbox:SizeToContents()
izchbox:SetValue( 0 )
izchbox.OnChange = function()
data.ignorez = izchbox:GetChecked()
data.spriteMaterial = nil -- dump old material
2014-10-02 08:49:54 +08:00
end
if (data.ignorez) then izchbox:SetValue( 1 ) end
izchbox:DockMargin(0,0,10,0)
izchbox:Dock(LEFT)
2014-10-02 08:49:54 +08:00
strip2:Dock(TOP)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateMaterialModifier( data, panel )
2014-10-02 08:49:54 +08:00
panel:SetTall(20)
2014-10-02 08:49:54 +08:00
local matlabel = vgui.Create( "DLabel", panel )
matlabel:SetText( "Material:" )
matlabel:SetWide(60)
matlabel:SizeToContentsY()
matlabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local wtbtn = vgui.Create( "DButton", panel )
wtbtn:SetSize( 25, 20 )
wtbtn:SetText("...")
wtbtn:Dock(RIGHT)
2014-10-02 08:49:54 +08:00
local mattext = vgui.Create("DTextEntry", panel )
mattext:SetMultiline(false)
mattext:SetTooltip("Path to the material file")
2014-10-02 08:49:54 +08:00
mattext.OnTextChanged = function()
local newmat = mattext:GetValue()
if file.Exists("materials/"..newmat..".vmt", "GAME") then
data.material = newmat
else
data.material = ""
end
end
mattext:SetText( data.material )
mattext:DockMargin(10,0,0,0)
mattext:Dock(FILL)
2014-10-02 08:49:54 +08:00
wtbtn.DoClick = function()
wep:OpenBrowser( data.material, "material", function( val ) mattext:SetText(val) mattext:OnTextChanged() end )
end
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateSLightningModifier( data, panel )
local lschbox = vgui.Create( "DCheckBoxLabel", panel )
lschbox:SetText("Surpress engine lightning")
lschbox:SizeToContents()
lschbox.OnChange = function()
data.surpresslightning = lschbox:GetChecked()
end
if (data.surpresslightning) then
lschbox:SetValue( 1 )
else
lschbox:SetValue( 0 )
end
lschbox:Dock(LEFT)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateBoneModifier( data, panel, ent )
2014-10-02 08:49:54 +08:00
local pbonelabel = vgui.Create( "DLabel", panel )
pbonelabel:SetText( "Bone:" )
pbonelabel:SetWide(60)
pbonelabel:SizeToContentsY()
pbonelabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local bonebox = vgui.Create( "DComboBox", panel )
bonebox:SetTooltip("Bone to parent the selected element to. Is ignored if the 'Relative' field is not empty")
2014-10-02 08:49:54 +08:00
bonebox.OnSelect = function( p, index, value )
data.bone = value
end
bonebox:SetText( data.bone )
bonebox:DockMargin(10,0,0,0)
bonebox:Dock(FILL)
2014-10-02 08:49:54 +08:00
local delay = 0
-- we have to call it later when loading settings because the viewmodel needs to be changed first
2014-10-02 08:49:54 +08:00
if (data.bone != "") then delay = 2 end
2014-10-02 08:49:54 +08:00
timer.Simple(delay, function()
local option = PopulateBoneList( bonebox, ent )
if (option and data.bone == "") then
2014-10-02 08:49:54 +08:00
bonebox:ChooseOptionID(1)
end
end)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateVRelativeModifier( name, data, panel )
2014-10-02 08:49:54 +08:00
local prellabel = vgui.Create( "DLabel", panel )
prellabel:SetText( "Relative:" )
prellabel:SetWide(60)
prellabel:SizeToContentsY()
prellabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local relbox = vgui.Create( "DComboBox", panel )
relbox:SetTooltip("Element you want to parent this element to (position and angle become relative). Overrides parenting to a bone if not blank.")
2014-10-02 08:49:54 +08:00
relbox.OnSelect = function( p, index, value )
data.rel = value
end
relbox:DockMargin(10,0,0,0)
relbox:Dock(FILL)
2014-10-02 08:49:54 +08:00
RegisterRelBox(name, relbox, "v", data.rel)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateWRelativeModifier( name, data, panel )
2014-10-02 08:49:54 +08:00
local prellabel = vgui.Create( "DLabel", panel )
prellabel:SetText( "Relative:" )
prellabel:SetWide(60)
prellabel:SizeToContentsY()
prellabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local relbox = vgui.Create( "DComboBox", panel )
relbox:SetTooltip("Element you want to parent this element to (position and angle become relative). Overrides parenting to a bone if not blank.")
2014-10-02 08:49:54 +08:00
relbox.OnSelect = function( p, index, value )
data.rel = value
end
relbox:DockMargin(10,0,0,0)
relbox:Dock(FILL)
2014-10-02 08:49:54 +08:00
RegisterRelBox(name, relbox, "w", data.rel)
2014-10-02 08:49:54 +08:00
return panel
end
local function CreateBodygroupSkinModifier( data, panel )
local bdlabel = vgui.Create( "DLabel", panel )
bdlabel:SetText( "Bodygroup:" )
bdlabel:SizeToContents()
bdlabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local bdwang = vgui.Create( "DNumberWang", panel )
bdwang:SetSize( 30, 20 )
bdwang:SetMinMax( 1, 9 )
bdwang:SetDecimals( 0 )
bdwang:SetTooltip("Bodygroup number")
2014-10-02 08:49:54 +08:00
bdwang:DockMargin(10,0,0,0)
bdwang:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local islabel = vgui.Create( "DLabel", panel )
islabel:SetSize( 10, 20 )
islabel:SetText( "=" )
islabel:DockMargin(1,0,1,0)
islabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local bdvwang = vgui.Create( "DNumberWang", panel )
bdvwang:SetSize( 30, 20 )
bdvwang:SetMinMax( 0, 9 )
bdvwang:SetDecimals( 0 )
bdvwang:SetTooltip("State number")
2014-10-02 08:49:54 +08:00
bdvwang:Dock(LEFT)
bdvwang.ConVarChanged = function( p, value )
2014-10-02 08:49:54 +08:00
local group = tonumber(bdwang:GetValue())
local val = tonumber(value)
data.bodygroup[group] = val
end
bdvwang:SetValue(0)
bdwang.ConVarChanged = function( p, value )
local group = tonumber(value)
if (group < 1) then return end
local setval = data.bodygroup[group] or 0
bdvwang:SetValue(setval)
end
bdwang:SetValue(1)
local sklabel = vgui.Create( "DLabel", panel )
sklabel:SetText( "Skin:" )
sklabel:SizeToContents()
sklabel:DockMargin(50,0,0,0)
sklabel:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local skwang = vgui.Create( "DNumberWang", panel )
skwang:SetSize( 30, 20 )
skwang:SetMin( 0 )
skwang:SetMax( 9 )
skwang:SetDecimals( 0 )
skwang.ConVarChanged = function( p, value ) data.skin = tonumber(value) end
skwang:SetValue(data.skin)
skwang:DockMargin(10,0,0,0)
skwang:Dock(LEFT)
2014-10-02 08:49:54 +08:00
return panel
end
--[[** Model panel for adjusting models ***
2014-10-02 08:49:54 +08:00
Name:
Model:
Bone name:
Translation x / y / z
Rotation pitch / yaw / role
Model size x / y / z
Material
Color modulation
]]
2014-10-02 08:49:54 +08:00
local function CreateModelPanel( name, preset_data )
2014-10-02 08:49:54 +08:00
local data = wep.v_models[name]
if (!preset_data) then preset_data = {} end
-- default data
2014-10-02 08:49:54 +08:00
data.type = preset_data.type or "Model"
data.model = preset_data.model or ""
data.bone = preset_data.bone or ""
data.rel = preset_data.rel or ""
data.pos = preset_data.pos or Vector(0,0,0)
data.angle = preset_data.angle or Angle(0,0,0)
data.size = preset_data.size or Vector(0.5,0.5,0.5)
data.color = preset_data.color or Color(255,255,255,255)
data.surpresslightning = preset_data.surpresslightning or false
data.material = preset_data.material or ""
data.bodygroup = preset_data.bodygroup or {}
data.skin = preset_data.skin or 0
wep.vRenderOrder = nil -- force viewmodel render order to recache
2014-10-02 08:49:54 +08:00
local panellist = vgui.Create("DPanelList", pmodels )
panellist:SetPaintBackground( true )
panellist.Paint = function() surface.SetDrawColor( 90, 90, 90, 255 ) surface.DrawRect( 0, 0, panellist:GetWide(), panellist:GetTall() ) end
panellist:EnableVerticalScrollbar( true )
panellist:SetSpacing(5)
panellist:SetPadding(5)
panellist:DockMargin(0,0,0,5)
panellist:Dock(FILL)
2014-10-02 08:49:54 +08:00
PanelBackgroundReset()
2014-10-02 08:49:54 +08:00
panellist:AddItem(CreateNameLabel( name, SimplePanel(panellist) ))
panellist:AddItem(CreateModelModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateBoneModifier( data, SimplePanel(panellist), LocalPlayer():GetViewModel() ))
panellist:AddItem(CreateVRelativeModifier( name, data, SimplePanel(panellist) ))
panellist:AddItem(CreatePositionModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateAngleModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSizeModifiers( data, SimplePanel(panellist), 3 ))
panellist:AddItem(CreateColorModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSLightningModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateMaterialModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateBodygroupSkinModifier( data, SimplePanel(panellist) ))
2014-10-02 08:49:54 +08:00
return panellist
2014-10-02 08:49:54 +08:00
end
--[[** Sprite panel for adjusting sprites ***
2014-10-02 08:49:54 +08:00
Name:
Sprite:
Bone name:
Translation x / y / z
Sprite x / y size
Color
]]
2014-10-02 08:49:54 +08:00
local function CreateSpritePanel( name, preset_data )
2014-10-02 08:49:54 +08:00
local data = wep.v_models[name]
if (!preset_data) then preset_data = {} end
-- default data
2014-10-02 08:49:54 +08:00
data.type = preset_data.type or "Sprite"
data.sprite = preset_data.sprite or ""
data.bone = preset_data.bone or ""
data.rel = preset_data.rel or ""
data.pos = preset_data.pos or Vector(0,0,0)
data.size = preset_data.size or { x = 1, y = 1 }
data.color = preset_data.color or Color(255,255,255,255)
data.nocull = preset_data.nocull or true
data.additive = preset_data.additive or true
data.vertexalpha = preset_data.vertexalpha or true
data.vertexcolor = preset_data.vertexcolor or true
data.ignorez = preset_data.ignorez or false
2014-10-02 08:49:54 +08:00
wep.vRenderOrder = nil
2014-10-02 08:49:54 +08:00
local panellist = vgui.Create("DPanelList", pmodels )
panellist:SetPaintBackground( true )
panellist.Paint = function() surface.SetDrawColor( 90, 90, 90, 255 ) surface.DrawRect( 0, 0, panellist:GetWide(), panellist:GetTall() ) end
panellist:EnableVerticalScrollbar( true )
panellist:SetSpacing(5)
panellist:SetPadding(5)
panellist:DockMargin(0,0,0,5)
panellist:Dock(FILL)
2014-10-02 08:49:54 +08:00
PanelBackgroundReset()
2014-10-02 08:49:54 +08:00
panellist:AddItem(CreateNameLabel( name,SimplePanel(panellist) ))
panellist:AddItem(CreateSpriteModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateBoneModifier( data, SimplePanel(panellist), LocalPlayer():GetViewModel() ))
panellist:AddItem(CreateVRelativeModifier( name, data, SimplePanel(panellist) ))
panellist:AddItem(CreatePositionModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSizeModifiers( data, SimplePanel(panellist), 2 ))
panellist:AddItem(CreateColorModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateParamModifiers( data, SimplePanel(panellist) ))
2014-10-02 08:49:54 +08:00
return panellist
2014-10-02 08:49:54 +08:00
end
--[[** Model panel for adjusting models ***
2014-10-02 08:49:54 +08:00
Name:
Model:
Bone name:
Translation x / y / z
Rotation pitch / yaw / role
Size
]]
2014-10-02 08:49:54 +08:00
local function CreateQuadPanel( name, preset_data )
2014-10-02 08:49:54 +08:00
local data = wep.v_models[name]
if (!preset_data) then preset_data = {} end
-- default data
2014-10-02 08:49:54 +08:00
data.type = preset_data.type or "Quad"
data.model = preset_data.model or ""
data.bone = preset_data.bone or ""
data.rel = preset_data.rel or ""
data.pos = preset_data.pos or Vector(0,0,0)
data.angle = preset_data.angle or Angle(0,0,0)
data.size = preset_data.size or 0.05
wep.vRenderOrder = nil -- force viewmodel render order to recache
2014-10-02 08:49:54 +08:00
local panellist = vgui.Create("DPanelList", pmodels )
panellist:SetPaintBackground( true )
panellist.Paint = function() surface.SetDrawColor( 90, 90, 90, 255 ) surface.DrawRect( 0, 0, panellist:GetWide(), panellist:GetTall() ) end
panellist:EnableVerticalScrollbar( true )
panellist:SetSpacing(5)
panellist:SetPadding(5)
panellist:DockMargin(0,0,0,5)
panellist:Dock(FILL)
2014-10-02 08:49:54 +08:00
PanelBackgroundReset()
2014-10-02 08:49:54 +08:00
panellist:AddItem(CreateNameLabel( name, SimplePanel(panellist) ))
panellist:AddItem(CreateBoneModifier( data, SimplePanel(panellist), LocalPlayer():GetViewModel() ))
panellist:AddItem(CreateVRelativeModifier( name, data, SimplePanel(panellist) ))
panellist:AddItem(CreatePositionModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateAngleModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSizeModifiers( data, SimplePanel(panellist), 1 ))
2014-10-02 08:49:54 +08:00
return panellist
2014-10-02 08:49:54 +08:00
end
-- adding button DoClick
2014-10-02 08:49:54 +08:00
mnbtn.DoClick = function()
local new = string.Trim( mntext:GetValue() )
if (new) then
if (new == "") then CreateNote("Empty name field!") return end
if (wep.v_models[new] != nil) then CreateNote("Name already exists!") return end
wep.v_models[new] = {}
2014-10-02 08:49:54 +08:00
if (!wep.v_panelCache[new]) then
if (boxselected == "Model") then
wep.v_panelCache[new] = CreateModelPanel( new )
elseif (boxselected == "Sprite") then
wep.v_panelCache[new] = CreateSpritePanel( new )
elseif (boxselected == "Quad") then
wep.v_panelCache[new] = CreateQuadPanel( new )
else
Error("wtf are u doing")
end
end
2014-10-02 08:49:54 +08:00
wep.v_panelCache[new]:SetVisible(false)
2014-10-02 08:49:54 +08:00
table.insert(v_relelements, new)
UpdateRelBoxes("v")
2014-10-02 08:49:54 +08:00
mlist:AddLine(new,boxselected)
end
end
for k, v in pairs( wep.save_data.v_models ) do
wep.v_models[k] = {}
if (v.type == "Model") then
wep.v_panelCache[k] = CreateModelPanel( k, v )
elseif (v.type == "Sprite") then
wep.v_panelCache[k] = CreateSpritePanel( k, v )
elseif (v.type == "Quad") then
wep.v_panelCache[k] = CreateQuadPanel( k, v )
end
wep.v_panelCache[k]:SetVisible(false)
2014-10-02 08:49:54 +08:00
table.insert(v_relelements, k)
mlist:AddLine(k,v.type)
end
UpdateRelBoxes("v")
-- remove a line
2014-10-02 08:49:54 +08:00
rmbtn.DoClick = function()
local line = mlist:GetSelectedLine()
if (line) then
local name = mlist:GetLine(line):GetValue(1)
wep.v_models[name] = nil
-- clear from panel cache
if (wep.v_panelCache[name]) then
2014-10-02 08:49:54 +08:00
wep.v_panelCache[name]:Remove()
wep.v_panelCache[name] = nil
2014-10-02 08:49:54 +08:00
table.RemoveByValue( v_relelements, name )
RemoveRelBox( "v", name )
UpdateRelBoxes( "v" )
end
mlist:RemoveLine(line)
end
end
-- duplicate line
2014-10-02 08:49:54 +08:00
copybtn.DoClick = function()
local line = mlist:GetSelectedLine()
if (line) then
local name = mlist:GetLine(line):GetValue(1)
local to_copy = wep.v_models[name]
local new_preset = table.Copy(to_copy)
-- quickly generate a new unique name
2014-10-02 08:49:54 +08:00
while(wep.v_models[name]) do
name = name.."+"
end
-- have to fix every sub-table as well because table.Copy copies references
2014-10-02 08:49:54 +08:00
new_preset.pos = Vector(to_copy.pos.x, to_copy.pos.y, to_copy.pos.z)
if (to_copy.angle) then
new_preset.angle = Angle(to_copy.angle.p, to_copy.angle.y, to_copy.angle.r)
end
if (to_copy.color) then
new_preset.color = Color(to_copy.color.r,to_copy.color.g,to_copy.color.b,to_copy.color.a)
end
if (type(to_copy.size) == "table") then
new_preset.size = table.Copy(to_copy.size)
elseif (type(to_copy.size) == "Vector") then
new_preset.size = Vector(to_copy.size.x, to_copy.size.y, to_copy.size.z)
end
if (to_copy.bodygroup) then
new_preset.bodygroup = table.Copy(to_copy.bodygroup)
end
2014-10-02 08:49:54 +08:00
wep.v_models[name] = {}
2014-10-02 08:49:54 +08:00
if (new_preset.type == "Model") then
wep.v_panelCache[name] = CreateModelPanel( name, new_preset )
elseif (new_preset.type == "Sprite") then
wep.v_panelCache[name] = CreateSpritePanel( name, new_preset )
elseif (new_preset.type == "Quad") then
wep.v_panelCache[name] = CreateQuadPanel( name, new_preset )
end
2014-10-02 08:49:54 +08:00
wep.v_panelCache[name]:SetVisible(false)
2014-10-02 08:49:54 +08:00
table.insert(v_relelements, name)
UpdateRelBoxes("v")
2014-10-02 08:49:54 +08:00
mlist:AddLine(name,new_preset.type)
end
end
--[[--------------------------------------------------------------
2014-10-02 08:49:54 +08:00
World Models
------------------------------------------------------------/]]
2014-10-02 08:49:54 +08:00
local lastVisible = ""
local mlabel = vgui.Create( "DLabel", pwmodels )
mlabel:SetTall( 20 )
mlabel:SetText( "New worldmodel element:" )
mlabel:Dock(TOP)
local function CreateWNote( text )
local templabel = vgui.Create( "DLabel" )
templabel:SetText( text )
templabel:SizeToContents()
local x, y = mlabel:GetPos()
local notif = vgui.Create( "DNotify" , pwmodels )
notif:SetPos( x + 160, y )
notif:SetSize( templabel:GetWide(), 20 )
notif:SetLife( 5 )
notif:AddItem(templabel)
end
local pnewelement = SimplePanel( pwmodels )
pnewelement:SetTall(20)
local mnwtext = vgui.Create("DTextEntry", pnewelement )
mnwtext:SetTall( 20 )
mnwtext:SetMultiline(false)
mnwtext:SetText( "element_name" )
mnwtext:Dock(FILL)
2014-10-02 08:49:54 +08:00
local mnwbtn = vgui.Create( "DButton", pnewelement )
mnwbtn:SetSize( 50, 20 )
mnwbtn:SetText( "Add" )
mnwbtn:DockMargin(5,0,0,0)
mnwbtn:Dock(RIGHT)
2014-10-02 08:49:54 +08:00
local tpbox = vgui.Create( "DComboBox", pnewelement )
tpbox:SetSize( 100, 20 )
tpbox:SetText( "Model" )
tpbox:AddChoice( "Model" )
tpbox:AddChoice( "Sprite" )
tpbox:AddChoice( "Quad" )
local wboxselected = "Model"
tpbox.OnSelect = function( p, index, value )
wboxselected = value
end
tpbox:DockMargin(5,0,0,0)
tpbox:Dock(RIGHT)
pnewelement:DockMargin(0,5,0,5)
pnewelement:Dock(TOP)
local mwlist = vgui.Create( "DListView", pwmodels)
wep.w_modelListing = mwlist
2014-10-02 08:49:54 +08:00
mwlist:SetTall( 160 )
mwlist:SetMultiSelect(false)
mwlist:SetDrawBackground(true)
mwlist:AddColumn("Name")
mwlist:AddColumn("Type")
-- cache the created panels
2014-10-02 08:49:54 +08:00
mwlist.OnRowSelected = function( panel, line )
local name = mwlist:GetLine(line):GetValue(1)
2014-10-02 08:49:54 +08:00
if (wep.w_panelCache[lastVisible]) then
wep.w_panelCache[lastVisible]:SetVisible(false)
end
wep.w_panelCache[name]:SetVisible(true)
2014-10-02 08:49:54 +08:00
lastVisible = name
end
mwlist:Dock(TOP)
local pwbuttons = SimplePanel( pwmodels )
local rmbtn = vgui.Create( "DButton", pwbuttons )
rmbtn:SetSize( 140, 25 )
rmbtn:SetText( "Remove selected" )
rmbtn:Dock(LEFT)
2014-10-02 08:49:54 +08:00
local copybtn = vgui.Create( "DButton", pwbuttons )
copybtn:SetSize( 140, 25 )
copybtn:SetText( "Copy selected" )
copybtn:Dock(RIGHT)
2014-10-02 08:49:54 +08:00
local importbtn = vgui.Create( "DButton", pwbuttons )
importbtn:SetTall( 25 )
importbtn:SetText( "Import viewmodels" )
importbtn:Dock(FILL)
pwbuttons:DockMargin(0,5,0,5)
pwbuttons:Dock(TOP)
-- Print buttons
2014-10-02 08:49:54 +08:00
local pctbtn = vgui.Create( "DButton", pwmodels)
pctbtn:SetTall( 30 )
pctbtn:SetText("Copy world model table to clipboard")
pctbtn.DoClick = function()
SetClipboardText(GetWModelsText())
LocalPlayer():ChatPrint("Code copied to clipboard!")
end
pctbtn:DockMargin(0,5,0,0)
pctbtn:Dock(BOTTOM)
local prtbtn = vgui.Create( "DButton", pwmodels)
prtbtn:SetTall( 30 )
prtbtn:SetText("Print world model table to console")
prtbtn.DoClick = function()
MsgN("*********************************************")
for k, v in pairs(string.Explode("\n",GetWModelsText())) do
MsgN(v)
end
MsgN("*********************************************")
LocalPlayer():ChatPrint("Code printed to console!")
end
prtbtn:Dock(BOTTOM)
--[[** Model panel for adjusting models ***
2014-10-02 08:49:54 +08:00
Name:
Model:
Translation x / y / z
Rotation pitch / yaw / role
Model size x / y / z
Material
Color modulation
]]
2014-10-02 08:49:54 +08:00
local function CreateWorldModelPanel( name, preset_data )
2014-10-02 08:49:54 +08:00
local data = wep.w_models[name]
if (!preset_data) then preset_data = {} end
-- default data
2014-10-02 08:49:54 +08:00
data.type = preset_data.type or "Model"
data.model = preset_data.model or ""
data.bone = preset_data.bone or "ValveBiped.Bip01_R_Hand"
data.rel = preset_data.rel or ""
data.pos = preset_data.pos or Vector(0,0,0)
data.angle = preset_data.angle or Angle(0,0,0)
data.size = preset_data.size or Vector(0.5,0.5,0.5)
data.color = preset_data.color or Color(255,255,255,255)
data.surpresslightning = preset_data.surpresslightning or false
data.material = preset_data.material or ""
data.bodygroup = preset_data.bodygroup or {}
data.skin = preset_data.skin or 0
2014-10-02 08:49:54 +08:00
wep.wRenderOrder = nil
2014-10-02 08:49:54 +08:00
local panellist = vgui.Create("DPanelList", pwmodels )
panellist:SetPaintBackground( true )
panellist.Paint = function() surface.SetDrawColor( 90, 90, 90, 255 ) surface.DrawRect( 0, 0, panellist:GetWide(), panellist:GetTall() ) end
panellist:EnableVerticalScrollbar( true )
panellist:SetSpacing(5)
panellist:SetPadding(5)
panellist:DockMargin(0,0,0,5)
panellist:Dock(FILL)
2014-10-02 08:49:54 +08:00
PanelBackgroundReset()
2014-10-02 08:49:54 +08:00
panellist:AddItem(CreateNameLabel( name, SimplePanel(panellist) ))
panellist:AddItem(CreateModelModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateBoneModifier( data, SimplePanel(panellist), LocalPlayer() ))
panellist:AddItem(CreateWRelativeModifier( name, data, SimplePanel(panellist) ))
panellist:AddItem(CreatePositionModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateAngleModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSizeModifiers( data, SimplePanel(panellist), 3 ))
panellist:AddItem(CreateColorModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSLightningModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateMaterialModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateBodygroupSkinModifier( data, SimplePanel(panellist) ))
2014-10-02 08:49:54 +08:00
return panellist
2014-10-02 08:49:54 +08:00
end
--[[** Sprite panel for adjusting sprites ***
2014-10-02 08:49:54 +08:00
Name:
Sprite:
Translation x / y / z
Sprite x / y size
Color
]]
2014-10-02 08:49:54 +08:00
local function CreateWorldSpritePanel( name, preset_data )
2014-10-02 08:49:54 +08:00
local data = wep.w_models[name]
if (!preset_data) then preset_data = {} end
-- default data
2014-10-02 08:49:54 +08:00
data.type = preset_data.type or "Sprite"
data.sprite = preset_data.sprite or ""
data.bone = preset_data.bone or "ValveBiped.Bip01_R_Hand"
data.rel = preset_data.rel or ""
data.pos = preset_data.pos or Vector(0,0,0)
data.size = preset_data.size or { x = 1, y = 1 }
data.color = preset_data.color or Color(255,255,255,255)
data.nocull = preset_data.nocull or true
data.additive = preset_data.additive or true
data.vertexalpha = preset_data.vertexalpha or true
data.vertexcolor = preset_data.vertexcolor or true
data.ignorez = preset_data.ignorez or false
2014-10-02 08:49:54 +08:00
wep.wRenderOrder = nil
2014-10-02 08:49:54 +08:00
local panellist = vgui.Create("DPanelList", pwmodels )
panellist:SetPaintBackground( true )
panellist.Paint = function() surface.SetDrawColor( 90, 90, 90, 255 ) surface.DrawRect( 0, 0, panellist:GetWide(), panellist:GetTall() ) end
panellist:EnableVerticalScrollbar( true )
panellist:SetSpacing(5)
panellist:SetPadding(5)
panellist:DockMargin(0,0,0,5)
panellist:Dock(FILL)
2014-10-02 08:49:54 +08:00
PanelBackgroundReset()
2014-10-02 08:49:54 +08:00
panellist:AddItem(CreateNameLabel( name, SimplePanel(panellist) ))
panellist:AddItem(CreateSpriteModifier( data, SimplePanel(panellist) ))
panellist:AddItem(CreateBoneModifier( data, SimplePanel(panellist), LocalPlayer() ))
panellist:AddItem(CreateWRelativeModifier( name, data, SimplePanel(panellist) ))
panellist:AddItem(CreatePositionModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSizeModifiers( data, SimplePanel(panellist), 2 ))
panellist:AddItem(CreateColorModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateParamModifiers( data, SimplePanel(panellist) ))
2014-10-02 08:49:54 +08:00
return panellist
2014-10-02 08:49:54 +08:00
end
--[[** Model panel for adjusting models ***
2014-10-02 08:49:54 +08:00
Name:
Model:
Bone name:
Translation x / y / z
Rotation pitch / yaw / role
Size
]]
2014-10-02 08:49:54 +08:00
local function CreateWorldQuadPanel( name, preset_data )
2014-10-02 08:49:54 +08:00
local data = wep.w_models[name]
if (!preset_data) then preset_data = {} end
-- default data
2014-10-02 08:49:54 +08:00
data.type = preset_data.type or "Quad"
data.model = preset_data.model or ""
data.bone = preset_data.bone or "ValveBiped.Bip01_R_Hand"
data.rel = preset_data.rel or ""
data.pos = preset_data.pos or Vector(0,0,0)
data.angle = preset_data.angle or Angle(0,0,0)
data.size = preset_data.size or 0.05
wep.vRenderOrder = nil -- force viewmodel render order to recache
2014-10-02 08:49:54 +08:00
local panellist = vgui.Create("DPanelList", pwmodels )
panellist:SetPaintBackground( true )
panellist.Paint = function() surface.SetDrawColor( 90, 90, 90, 255 ) surface.DrawRect( 0, 0, panellist:GetWide(), panellist:GetTall() ) end
panellist:EnableVerticalScrollbar( true )
panellist:SetSpacing(5)
panellist:SetPadding(5)
panellist:DockMargin(0,0,0,5)
panellist:Dock(FILL)
2014-10-02 08:49:54 +08:00
PanelBackgroundReset()
2014-10-02 08:49:54 +08:00
panellist:AddItem(CreateNameLabel( name, SimplePanel(panellist) ))
panellist:AddItem(CreateBoneModifier( data, SimplePanel(panellist), LocalPlayer() ))
panellist:AddItem(CreateWRelativeModifier( name, data, SimplePanel(panellist) ))
panellist:AddItem(CreatePositionModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateAngleModifiers( data, SimplePanel(panellist) ))
panellist:AddItem(CreateSizeModifiers( data, SimplePanel(panellist), 1 ))
2014-10-02 08:49:54 +08:00
return panellist
2014-10-02 08:49:54 +08:00
end
-- adding button DoClick
2014-10-02 08:49:54 +08:00
mnwbtn.DoClick = function()
local new = string.Trim( mnwtext:GetValue() )
if (new) then
if (new == "") then CreateWNote("Empty name field!") return end
if (wep.w_models[new] != nil) then CreateWNote("Name already exists!") return end
wep.w_models[new] = {}
2014-10-02 08:49:54 +08:00
if (!wep.w_panelCache[new]) then
if (wboxselected == "Model") then
wep.w_panelCache[new] = CreateWorldModelPanel( new )
elseif (wboxselected == "Sprite") then
wep.w_panelCache[new] = CreateWorldSpritePanel( new )
elseif (wboxselected == "Quad") then
wep.w_panelCache[new] = CreateWorldQuadPanel( new )
else
Error("wtf are u doing")
end
end
2014-10-02 08:49:54 +08:00
wep.w_panelCache[new]:SetVisible(false)
2014-10-02 08:49:54 +08:00
table.insert(w_relelements, new)
UpdateRelBoxes("w")
2014-10-02 08:49:54 +08:00
mwlist:AddLine(new,wboxselected)
end
end
for k, v in pairs( wep.save_data.w_models ) do
wep.w_models[k] = {}
-- backwards compatability
2014-10-02 08:49:54 +08:00
if (!v.bone or v.bone == "") then
v.bone = "ValveBiped.Bip01_R_Hand"
end
2014-10-02 08:49:54 +08:00
if (v.type == "Model") then
wep.w_panelCache[k] = CreateWorldModelPanel( k, v )
elseif (v.type == "Sprite") then
wep.w_panelCache[k] = CreateWorldSpritePanel( k, v )
elseif (v.type == "Quad") then
wep.w_panelCache[k] = CreateWorldQuadPanel( k, v )
end
2014-10-02 08:49:54 +08:00
wep.w_panelCache[k]:SetVisible(false)
table.insert(w_relelements, k)
2014-10-02 08:49:54 +08:00
mwlist:AddLine(k,v.type)
end
UpdateRelBoxes("w")
-- import viewmodels
2014-10-02 08:49:54 +08:00
importbtn.DoClick = function()
local num = 0
for k, v in pairs( wep.v_models ) do
local name = k
local i = 1
while(wep.w_models[name] != nil) do
name = k..""..i
i = i + 1
-- changing names might mess up the relative transitions of some stuff
-- but whatever.
2014-10-02 08:49:54 +08:00
end
2014-10-02 08:49:54 +08:00
local new_preset = table.Copy(v)
new_preset.bone = "ValveBiped.Bip01_R_Hand" -- switch to hand bone by default
--if (new_preset.rel and new_preset.rel != "") then
2014-10-02 08:49:54 +08:00
new_preset.pos = Vector(v.pos.x, v.pos.y, v.pos.z)
if (v.angle) then
new_preset.angle = Angle(v.angle.p, v.angle.y, v.angle.r)
end
--[[else
2014-10-02 08:49:54 +08:00
new_preset.pos = Vector(num*5,0,-10)
if (v.angle) then
new_preset.angle = Angle(0,0,0)
end
end]]
2014-10-02 08:49:54 +08:00
if (v.color) then
new_preset.color = Color(v.color.r,v.color.g,v.color.b,v.color.a)
end
if (type(v.size) == "table") then
new_preset.size = table.Copy(v.size)
elseif (type(v.size) == "Vector") then
new_preset.size = Vector(v.size.x, v.size.y, v.size.z)
end
if (v.bodygroup) then
new_preset.bodygroup = table.Copy(v.bodygroup)
end
2014-10-02 08:49:54 +08:00
wep.w_models[name] = {}
if (v.type == "Model") then
wep.w_panelCache[name] = CreateWorldModelPanel( name, new_preset )
elseif (v.type == "Sprite") then
wep.w_panelCache[name] = CreateWorldSpritePanel( name, new_preset )
elseif (v.type == "Quad") then
wep.w_panelCache[name] = CreateWorldQuadPanel( name, new_preset )
end
2014-10-02 08:49:54 +08:00
wep.w_panelCache[name]:SetVisible(false)
2014-10-02 08:49:54 +08:00
table.insert(w_relelements, name)
UpdateRelBoxes("w")
2014-10-02 08:49:54 +08:00
mwlist:AddLine(name,v.type)
2014-10-02 08:49:54 +08:00
num = num + 1
end
end
-- remove a line
2014-10-02 08:49:54 +08:00
rmbtn.DoClick = function()
local line = mwlist:GetSelectedLine()
if (line) then
local name = mwlist:GetLine(line):GetValue(1)
wep.w_models[name] = nil
-- clear from panel cache
if (wep.w_panelCache[name]) then
2014-10-02 08:49:54 +08:00
wep.w_panelCache[name]:Remove()
wep.w_panelCache[name] = nil
2014-10-02 08:49:54 +08:00
table.RemoveByValue( w_relelements, name )
RemoveRelBox( "w", name )
UpdateRelBoxes( "w" )
end
mwlist:RemoveLine(line)
end
end
-- duplicate line
2014-10-02 08:49:54 +08:00
copybtn.DoClick = function()
local line = mwlist:GetSelectedLine()
if (line) then
local name = mwlist:GetLine(line):GetValue(1)
local to_copy = wep.w_models[name]
local new_preset = table.Copy(to_copy)
-- quickly generate a new unique name
2014-10-02 08:49:54 +08:00
while(wep.w_models[name]) do
name = name.."+"
end
-- have to fix every sub-table as well because table.Copy copies references
2014-10-02 08:49:54 +08:00
new_preset.pos = Vector(to_copy.pos.x, to_copy.pos.y, to_copy.pos.z)
if (to_copy.angle) then
new_preset.angle = Angle(to_copy.angle.p, to_copy.angle.y, to_copy.angle.r)
end
if (to_copy.color) then
new_preset.color = Color(to_copy.color.r,to_copy.color.g,to_copy.color.b,to_copy.color.a)
end
if (type(to_copy.size) == "table") then
new_preset.size = table.Copy(to_copy.size)
elseif (type(to_copy.size) == "Vector") then
new_preset.size = Vector(to_copy.size.x, to_copy.size.y, to_copy.size.z)
end
if (to_copy.bodygroup) then
new_preset.bodygroup = table.Copy(to_copy.bodygroup)
end
2014-10-02 08:49:54 +08:00
wep.w_models[name] = {}
2014-10-02 08:49:54 +08:00
if (new_preset.type == "Model") then
wep.w_panelCache[name] = CreateWorldModelPanel( name, new_preset )
elseif (new_preset.type == "Sprite") then
wep.w_panelCache[name] = CreateWorldSpritePanel( name, new_preset )
elseif (new_preset.type == "Quad") then
wep.w_panelCache[name] = CreateWorldQuadPanel( name, new_preset )
end
2014-10-02 08:49:54 +08:00
wep.w_panelCache[name]:SetVisible(false)
2014-10-02 08:49:54 +08:00
table.insert(w_relelements, name)
UpdateRelBoxes("w")
2014-10-02 08:49:54 +08:00
mwlist:AddLine(name,new_preset.type)
end
end