Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if SERVER then
- AddCSLuaFile("shared.lua")
- end
- if CLIENT then
- SWEP.PrintName = "SWEP Construction Kit"
- SWEP.Author = "Clavus"
- SWEP.Contact = "clavus@clavusstudios.com"
- SWEP.Purpose = "Design SWEP ironsights and clientside models"
- SWEP.Instructions = "http://tinyurl.com/swepkit"
- SWEP.Slot = 5
- SWEP.SlotPos = 10
- SWEP.ViewModelFlip = false
- SWEP.DrawCrosshair = false
- SWEP.ShowViewModel = true
- SWEP.ShowWorldModel = true
- end
- SWEP.HoldType = "pistol"
- SWEP.HoldTypes = { "normal", "melee", "melee2", "fist",
- "knife", "smg", "ar2", "pistol", "rpg", "physgun",
- "grenade", "shotgun", "crossbow", "slam" }
- SWEP.Spawnable = true
- SWEP.AdminSpawnable = true
- SWEP.ViewModel = "models/weapons/v_pistol.mdl"
- SWEP.WorldModel = "models/weapons/w_pistol.mdl"
- SWEP.CurWorldModel = "models/weapons/w_pistol.mdl" // this is where shit gets hacky
- SWEP.ViewModelFOV = 70
- SWEP.BobScale = 0
- SWEP.SwayScale = 0
- SWEP.Primary.Automatic = false
- SWEP.IronsightTime = 0.2
- SWEP.IronSightsPos = Vector(0, 0, 0)
- SWEP.IronSightsAng = Vector(0, 0, 0)
- local sck_class = ""
- function SWEP:Initialize()
- self:SetWeaponHoldType(self.HoldType)
- self:SetIronSights( true )
- self:ResetIronSights()
- if CLIENT then
- self:CreateWeaponWorldModel()
- self:ClientInit()
- if (not file.IsDir("swep_construction_kit")) then
- file.CreateDir("swep_construction_kit")
- end
- end
- self.Dropped = false
- sck_class = self:GetClass()
- end
- function SWEP:Equip()
- self.Dropped = false
- end
- function SWEP:PrimaryAttack()
- self.Weapon:SetNextPrimaryFire(CurTime() + 0.2)
- if CLIENT then
- self:OpenMenu()
- end
- if SinglePlayer() then
- self.Owner:SendLua("LocalPlayer():GetActiveWeapon():OpenMenu()")
- end
- end
- function SWEP:SecondaryAttack()
- self.Weapon:SetNextSecondaryFire(CurTime() + 0.2)
- if CLIENT then
- self:OpenMenu()
- end
- if SinglePlayer() then
- self.Owner:SendLua("LocalPlayer():GetActiveWeapon():OpenMenu()")
- end
- end
- function SWEP:SetupDataTables()
- self:DTVar( "Bool", 0, "ironsights" )
- self:DTVar( "Bool", 1, "thirdperson" )
- end
- function SWEP:ToggleIronSights()
- self.dt.ironsights = !self.dt.ironsights
- end
- function SWEP:SetIronSights( b )
- self.dt.ironsights = b
- end
- function SWEP:GetIronSights()
- return self.dt.ironsights
- end
- function SWEP:ResetIronSights()
- RunConsoleCommand("_sp_ironsight_x", 0)
- RunConsoleCommand("_sp_ironsight_y", 0)
- RunConsoleCommand("_sp_ironsight_z", 0)
- RunConsoleCommand("_sp_ironsight_pitch", 0)
- RunConsoleCommand("_sp_ironsight_yaw", 0)
- RunConsoleCommand("_sp_ironsight_roll", 0)
- end
- function SWEP:ToggleThirdPerson()
- self.dt.thirdperson = !self.dt.thirdperson
- if (self.dt.thirdperson) then self.Owner:CrosshairDisable()
- else self.Owner:CrosshairEnable() end
- end
- function SWEP:SetThirdPerson( b )
- self.dt.thirdperson = b
- if (self.dt.thirdperson) then self.Owner:CrosshairDisable()
- else self.Owner:CrosshairEnable() end
- end
- function SWEP:GetThirdPerson()
- return self.dt.thirdperson
- end
- function SWEP:GetViewModelPosition(pos, ang)
- local bIron = self.dt.ironsights
- local fIronTime = self.fIronTime or 0
- if (not bIron and fIronTime < CurTime() - self.IronsightTime) then
- return pos, ang
- end
- self.IronSightsPos, self.IronSightsAng = self:GetIronSightCoordination()
- local Mul = 1.0
- if (fIronTime > CurTime() - self.IronsightTime) then
- Mul = math.Clamp((CurTime() - fIronTime) / self.IronsightTime, 0, 1)
- if not bIron then Mul = 1 - Mul end
- end
- local Offset = self.IronSightsPos
- if (self.IronSightsAng) then
- ang = ang * 1
- ang:RotateAroundAxis(ang:Right(), self.IronSightsAng.x * Mul)
- ang:RotateAroundAxis(ang:Up(), self.IronSightsAng.y * Mul)
- ang:RotateAroundAxis(ang:Forward(), self.IronSightsAng.z * Mul)
- end
- local Right = ang:Right()
- local Up = ang:Up()
- local Forward = ang:Forward()
- pos = pos + Offset.x * Right * Mul
- pos = pos + Offset.y * Forward * Mul
- pos = pos + Offset.z * Up * Mul
- return pos, ang
- end
- SWEP.ir_x = CreateConVar( "_sp_ironsight_x", 0.0 )
- SWEP.ir_y = CreateConVar( "_sp_ironsight_y", 0.0 )
- SWEP.ir_z = CreateConVar( "_sp_ironsight_z", 0.0 )
- SWEP.ir_p = CreateConVar( "_sp_ironsight_pitch", 0.0 )
- SWEP.ir_yw = CreateConVar( "_sp_ironsight_yaw", 0.0 )
- SWEP.ir_r = CreateConVar( "_sp_ironsight_roll", 0.0 )
- function SWEP:GetIronSightCoordination()
- local vec = Vector( self.ir_x:GetFloat(), self.ir_y:GetFloat(), self.ir_z:GetFloat() )
- local ang = Vector( self.ir_p:GetFloat(), self.ir_yw:GetFloat(), self.ir_r:GetFloat() )
- return vec, ang
- end
- function SWEP:GetHoldTypes()
- return self.HoldTypes
- end
- SWEP.LastOwner = nil
- /***************************
- Helper functions
- ***************************/
- SWEP.IsSCK = true
- local function GetSWEP( pl )
- local wep = pl:GetActiveWeapon()
- if (ValidEntity(wep) and wep.IsSCK) then
- return wep
- end
- //Error("Not holding SWEP Construction Kit!")
- return NULL
- end
- /***********************************************
- SERVER CODE YEEEEEAAAAAHHH
- ***********************************************/
- if SERVER then
- local function CanPickup( pl, wep )
- if (wep:GetClass() == sck_class) then
- return pl:KeyDown(IN_RELOAD) or !wep.Dropped
- end
- end
- hook.Add("PlayerCanPickupWeapon","SCKPickup",CanPickup)
- function SWEP:Deploy()
- self.LastOwner = self.Owner
- end
- function SWEP:OnDrop()
- if (ValidEntity(self.LastOwner)) then
- self.LastOwner:SendLua("Entity("..self:EntIndex().."):OnDropWeapon()")
- end
- self.LastOwner = nil
- end
- local function Cmd_SetHoldType( pl, cmd, args )
- local holdtype = args[1]
- local wep = GetSWEP( pl )
- if (ValidEntity(wep) and holdtype and table.HasValue( wep:GetHoldTypes(), holdtype )) then
- wep:SetWeaponHoldType( holdtype )
- wep.HoldType = holdtype
- end
- end
- concommand.Add("swepck_setholdtype", Cmd_SetHoldType)
- local function Cmd_ToggleThirdPerson( pl, cmd, args )
- local wep = GetSWEP( pl )
- if (ValidEntity(wep)) then
- wep:ToggleThirdPerson()
- end
- end
- concommand.Add("swepck_togglethirdperson", Cmd_ToggleThirdPerson)
- local function Cmd_PlayAnimation( pl, cmd, args )
- local wep = GetSWEP( pl )
- if (ValidEntity(wep)) then
- local anim = tonumber(args[1] or 0)
- wep:ResetSequenceInfo()
- wep:SendWeaponAnim( anim )
- end
- end
- concommand.Add("swepck_playanimation", Cmd_PlayAnimation)
- local function Cmd_ToggleSights( pl, cmd, args )
- local wep = GetSWEP( pl )
- if (ValidEntity(wep)) then
- wep:ToggleIronSights()
- end
- end
- concommand.Add("swepck_toggleironsights", Cmd_ToggleSights)
- local function Cmd_ViewModelFOV( pl, cmd, args )
- local wep = GetSWEP( pl )
- if (ValidEntity(wep)) then
- wep.ViewModelFOV = tonumber(args[1] or wep.ViewModelFOV)
- end
- end
- concommand.Add("swepck_viewmodelfov", Cmd_ViewModelFOV)
- local function Cmd_ViewModel( pl, cmd, args )
- local wep = GetSWEP( pl )
- if (!ValidEntity(wep)) then return end
- local newmod = args[1] or wep.ViewModel
- newmod = newmod..".mdl"
- if !file.Exists (newmod,true) then return end
- //util.PrecacheModel(newmod)
- wep.ViewModel = newmod
- pl:GetViewModel():SetWeaponModel(Model(newmod), wep)
- pl:SendLua([[LocalPlayer():GetActiveWeapon().ViewModel = "]]..newmod..[["]])
- //pl:SendLua([[LocalPlayer():GetViewModel():SetModel("]]..newmod..[[")]])
- pl:SendLua([[LocalPlayer():GetViewModel():SetWeaponModel(Model("]]..newmod..[["), Entity(]]..wep:EntIndex()..[[))]])
- local quickswitch = nil
- for k, v in pairs( pl:GetWeapons() ) do
- if (v:GetClass() != wep:GetClass()) then
- quickswitch = v:GetClass()
- break
- end
- end
- if (quickswitch) then
- pl:SelectWeapon( quickswitch )
- pl:SelectWeapon( wep:GetClass() )
- else
- pl:ChatPrint("Switch weapons to make the new viewmodel show up")
- end
- //print("Changed viewmodel to \""..wep.ViewModel.."\"")
- end
- concommand.Add("swepck_viewmodel", Cmd_ViewModel)
- local function Cmd_WorldModel( pl, cmd, args )
- local wep = GetSWEP( pl )
- if (!ValidEntity(wep)) then return end
- local newmod = args[1] or wep.CurWorldModel
- newmod = newmod..".mdl"
- if !file.Exists (newmod,true) then return end
- util.PrecacheModel(newmod)
- wep.CurWorldModel = newmod
- wep:SetModel(newmod)
- pl:SendLua([[LocalPlayer():GetActiveWeapon().CurWorldModel = "]]..newmod..[["]])
- pl:SendLua([[LocalPlayer():GetActiveWeapon():CreateWeaponWorldModel()]])
- //print("Changed worldmodel to \""..wep.CurWorldModel.."\"")
- end
- concommand.Add("swepck_worldmodel", Cmd_WorldModel)
- local function Cmd_DropWep( pl, cmd, args )
- local wep = GetSWEP( pl )
- if (ValidEntity(wep)) then
- wep.Dropped = true
- pl:DropWeapon(wep)
- end
- end
- concommand.Add("swepck_dropwep", Cmd_DropWep)
- end
- /***********************************************
- CLIENT CODE WHOOOOOOOOOOO
- ***********************************************/
- if CLIENT then
- surface.CreateFont("Arial", 12, 500, true, false, "12ptFont")
- surface.CreateFont("Arial", 24, 500, true, false, "24ptFont")
- local tutorialURL = "http://www.facepunch.com/threads/1032378-SWEP-Construction-Kit-developer-tool-for-modifying-viewmodels-ironsights/"
- SWEP.useThirdPerson = false
- SWEP.thirdPersonAngle = Angle(0,-90,0)
- SWEP.thirdPersonDis = 100
- SWEP.mlast_x = ScrW()/2
- SWEP.mlast_y = ScrH()/2
- local playerBones = { "ValveBiped.Bip01_Head1", "ValveBiped.Bip01_Spine",
- "ValveBiped.Anim_Attachment_RH", "ValveBiped.Bip01_R_Hand", "ValveBiped.Bip01_R_Forearm",
- "ValveBiped.Bip01_R_Foot", "ValveBiped.Bip01_R_Thigh", "ValveBiped.Bip01_R_Calf",
- "ValveBiped.Bip01_R_Shoulder", "ValveBiped.Bip01_R_Elbow",
- "ValveBiped.Anim_Attachment_LH", "ValveBiped.Bip01_L_Hand", "ValveBiped.Bip01_L_Forearm",
- "ValveBiped.Bip01_L_Foot", "ValveBiped.Bip01_L_Thigh", "ValveBiped.Bip01_L_Calf",
- "ValveBiped.Bip01_L_Shoulder", "ValveBiped.Bip01_L_Elbow" }
- SWEP.v_models = {}
- SWEP.v_panelCache = {}
- SWEP.v_modelListing = nil
- SWEP.v_bonemods = {}
- SWEP.v_modelbonebox = nil
- SWEP.w_models = {}
- SWEP.w_panelCache = {}
- SWEP.w_modelListing = nil
- SWEP.world_model = nil
- SWEP.cur_wmodel = nil
- SWEP.browser_callback = nil
- SWEP.modelbrowser = nil
- SWEP.modelbrowser_list = nil
- SWEP.matbrowser = nil
- SWEP.matbrowser_list = nil
- SWEP.save_data = {}
- local save_data_template = {
- ViewModel = SWEP.ViewModel,
- CurWorldModel = SWEP.CurWorldModel,
- w_models = {},
- v_models = {},
- v_bonemods = {},
- ViewModelFOV = SWEP.ViewModelFOV,
- HoldType = SWEP.HoldType,
- ViewModelFlip = SWEP.ViewModelFlip,
- IronSightsEnabled = true,
- IronSightsPos = SWEP.IronSightsPos,
- IronSightsAng = SWEP.IronSightsAng,
- ShowViewModel = true,
- ShowWorldModel = true
- }
- SWEP.ir_drag = {
- x = { true, "-x", 25 },
- y = { false, "y", 25 },
- z = { true, "y", 25 },
- pitch = { false, "y", 10 },
- yaw = { false, "x", 10 },
- roll = { false, "y", 10 }
- }
- local drag_modes = {
- ["x / z"] = { "x", "z" },
- ["y"] = { "y" },
- ["pitch / yaw"] = { "pitch", "yaw" },
- ["roll"] = { "roll" }
- }
- SWEP.cur_drag_mode = "x / z"
- SWEP.Frame = nil
- local function PrintVec( vec )
- local px, py, pz = math.floor(vec.x*1000)/1000,math.floor(vec.y*1000)/1000,math.floor(vec.z*1000)/1000
- return "Vector("..px..", "..py..", "..pz..")"
- end
- local function PrintAngle( angle )
- local pp, py, pr = math.floor(angle.p*1000)/1000,math.floor(angle.y*1000)/1000,math.floor(angle.r*1000)/1000
- return "Angle("..pp..", "..py..", "..pr..")"
- end
- local function PrintColor( col )
- return "Color("..col.r..", "..col.g..", "..col.b..", "..col.a..")"
- end
- function SWEP:ClientInit()
- // init view model bone build function
- self.BuildViewModelBones = function( s )
- if LocalPlayer():GetActiveWeapon() == self and self.v_bonemods then
- for k, v in pairs( self.v_bonemods ) do
- local bone = s:LookupBone(k)
- if (!bone) then continue end
- local m = s:GetBoneMatrix(bone)
- if (!m) then continue end
- m:Scale(v.scale)
- m:Rotate(v.angle)
- m:Translate(v.pos)
- s:SetBoneMatrix(bone, m)
- end
- end
- end
- end
- // Populates a DMultiChoice with all the bones of the specified entity
- // returns if it has a first option
- local function PopulateBoneList( choicelist, ent )
- if (!ValidEntity(choicelist)) then return false end
- if (!ValidEntity(ent)) then return end
- if (ent == LocalPlayer()) then
- // if the local player is in third person, his bone lookup is all messed up so
- // we just use the predefined playerBones table
- for k, v in pairs(playerBones) do
- choicelist:AddChoice(v)
- end
- return true
- else
- local hasfirstoption
- for i = 0, ent:GetBoneCount() - 1 do
- local name = ent:GetBoneName(i)
- if (ent:LookupBone(name)) then // filter out invalid bones
- choicelist:AddChoice(name)
- if (!firstoption) then hasfirstoption = true end
- end
- end
- return hasfirstoption
- end
- end
- local function GetWeaponPrintText( wep )
- str = ""
- str = str.."SWEP.HoldType = \""..wep.HoldType.."\"\n"
- str = str.."SWEP.ViewModelFOV = "..wep.ViewModelFOV.."\n"
- str = str.."SWEP.ViewModelFlip = "..tostring(wep.ViewModelFlip).."\n"
- str = str.."SWEP.ViewModel = \""..wep.ViewModel.."\"\n"
- str = str.."SWEP.WorldModel = \""..wep.CurWorldModel.."\"\n"
- str = str.."SWEP.ShowViewModel = "..tostring(wep.ShowViewModel).."\n"
- str = str.."SWEP.ShowWorldModel = "..tostring(wep.ShowWorldModel).."\n"
- str = str.."SWEP.ViewModelBoneMods = {"
- local i = 0
- local num = table.Count( wep.v_bonemods )
- for k, v in pairs( wep.v_bonemods ) do
- if !(v.scale == Vector(1,1,1) and v.pos == Vector(0,0,0) and v.angle == Angle(0,0,0)) then
- if (i == 0) then str = str.."\n" end
- i = i + 1
- str = str.."\t[\""..k.."\"] = { scale = "..PrintVec( v.scale )..", pos = "..PrintVec( v.pos )..", angle = "..PrintAngle( v.angle ).." }"
- if (i < num) then str = str.."," end
- str = str.."\n"
- end
- end
- str = str.."}"
- str = string.Replace(str,",\n}","\n}") // remove the last comma
- return str
- end
- local function GetIronSightPrintText( vec, ang )
- return "SWEP.IronSightsPos = "..PrintVec( vec ).."\nSWEP.IronSightsAng = "..PrintVec( ang )
- end
- local function GetVModelsText()
- local wep = GetSWEP( LocalPlayer() )
- if (!ValidEntity(wep)) then return "" end
- local str = ("SWEP.VElements = {\n")
- local i = 0
- local num = table.Count(wep.v_models)
- for k, v in pairs( wep.v_models ) do
- 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
- 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 = GetSWEP( LocalPlayer() )
- if (!ValidEntity(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
- 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
- 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 ClearViewModels()
- local wep = GetSWEP( LocalPlayer() )
- wep.v_models = {}
- if (wep.v_modelListing) then wep.v_modelListing:Clear() end
- for k, v in pairs( wep.v_panelCache ) do
- if (v) then
- v:Remove()
- end
- end
- wep.v_panelCache = {}
- end
- local function RefreshViewModelBoneMods()
- local wep = GetSWEP( LocalPlayer() )
- if (!ValidEntity(wep)) then return end
- if (!ValidEntity(wep.v_modelbonebox)) then return end
- wep.v_bonemods = {}
- wep.v_modelbonebox:Clear()
- timer.Destroy("repop")
- timer.Create("repop", 1, 1, function()
- local option = PopulateBoneList( wep.v_modelbonebox, LocalPlayer():GetViewModel() )
- if (option) then
- wep.v_modelbonebox:ChooseOptionID(1)
- end
- end)
- end
- local function ClearWorldModels()
- local wep = GetSWEP( LocalPlayer() )
- if (!ValidEntity(wep)) then return end
- wep.w_models = {}
- if (wep.w_modelListing) then wep.w_modelListing:Clear() end
- for k, v in pairs( wep.w_panelCache ) do
- if (v) then
- v:Remove()
- end
- end
- wep.w_panelCache = {}
- end
- function SWEP:CreateWeaponWorldModel()
- local model = self.CurWorldModel
- if ((!self.world_model or (ValidEntity(self.world_model) and self.cur_wmodel != model)) and
- string.find(model, ".mdl") and file.Exists (model,true) ) then
- if ValidEntity(self.world_model) then self.world_model:Remove() end
- self.world_model = ClientsideModel(model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
- if (ValidEntity(self.world_model)) then
- self.world_model:SetParent(self.Owner)
- self.world_model:SetNoDraw(true)
- self.cur_wmodel = model
- if (self.world_model:LookupBone( "ValveBiped.Bip01_R_Hand" )) then
- self.world_model:AddEffects(EF_BONEMERGE)
- end
- else
- self.world_model = nil
- self.cur_wmodel = nil
- end
- end
- end
- function SWEP:CreateModels( tab )
- // Create the clientside models here because Garry says we can't do it in the render hook
- for k, v in pairs( tab ) do
- if (v.type == "Model" and v.model and v.model != "" and (!ValidEntity(v.modelEnt) or v.createdModel != v.model) and
- string.find(v.model, ".mdl") and file.Exists (v.model,true) ) then
- v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
- if (ValidEntity(v.modelEnt)) then
- v.modelEnt:SetPos(self:GetPos())
- v.modelEnt:SetAngles(self:GetAngles())
- v.modelEnt:SetParent(self)
- v.modelEnt:SetNoDraw(true)
- v.createdModel = v.model
- else
- v.modelEnt = nil
- end
- elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite) and file.Exists ("materials/"..v.sprite..".vmt",true)) then
- local name = v.sprite.."-"
- local params = { ["$basetexture"] = v.sprite }
- // make sure we create a unique name based on the selected options
- local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
- for i, j in pairs( tocheck ) do
- if (v[j]) then
- params["$"..j] = 1
- name = name.."1"
- else
- name = name.."0"
- end
- end
- v.createdSprite = v.sprite
- v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
- end
- end
- end
- function SWEP:Think()
- self:CreateModels( self.v_models )
- self:CreateModels( self.w_models )
- // Some hacky shit to get 3rd person view compatible with
- // other addons that override CalcView
- self:CalcViewHookManagement()
- /************************
- Camera fiddling
- ************************/
- self.useThirdPerson = self:GetThirdPerson()
- local mx, my = gui.MousePos()
- local diffx, diffy = (mx - self.mlast_x), (my - self.mlast_y)
- if (input.IsMouseDown(MOUSE_RIGHT) and !(diffx > 40 or diffy > 40) and self.Frame and self.Frame:IsVisible()) then // right mouse press without sudden jumps
- if (self.useThirdPerson) then
- if (input.IsKeyDown(KEY_E)) then
- self.thirdPersonDis = math.Clamp( self.thirdPersonDis + diffy, 10, 500 )
- else
- self.thirdPersonAngle = self.thirdPersonAngle + Angle( diffy/2, diffx/2, 0 )
- end
- else
- // ironsight adjustment
- for k, v in pairs( self.ir_drag ) do
- if (v[1]) then
- local temp = GetConVar( "_sp_ironsight_"..k ):GetFloat()
- if (v[2] == "x") then
- local add = -(diffx/v[3])
- if (self.ViewModelFlip) then add = add*-1 end
- RunConsoleCommand( "_sp_ironsight_"..k, temp + add )
- elseif (v[2] == "-x") then
- local add = diffx/v[3]
- if (self.ViewModelFlip) then add = add*-1 end
- RunConsoleCommand( "_sp_ironsight_"..k, temp + add )
- elseif (v[2] == "y") then
- RunConsoleCommand( "_sp_ironsight_"..k, temp - diffy/v[3] )
- end
- end
- end
- end
- end
- self.mlast_x, self.mlast_y = mx, my
- end
- function SWEP:RemoveModels()
- for k, v in pairs( self.v_models ) do
- if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
- end
- for k, v in pairs( self.w_models ) do
- if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
- end
- self.v_models = {}
- self.w_models = {}
- if (ValidEntity(self.world_model)) then
- self.world_model:Remove()
- self.world_model = nil
- self.cur_wmodel = nil
- end
- end
- function SWEP:GetBoneOrientation( basetab, name, ent, bone_override, buildup )
- local bone, pos, ang
- local tab = basetab[name]
- if (tab.rel and tab.rel != "") then
- local v = basetab[tab.rel]
- if (!v) then return end
- if (!buildup) then
- buildup = {}
- end
- table.insert(buildup, name)
- if (table.HasValue(buildup, tab.rel)) then return end
- // Technically, if there exists an element with the same name as a bone
- // you can get in an infinite loop. Let's just hope nobody's that stupid.
- pos, ang = self:GetBoneOrientation( basetab, tab.rel, ent, nil, buildup )
- if (!pos) then return end
- pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- else
- bone = ent:LookupBone(bone_override or tab.bone)
- if (!bone) then return end
- pos, ang = Vector(0,0,0), Angle(0,0,0)
- local m = ent:GetBoneMatrix(bone)
- if (m) then
- pos, ang = m:GetTranslation(), m:GetAngle()
- end
- if (ValidEntity(self.Owner) and self.Owner:IsPlayer() and
- ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
- ang.r = -ang.r // Fixes mirrored models
- end
- end
- return pos, ang
- end
- /********************************
- All viewmodel drawing magic
- *********************************/
- SWEP.vRenderOrder = nil
- function SWEP:ViewModelDrawn()
- local vm = self.Owner:GetViewModel()
- if !ValidEntity(vm) then return end
- if vm.BuildBonePositions ~= self.BuildViewModelBones then
- vm.BuildBonePositions = self.BuildViewModelBones
- end
- if (!self.vRenderOrder) then
- // we build a render order because sprites need to be drawn after models
- self.vRenderOrder = {}
- for k, v in pairs( self.v_models ) do
- if (v.type == "Model") then
- table.insert(self.vRenderOrder, 1, k)
- elseif (v.type == "Sprite" or v.type == "Quad") then
- table.insert(self.vRenderOrder, k)
- end
- end
- end
- for k, name in ipairs( self.vRenderOrder ) do
- local v = self.v_models[name]
- if (!v) then self.vRenderOrder = nil break end
- local model = v.modelEnt
- local sprite = v.spriteMaterial
- if (!v.bone) then continue end
- local pos, ang = self:GetBoneOrientation( self.v_models, name, vm )
- if (!pos) then continue end
- if (v.type == "Model" and ValidEntity(model)) then
- model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- model:SetAngles(ang)
- model:SetModelScale(v.size)
- if (v.material == "") then
- model:SetMaterial("")
- elseif (model:GetMaterial() != v.material) then
- model:SetMaterial( v.material )
- end
- if (v.skin != model:GetSkin()) then
- model:SetSkin(v.skin)
- end
- for k, v in pairs( v.bodygroup ) do
- if (model:GetBodygroup(k) != v) then
- model:SetBodygroup(k, v)
- end
- end
- if (v.surpresslightning) then
- render.SuppressEngineLighting(true)
- end
- render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
- render.SetBlend(v.color.a/255)
- model:DrawModel()
- render.SetBlend(1)
- render.SetColorModulation(1, 1, 1)
- if (v.surpresslightning) then
- render.SuppressEngineLighting(false)
- end
- elseif (v.type == "Sprite" and sprite) then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- render.SetMaterial(sprite)
- render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
- elseif (v.type == "Quad") then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- cam.Start3D2D(drawpos, ang, v.size)
- draw.RoundedBox( 0, -20, -20, 40, 40, Color(200,0,0,100) )
- surface.SetDrawColor( 255, 255, 255, 100 )
- surface.DrawOutlinedRect( -20, -20, 40, 40 )
- draw.SimpleTextOutlined("12pt arial","12ptFont",0, -12, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
- draw.SimpleTextOutlined("40x40 box","12ptFont",0, 2, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
- surface.SetDrawColor( 0, 255, 0, 230 )
- surface.DrawLine( 0, 0, 0, 8 )
- surface.DrawLine( 0, 0, 8, 0 )
- cam.End3D2D()
- end
- end
- end
- /********************************
- All worldmodel drawing science
- *********************************/
- SWEP.wRenderOrder = nil
- function SWEP:DrawWorldModel()
- local wm = self.world_model
- if !ValidEntity(wm) then return end
- if (!self.wRenderOrder) then
- self.wRenderOrder = {}
- for k, v in pairs( self.w_models ) do
- if (v.type == "Model") then
- table.insert(self.wRenderOrder, 1, k)
- elseif (v.type == "Sprite" or v.type == "Quad") then
- table.insert(self.wRenderOrder, k)
- end
- end
- end
- local bone_ent
- if (ValidEntity(self.Owner)) then
- self:SetColor(255,255,255,255)
- wm:SetNoDraw(true)
- if (self.Owner:GetActiveWeapon() != self.Weapon) then return end
- wm:SetParent(self.Owner)
- if (self.ShowWorldModel) then
- wm:DrawModel()
- end
- bone_ent = self.Owner
- else
- // this only happens if the weapon is dropped, which shouldn't happen normally.
- self:SetColor(255,255,255,0)
- wm:SetNoDraw(false) // else DrawWorldModel stops being called for some reason
- wm:SetParent(self)
- //wm:SetPos(opos)
- //wm:SetAngles(oang)
- if (self.ShowWorldModel) then
- wm:DrawModel()
- end
- // the reason that we don't always use this bone is because it lags 1 frame behind the player's right hand bone when held
- bone_ent = wm
- end
- /* BASE CODE FOR NEW SWEPS */
- /*self:DrawModel()
- if (ValidEntity(self.Owner)) then
- bone_ent = self.Owner
- else
- // when the weapon is dropped
- bone_ent = self
- end*/
- for k, name in pairs( self.wRenderOrder ) do
- local v = self.w_models[name]
- if (!v) then self.wRenderOrder = nil break end
- local pos, ang
- if (v.bone) then
- pos, ang = self:GetBoneOrientation( self.w_models, name, bone_ent )
- else
- pos, ang = self:GetBoneOrientation( self.w_models, name, bone_ent, "ValveBiped.Bip01_R_Hand" )
- end
- if (!pos) then continue end
- local model = v.modelEnt
- local sprite = v.spriteMaterial
- if (v.type == "Model" and ValidEntity(model)) then
- model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- model:SetAngles(ang)
- model:SetModelScale(v.size)
- if (v.material == "") then
- model:SetMaterial("")
- elseif (model:GetMaterial() != v.material) then
- model:SetMaterial( v.material )
- end
- if (v.skin != model:GetSkin()) then
- model:SetSkin(v.skin)
- end
- for k, v in pairs( v.bodygroup ) do
- if (model:GetBodygroup(k) != v) then
- model:SetBodygroup(k, v)
- end
- end
- if (v.surpresslightning) then
- render.SuppressEngineLighting(true)
- end
- render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
- render.SetBlend(v.color.a/255)
- model:DrawModel()
- render.SetBlend(1)
- render.SetColorModulation(1, 1, 1)
- if (v.surpresslightning) then
- render.SuppressEngineLighting(false)
- end
- elseif (v.type == "Sprite" and sprite) then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- render.SetMaterial(sprite)
- render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
- elseif (v.type == "Quad") then
- local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
- ang:RotateAroundAxis(ang:Up(), v.angle.y)
- ang:RotateAroundAxis(ang:Right(), v.angle.p)
- ang:RotateAroundAxis(ang:Forward(), v.angle.r)
- cam.Start3D2D(drawpos, ang, v.size)
- draw.RoundedBox( 0, -20, -20, 40, 40, Color(200,0,0,100) )
- surface.SetDrawColor( 255, 255, 255, 100 )
- surface.DrawOutlinedRect( -20, -20, 40, 40 )
- draw.SimpleTextOutlined("12pt arial","12ptFont",0, -12, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
- draw.SimpleTextOutlined("40x40 box","12ptFont",0, 2, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
- surface.SetDrawColor( 0, 255, 0, 230 )
- surface.DrawLine( 0, 0, 0, 8 )
- surface.DrawLine( 0, 0, 8, 0 )
- cam.End3D2D()
- end
- end
- end
- function SWEP:Holster()
- self.useThirdPerson = false
- return true
- end
- local function DrawDot( x, y )
- surface.SetDrawColor(100, 100, 100, 255)
- surface.DrawRect(x - 2, y - 2, 4, 4)
- surface.SetDrawColor(255, 255, 255, 255)
- surface.DrawRect(x - 1, y - 1, 2, 2)
- end
- function SWEP:DrawHUD()
- DrawDot( ScrW()/2, ScrH()/2 )
- DrawDot( ScrW()/2 + 10, ScrH()/2 )
- DrawDot( ScrW()/2 - 10, ScrH()/2 )
- DrawDot( ScrW()/2, ScrH()/2 + 10 )
- DrawDot( ScrW()/2, ScrH()/2 - 10 )
- if (self.Frame and self.Frame:IsVisible()) then
- local text = ""
- if (self.useThirdPerson) then
- text = "Hold right mouse and drag to rotate. Additionally hold E key to zoom."
- else
- text = "Hold right mouse and drag to adjust ironsights (mode: "..self.cur_drag_mode..")"
- end
- draw.SimpleTextOutlined(text, "default", ScrW()/2, ScrH()/4, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(20,20,20,255))
- end
- end
- /***************************
- Menu
- ***************************/
- local function CreateMenu( preset )
- local wep = GetSWEP( LocalPlayer() )
- if !ValidEntity(wep) then return nil end
- wep.save_data = table.Copy(save_data_template)
- if (preset) then
- // use the preset
- for k, v in pairs( preset ) do
- wep.save_data[k] = v
- end
- end
- /****** Create model browser *****/
- // callback = function( selected_model )
- local function OpenBrowser( current, browse_type, callback )
- wep.browser_callback = callback
- wep.Frame:SetVisible( false )
- if (browse_type == "model" and wep.modelbrowser) then
- wep.modelbrowser:SetVisible(true)
- wep.modelbrowser:MakePopup()
- wep.modelbrowser_list.OnRowSelected(nil,nil,current)
- return
- elseif (browse_type == "material" and wep.matbrowser) then
- wep.matbrowser:SetVisible(true)
- wep.matbrowser:MakePopup()
- wep.matbrowser_list.OnRowSelected(nil,nil,current)
- return
- end
- local browser = vgui.Create("DFrame")
- browser:SetSize( 300, 580 )
- browser:SetPos( ScrW()/4 - 150, ScrH()/2 - 250 )
- browser:SetDraggable( true )
- browser:ShowCloseButton( false )
- browser:SetSizable( false )
- browser:SetDeleteOnClose( false )
- if (browse_type == "model") then
- browser:SetTitle( "Model browser" )
- wep.modelbrowser = browser
- elseif (browse_type == "material") then
- browser:SetTitle( "Material browser" )
- wep.matbrowser = browser
- end
- local tree = vgui.Create( "DTree", browser )
- tree:SetPos( 5, 30 )
- tree:SetSize( browser:GetWide() - 10, browser:GetTall()-355 )
- local nodelist = {}
- local filecache = {}
- local checked = {}
- local modlist = vgui.Create("DListView", browser)
- modlist:SetPos( 5, browser:GetTall() - 320 )
- modlist:SetSize( browser:GetWide() - 10, 200 )
- modlist:SetMultiSelect(false)
- modlist:SetDrawBackground(true)
- if (browse_type == "model") then
- modlist:AddColumn("Model")
- elseif (browse_type == "material") then
- modlist:AddColumn("Material")
- end
- local modzoom = 32
- local modview
- if (browse_type == "model") then
- modview = vgui.Create("DModelPanel", browser)
- modview:SetModel("")
- modview:SetCamPos( Vector(modzoom,modzoom,modzoom/2) )
- modview:SetLookAt( Vector( 0, 0, 0 ) )
- elseif (browse_type == "material") then
- modview = vgui.Create("DImage", browser)
- modview:SetImage("")
- end
- modview:SetPos( 5, browser:GetTall() - 115)
- modview:SetSize(110,110)
- local mdlabel = vgui.Create("DLabel", browser)
- mdlabel:SetPos( 120, browser:GetTall() - 115 )
- mdlabel:SetSize( browser:GetWide() - 125, 20 )
- mdlabel:SetText( current )
- if (browse_type == "model") then
- local zoomslider = vgui.Create( "DNumSlider", browser)
- zoomslider:SetPos( 120, browser:GetTall() - 90 )
- zoomslider:SetWide( browser:GetWide() - 125 )
- zoomslider:SetText( "Zoom" )
- zoomslider:SetMin( 16 )
- zoomslider:SetMax( 256 )
- zoomslider:SetDecimals( 0 )
- zoomslider:SetValue( modzoom )
- zoomslider.OnValueChanged = function( panel, value )
- local modzoom = tonumber(value)
- modview:SetCamPos( Vector(modzoom,modzoom,modzoom/2) )
- end
- local areazm = zoomslider:GetTextArea()
- areazm.OnTextChanged = function() zoomslider:SetValue(areazm:GetValue()) end
- end
- local selected = ""
- modlist.OnRowSelected = function( panel, line, override )
- if (type(override) != "string") then override = nil end // for some reason the list itself throws a panel at it in the callback
- local path = override or modlist:GetLine(line):GetValue(1)
- if (browse_type == "model") then
- modview:SetModel(path)
- elseif (browse_type == "material") then
- if (path:sub( 1, 10 ) == "materials/") then
- path = path:sub( 11 ) // removes the "materials/" part
- end
- path = path:gsub( "%.vmt", "" )
- modview:SetImage(path)
- end
- mdlabel:SetText(path)
- selected = path
- end
- // set the default
- modlist.OnRowSelected(nil,nil,current)
- if (browse_type == "model") then
- wep.modelbrowser_list = modlist
- elseif (browse_type == "material") then
- wep.matbrowser_list = modlist
- end
- local choosebtn = vgui.Create("DButton", browser)
- choosebtn:SetPos( 120, browser:GetTall() - 40 )
- choosebtn:SetSize( browser:GetWide() - 125, 18 )
- if (browse_type == "model") then
- choosebtn:SetText("DO WANT THIS MODEL")
- elseif (browse_type == "material") then
- choosebtn:SetText("DO WANT THIS MATERIAL")
- end
- choosebtn.DoClick = function()
- if (wep.browser_callback) then
- pcall(wep.browser_callback, selected)
- end
- if (wep.Frame) then
- wep.Frame:SetVisible(true)
- end
- browser:Close()
- end
- local cancelbtn = vgui.Create("DButton", browser)
- cancelbtn:SetPos( 120, browser:GetTall() - 20 )
- cancelbtn:SetSize( browser:GetWide() - 125, 16 )
- cancelbtn:SetText("cancel")
- cancelbtn.DoClick = function()
- if (wep.Frame) then
- wep.Frame:SetVisible(true)
- end
- browser:Close()
- end
- local LoadDirectories
- local AddNode = function( base, dir, tree_override )
- local newpath = base.."/"..dir
- local basenode = nodelist[base]
- if (tree_override) then
- newpath = dir
- basenode = tree_override
- end
- if (!basenode) then
- print("No base node for \""..tostring(base).."\", \""..tostring(dir).."\", "..tostring(tree_override))
- end
- nodelist[newpath] = basenode:AddNode( dir )
- nodelist[newpath].DoClick = function()
- LoadDirectories( newpath )
- modlist:Clear()
- modlist:SetVisible(true)
- if (filecache[newpath]) then
- for k, f in pairs(filecache[newpath]) do
- modlist:AddLine(f)
- end
- else
- filecache[newpath] = {}
- local files
- if (newpath:sub(1,9) == "materials") then
- files = file.Find(newpath.."/*.vmt",true)
- else
- files = file.Find(newpath.."/*.mdl",true)
- end
- table.sort(files)
- for k, f in pairs(files) do
- local newfilepath = newpath.."/"..f
- modlist:AddLine(newfilepath)
- table.insert(filecache[newpath], newfilepath)
- end
- end
- end
- end
- if (browse_type == "model") then
- AddNode( "", "models", tree )
- elseif (browse_type == "material") then
- AddNode( "", "materials", tree )
- end
- LoadDirectories = function( v )
- if (table.HasValue(checked,v)) then return end
- newdirs = file.FindDir(v.."/*",true)
- table.insert(checked, v)
- table.sort(newdirs)
- for _, dir in pairs(newdirs) do
- AddNode( v, dir )
- end
- end
- if (browse_type == "model") then
- LoadDirectories( "models" )
- elseif (browse_type == "material") then
- LoadDirectories( "materials" )
- end
- browser:SetVisible( true )
- browser:MakePopup()
- end
- /****************************************/
- // Now for the actual menu:
- local f = vgui.Create("DFrame")
- f:SetSize( 300, 640 )
- f:SetPos( ScrW()/4 - 150, ScrH()/2 - 320 )
- f:SetTitle( "SWEP Construction Kit" )
- f:SetDraggable( true )
- f:ShowCloseButton( true )
- f:SetSizable( false )
- f:SetDeleteOnClose( false )
- local tbtn = vgui.Create( "DButton", f )
- tbtn:SetPos( 155, 2 )
- tbtn:SetSize( 120, 18 )
- tbtn:SetText( "Toggle thirdperson" )
- tbtn.DoClick = function()
- RunConsoleCommand("swepck_togglethirdperson")
- end
- local tab = vgui.Create( "DPropertySheet", f )
- tab:SetPos( 5, 30 )
- tab:SetSize( f:GetWide() - 10, f:GetTall()-35 )
- local ptool = vgui.Create("DPanel", tab)
- ptool.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,ptool:GetWide(),ptool:GetTall()) end
- local pweapon = vgui.Create("DPanel", tab)
- pweapon.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pweapon:GetWide(),pweapon:GetTall()) end
- local pironsight = vgui.Create("DPanel", tab)
- pironsight.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pironsight:GetWide(),pironsight:GetTall()) end
- local pmodels = vgui.Create("DPanel", tab)
- pmodels.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pmodels:GetWide(),pmodels:GetTall()) end
- local pwmodels = vgui.Create("DPanel", tab)
- pwmodels.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pwmodels:GetWide(),pwmodels:GetTall()) end
- tab:AddSheet( "Tool", ptool, "gui/silkicons/wrench", false, false, "Modify tool settings" )
- tab:AddSheet( "Weapon", pweapon, "gui/silkicons/bomb", false, false, "Modify weapon settings" )
- tab:AddSheet( "Ironsights", pironsight, "gui/silkicons/wrench", false, false, "Modify ironsights" )
- tab:AddSheet( "VModels", pmodels, "gui/silkicons/brick_add", false, false, "Modify view models" )
- tab:AddSheet( "WModels", pwmodels, "gui/silkicons/brick_add", false, false, "Modify world models" )
- /*****************
- Tool page
- *****************/
- local addy = 10
- // ***** Animations *****
- local alabel = vgui.Create( "DLabel", ptool )
- alabel:SetPos( 10, addy )
- alabel:SetSize( 240, 20 )
- alabel:SetText( "Play animation (buggy):" )
- addy = addy + 25
- local aabtn = vgui.Create( "DButton", ptool )
- aabtn:SetPos( 10, addy )
- aabtn:SetSize( 120, 18 )
- aabtn:SetText( "Primary Attack" )
- aabtn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_PRIMARYATTACK)
- wep:ResetSequenceInfo()
- wep:SendWeaponAnim(ACT_VM_PRIMARYATTACK)
- LocalPlayer():SetAnimation(PLAYER_ATTACK1)
- end
- local arbtn = vgui.Create( "DButton", ptool )
- arbtn:SetPos( 140, addy )
- arbtn:SetSize( 120, 18 )
- arbtn:SetText( "Reload" )
- arbtn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_RELOAD)
- wep:SendWeaponAnim(ACT_VM_RELOAD)
- LocalPlayer():SetAnimation(PLAYER_RELOAD)
- end
- addy = addy + 20
- local m1btn = vgui.Create( "DButton", ptool )
- m1btn:SetPos( 10, addy )
- m1btn:SetSize( 120, 18 )
- m1btn:SetText( "Melee 1" )
- m1btn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_MISSCENTER)
- wep:SendWeaponAnim(ACT_VM_MISSCENTER)
- LocalPlayer():SetAnimation(PLAYER_ATTACK1)
- end
- local m2btn = vgui.Create( "DButton", ptool )
- m2btn:SetPos( 140, addy )
- m2btn:SetSize( 120, 18 )
- m2btn:SetText( "Melee 2" )
- m2btn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_HITCENTER)
- wep:SendWeaponAnim(ACT_VM_HITCENTER)
- LocalPlayer():SetAnimation(PLAYER_ATTACK1)
- end
- addy = addy + 20
- local gcbtn = vgui.Create( "DButton", ptool )
- gcbtn:SetPos( 10, addy )
- gcbtn:SetSize( 120, 18 )
- gcbtn:SetText( "Grenade pull (CSS)" )
- gcbtn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_PULLPIN)
- wep:SendWeaponAnim(ACT_VM_PULLPIN)
- end
- local ghbtn = vgui.Create( "DButton", ptool )
- ghbtn:SetPos( 140, addy )
- ghbtn:SetSize( 120, 18 )
- ghbtn:SetText( "Grenade pull (HL2)" )
- ghbtn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_PULLBACK_HIGH)
- wep:SendWeaponAnim(ACT_VM_PULLBACK_HIGH)
- end
- addy = addy + 20
- local wdbtn = vgui.Create( "DButton", ptool )
- wdbtn:SetPos( 10, addy )
- wdbtn:SetSize( 120, 18 )
- wdbtn:SetText( "Draw" )
- wdbtn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_DRAW)
- wep:SendWeaponAnim(ACT_VM_DRAW)
- end
- local tgbtn = vgui.Create( "DButton", ptool )
- tgbtn:SetPos( 140, addy )
- tgbtn:SetSize( 120, 18 )
- tgbtn:SetText( "Throw grenade" )
- tgbtn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_THROW)
- wep:SendWeaponAnim(ACT_VM_THROW)
- LocalPlayer():SetAnimation(PLAYER_ATTACK1)
- end
- addy = addy + 20
- local idlbtn = vgui.Create( "DButton", ptool )
- idlbtn:SetPos( 10, addy )
- idlbtn:SetSize( 120, 18 )
- idlbtn:SetText( "Idle" )
- idlbtn.DoClick = function()
- RunConsoleCommand("swepck_playanimation", ACT_VM_IDLE)
- wep:SendWeaponAnim(ACT_VM_IDLE)
- end
- addy = addy + 45
- // ***** Settings saving / loading *****
- local note_x = 10
- local note_y = addy + 75
- local function CreateSettingsNote( text )
- local templabel = vgui.Create( "DLabel" )
- templabel:SetText( text )
- templabel:SetSize( 260, 20 )
- local notif = vgui.Create( "DNotify" , ptool )
- notif:SetPos( note_x, note_y )
- notif:SetSize( 260, 20 )
- notif:SetLife( 5 )
- notif:AddItem(templabel)
- end
- local selabel = vgui.Create( "DLabel", ptool )
- selabel:SetPos( 10, addy )
- selabel:SetSize( 200, 20 )
- selabel:SetText( "Configuration:" )
- addy = addy + 25
- local satext = vgui.Create( "DTextEntry", ptool)
- satext:SetPos( 95, addy )
- satext:SetSize( 170, 20 )
- satext:SetMultiline(false)
- satext:SetText( "save1" )
- local sabtn = vgui.Create( "DButton", ptool )
- sabtn:SetPos( 10, addy )
- sabtn:SetSize( 80, 20 )
- sabtn:SetText( "Save as:" )
- sabtn.DoClick = function()
- if !ValidEntity(wep) then return end
- local text = string.Trim(satext:GetValue())
- if (text == "") then return end
- local save_data = wep.save_data
- // collect all save data
- save_data.v_models = table.Copy(wep.v_models)
- save_data.w_models = table.Copy(wep.w_models)
- save_data.v_bonemods = table.Copy(wep.v_bonemods)
- // remove caches
- for k, v in pairs(save_data.v_models) do
- v.createdModel = nil
- v.createdSprite = nil
- end
- for k, v in pairs(save_data.w_models) do
- v.createdModel = nil
- v.createdSprite = nil
- end
- save_data.ViewModelFlip = wep.ViewModelFlip
- save_data.ViewModel = wep.ViewModel
- save_data.CurWorldModel = wep.CurWorldModel
- save_data.ViewModelFOV = wep.ViewModelFOV
- save_data.HoldType = wep.HoldType
- save_data.IronSightsEnabled = wep:GetIronSights()
- save_data.IronSightsPos, save_data.IronSightsAng = wep:GetIronSightCoordination()
- save_data.ShowViewModel = wep.ShowViewModel
- save_data.ShowWorldModel = wep.ShowWorldModel
- local filename = "swep_construction_kit/"..text..".txt"
- local succ, val = pcall(glon.encode, save_data)
- if (!succ) then LocalPlayer():ChatPrint("Failed to encode settings!") return end
- file.Write(filename, val)
- LocalPlayer():ChatPrint("Saved file \""..text.."\"!")
- end
- addy = addy + 25
- local lftext = vgui.Create( "DTextEntry", ptool)
- lftext:SetPos( 95, addy )
- lftext:SetSize( 170, 20 )
- lftext:SetMultiline(false)
- lftext:SetText( "save1" )
- local lfbtn = vgui.Create( "DButton", ptool )
- lfbtn:SetPos( 10, addy )
- lfbtn:SetSize( 80, 20 )
- lfbtn:SetText( "Load file:" )
- lfbtn.DoClick = function()
- local text = string.Trim(lftext:GetValue())
- if (text == "") then return end
- local filename = "swep_construction_kit/"..text..".txt"
- if (!file.Exists (filename)) then
- CreateSettingsNote( "No such file exists!" )
- return
- end
- local glondata = file.Read(filename)
- local succ, new_preset = pcall(glon.decode, glondata)
- if (!succ) then LocalPlayer():ChatPrint("Failed to load settings!") return end
- wep:CleanMenu()
- wep:OpenMenu( new_preset )
- LocalPlayer():ChatPrint("Loaded file \""..text.."\"!")
- end
- // link to FP thread
- addy = addy + 45
- local threadbtn = vgui.Create( "DButton", ptool )
- threadbtn:SetPos( 10, addy )
- threadbtn:SetSize( 240, 20 )
- threadbtn:SetText( "View Facepunch thread & tutorial" )
- threadbtn.DoClick = function()
- gui.OpenURL(tutorialURL)
- end
- /*local alabel = vgui.Create( "DLabel", ptool )
- alabel:SetPos( 10, addy )
- alabel:SetSize( 240, 20 )
- alabel:SetText( "Link to tool tutorial (copy-paste to browser):" )
- addy = addy + 25
- local tutltext = vgui.Create( "DTextEntry", ptool)
- tutltext:SetPos( 10, addy )
- tutltext:SetSize( 240, 20 )
- tutltext:SetMultiline(false)
- tutltext:SetEditable(true)
- tutltext:SetText( "http://tinyurl.com/swepkit" )
- */
- /*****************
- Weapon page
- *****************/
- local addy = 10
- local next_v_model = ""
- // Weapon model
- local vlabel = vgui.Create( "DLabel", pweapon )
- vlabel:SetPos( 10, addy )
- vlabel:SetSize( 80, 20 )
- vlabel:SetText( "View model:" )
- local vtext = vgui.Create( "DTextEntry", pweapon)
- vtext:SetPos( 85, addy )
- vtext:SetSize( 160, 20 )
- vtext:SetMultiline(false)
- vtext.OnTextChanged = function()
- local newmod = string.gsub(vtext:GetValue(), ".mdl", "")
- RunConsoleCommand("swepck_viewmodel", newmod)
- // clear view model additions
- if (newmod != next_v_model and file.Exists(newmod..".mdl",true)) then
- next_v_model = newmod
- ClearViewModels()
- RefreshViewModelBoneMods()
- end
- end
- vtext:SetText( wep.save_data.ViewModel )
- vtext:OnTextChanged()
- local vtbtn = vgui.Create( "DButton", pweapon )
- vtbtn:SetPos( 245, addy )
- vtbtn:SetSize( 20, 20 )
- vtbtn:SetText("...")
- vtbtn.DoClick = function()
- OpenBrowser( wep.ViewModel, "model", function( val ) vtext:SetText(val) vtext:OnTextChanged() end )
- end
- addy = addy + 25
- local wlabel = vgui.Create( "DLabel", pweapon )
- wlabel:SetPos( 10, addy )
- wlabel:SetSize( 80, 20 )
- wlabel:SetText( "World model:" )
- local wtext = vgui.Create( "DTextEntry", pweapon)
- wtext:SetPos( 85, addy )
- wtext:SetSize( 160, 20 )
- wtext:SetMultiline(false)
- wtext.OnTextChanged = function()
- local newmod = string.gsub(wtext:GetValue(), ".mdl", "")
- RunConsoleCommand("swepck_worldmodel", newmod)
- // clear world model additions
- if (newmod != wep.cur_wmodel) then
- ClearWorldModels()
- end
- end
- wtext:SetText( wep.save_data.CurWorldModel )
- wtext:OnTextChanged()
- local wtbtn = vgui.Create( "DButton", pweapon )
- wtbtn:SetPos( 245, addy )
- wtbtn:SetSize( 20, 20 )
- wtbtn:SetText("...")
- wtbtn.DoClick = function()
- OpenBrowser( wep.CurWorldModel, "model", function( val ) wtext:SetText(val) wtext:OnTextChanged() end )
- end
- addy = addy + 30
- // Weapon hold type
- local hlabel = vgui.Create( "DLabel", pweapon )
- hlabel:SetPos( 10, addy )
- hlabel:SetSize( 150, 20 )
- hlabel:SetText( "Hold type (3rd person):" )
- local hbox = vgui.Create( "DMultiChoice", pweapon )
- hbox:SetPos( 140, addy )
- hbox:SetSize( 125, 20 )
- hbox:SetEditable( false )
- for k, v in pairs( wep:GetHoldTypes() ) do
- hbox:AddChoice( v )
- end
- hbox.OnSelect = function(panel,index,value)
- if (!value) then return end
- wep:SetWeaponHoldType( value )
- wep.HoldType = value
- RunConsoleCommand("swepck_setholdtype", value)
- end
- hbox:SetText( wep.save_data.HoldType )
- hbox.OnSelect( nil, nil, wep.save_data.HoldType )
- addy = addy + 30
- // Show viewmodel
- local vhbox = vgui.Create( "DCheckBoxLabel", pweapon )
- vhbox:SetPos( 10, addy )
- vhbox:SetSize( 150, 20 )
- vhbox:SetText( "Show view model" )
- vhbox.OnChange = function()
- wep.ShowViewModel = vhbox:GetChecked()
- if (wep.ShowViewModel) then
- LocalPlayer():GetViewModel():SetColor(255,255,255,255)
- else
- LocalPlayer():GetViewModel():SetColor(255,255,255,1) // we set the alpha to 1 because else ViewModelDrawn stops being called
- end
- end
- if (wep.save_data.ShowViewModel) then vhbox:SetValue(1)
- else vhbox:SetValue(0) end
- addy = addy + 30
- // Show worldmodel
- local whbox = vgui.Create( "DCheckBoxLabel", pweapon )
- whbox:SetPos( 10, addy )
- whbox:SetSize( 150, 20 )
- whbox:SetText( "Show world model" )
- whbox.OnChange = function()
- wep.ShowWorldModel = whbox:GetChecked()
- end
- if (wep.save_data.ShowWorldModel) then whbox:SetValue(1)
- else whbox:SetValue(0) end
- addy = addy + 30
- // Flip viewmodel
- local fcbox = vgui.Create( "DCheckBoxLabel", pweapon )
- fcbox:SetPos( 10, addy )
- fcbox:SetSize( 150, 20 )
- fcbox:SetText( "Flip viewmodel" )
- fcbox.OnChange = function()
- wep.ViewModelFlip = fcbox:GetChecked()
- end
- if (wep.save_data.ViewModelFlip) then fcbox:SetValue(1)
- else fcbox:SetValue(0) end
- addy = addy + 30
- // View model FOV slider
- local fovslider = vgui.Create( "DNumSlider", pweapon )
- fovslider:SetPos( 10, addy )
- fovslider:SetWide( 260 )
- fovslider:SetText( "View model FOV" )
- fovslider:SetMin( 20 )
- fovslider:SetMax( 140 )
- fovslider:SetDecimals( 0 )
- fovslider.OnValueChanged = function( panel, value )
- wep.ViewModelFOV = tonumber(value)
- RunConsoleCommand("swepck_viewmodelfov", value)
- end
- fovslider:SetValue( wep.save_data.ViewModelFOV )
- addy = addy + 50
- // View model bone scaling
- local vsbonelabel = vgui.Create( "DLabel", pweapon )
- vsbonelabel:SetPos( 10, addy )
- vsbonelabel:SetSize( 250, 20 )
- vsbonelabel:SetText( "Viewmodel bone mods:" )
- if (!wep.save_data.v_bonemods) then
- wep.save_data.v_bonemods = {}
- end
- // backwards compatability with old bone scales
- if (wep.save_data.v_bonescales) then
- for k, v in pairs(wep.save_data.v_bonescales) do
- if (v == Vector(1,1,1)) then continue end
- wep.save_data.v_bonemods[k] = { scale = v, pos = Vector(0,0,0), angle = Angle(0,0,0) }
- end
- end
- wep.save_data.v_bonescales = nil
- local curbone = table.GetFirstKey(wep.save_data.v_bonemods)
- if (curbone) then
- wep.v_bonemods = table.Copy(wep.save_data.v_bonemods)
- else
- curbone = ""
- wep.v_bonemods = {}
- end
- local resbtn = vgui.Create( "DButton", pweapon )
- resbtn:SetPos( 180, addy )
- resbtn:SetSize( 90, 20 )
- resbtn:SetText("Reset all")
- addy = addy + 25
- local vsbonebox = vgui.Create( "DMultiChoice", pweapon )
- vsbonebox:SetPos( 10, addy )
- vsbonebox:SetSize( 140, 20 )
- vsbonebox:SetEditable( false )
- local resselbtn = vgui.Create( "DButton", pweapon )
- resselbtn:SetPos( 180, addy )
- resselbtn:SetSize( 90, 20 )
- resselbtn:SetText("Reset selected")
- addy = addy + 25
- local bonepanely = addy
- local function CreateBoneMod( selbone, x, y, preset_data )
- local data = wep.v_bonemods[selbone]
- if (!preset_data) then preset_data = {} end
- data.scale = preset_data.scale or Vector(1,1,1)
- data.pos = preset_data.pos or Vector(0,0,0)
- data.angle = preset_data.angle or Angle(0,0,0)
- local bonepanel = vgui.Create( "DPanel", pweapon )
- bonepanel:SetPos( x, y )
- bonepanel:SetSize( 260, 110 )
- bonepanel:SetVisible( true )
- bonepanel:SetPaintBackground( true )
- bonepanel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, bonepanel:GetWide(), bonepanel:GetTall() ) end
- local rely = 0
- local vslabel = vgui.Create( "DLabel", bonepanel )
- vslabel:SetPos( 5, 8 + rely )
- vslabel:SetText( "Scale" )
- vslabel:SizeToContents()
- vslabel:SetTall( 24 )
- local vsxwang = vgui.Create( "DNumberWang", bonepanel )
- vsxwang:SetPos( 90, 8 + rely ) vsxwang:SetSize( 52, 24 ) vsxwang:SetMinMax( 0.01, 3 ) vsxwang:SetDecimals( 3 ) // look at me ma, I'm saving space!
- local areavx = vsxwang:GetTextArea()
- areavx.OnTextChanged = function() vsxwang:SetValue(tonumber(areavx:GetValue())) end
- local vsywang = vgui.Create( "DNumberWang", bonepanel )
- vsywang:SetPos( 145, 10 + rely ) vsywang:SetSize( 50, 20 ) vsywang:SetMinMax( 0.01, 3 ) vsywang:SetDecimals( 3 )
- vsywang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].scale.y = tonumber(value) end
- end
- local areavy = vsywang:GetTextArea()
- areavy.OnTextChanged = function() vsywang:SetValue(tonumber(areavy:GetValue())) end
- local vszwang = vgui.Create( "DNumberWang", bonepanel )
- vszwang:SetPos( 200, 10 + rely ) vszwang:SetSize( 50, 20 ) vszwang:SetMinMax( 0.01, 3 ) vszwang:SetDecimals( 3 )
- vszwang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].scale.z = tonumber(value) end
- end
- local areavz = vszwang:GetTextArea()
- areavz.OnTextChanged = function() vszwang:SetValue(tonumber(areavz:GetValue())) end
- // make the x numberwang set the total size
- vsxwang.OnValueChanged = function( p, value )
- if (selbone == "") then return end
- vszwang:SetValue( value )
- vsywang:SetValue( value )
- wep.v_bonemods[selbone].scale.x = tonumber(value)
- end
- rely = rely + 30
- local vposlabel = vgui.Create( "DLabel", bonepanel )
- vposlabel:SetPos( 5, 8 + rely )
- vposlabel:SetText( "Pos" )
- vposlabel:SizeToContents()
- vposlabel:SetTall( 24 )
- local vposxwang = vgui.Create( "DNumberWang", bonepanel )
- vposxwang:SetPos( 90, 10 + rely ) vposxwang:SetSize( 52, 20 ) vposxwang:SetMinMax( -30, 30 ) vposxwang:SetDecimals( 3 ) // look at me ma, I'm saving space!
- vposxwang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].pos.x = tonumber(value) end
- end
- local areaposvx = vposxwang:GetTextArea()
- areaposvx.OnTextChanged = function() vposxwang:SetValue(tonumber(areaposvx:GetValue())) end
- local vposywang = vgui.Create( "DNumberWang", bonepanel )
- vposywang:SetPos( 145, 10 + rely ) vposywang:SetSize( 50, 20 ) vposywang:SetMinMax( -30, 30 ) vposywang:SetDecimals( 3 )
- vposywang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].pos.y = tonumber(value) end
- end
- local areaposvy = vposywang:GetTextArea()
- areaposvy.OnTextChanged = function() vposywang:SetValue(tonumber(areaposvy:GetValue())) end
- local vposzwang = vgui.Create( "DNumberWang", bonepanel )
- vposzwang:SetPos( 200, 10 + rely ) vposzwang:SetSize( 50, 20 ) vposzwang:SetMinMax( -30, 30 ) vposzwang:SetDecimals( 3 )
- vposzwang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].pos.z = tonumber(value) end
- end
- local areaposvz = vposzwang:GetTextArea()
- areaposvz.OnTextChanged = function() vposzwang:SetValue(tonumber(areaposvz:GetValue())) end
- rely = rely + 30
- local vanglabel = vgui.Create( "DLabel", bonepanel )
- vanglabel:SetPos( 5, 8 + rely )
- vanglabel:SetText( "Angle" )
- vanglabel:SizeToContents()
- vanglabel:SetTall( 24 )
- local vangxwang = vgui.Create( "DNumberWang", bonepanel )
- vangxwang:SetPos( 90, 10 + rely ) vangxwang:SetSize( 52, 20 ) vangxwang:SetMinMax( -180, 180 ) vangxwang:SetDecimals( 3 ) // look at me ma, I'm saving space!
- vangxwang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].angle.p = tonumber(value) end
- end
- local areaangvx = vangxwang:GetTextArea()
- areaangvx.OnTextChanged = function() vangxwang:SetValue(tonumber(areaangvx:GetValue())) end
- local vangywang = vgui.Create( "DNumberWang", bonepanel )
- vangywang:SetPos( 145, 10 + rely ) vangywang:SetSize( 50, 20 ) vangywang:SetMinMax( -180, 180 ) vangywang:SetDecimals( 3 )
- vangywang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].angle.y = tonumber(value) end
- end
- local areaangvy = vangywang:GetTextArea()
- areaangvy.OnTextChanged = function() vangywang:SetValue(tonumber(areaangvy:GetValue())) end
- local vangzwang = vgui.Create( "DNumberWang", bonepanel )
- vangzwang:SetPos( 200, 10 + rely ) vangzwang:SetSize( 50, 20 ) vangzwang:SetMinMax( -180, 180 ) vangzwang:SetDecimals( 3 )
- vangzwang.OnValueChanged = function( p, value )
- if (selbone != "") then wep.v_bonemods[selbone].angle.r = tonumber(value) end
- end
- local areaangvz = vangzwang:GetTextArea()
- areaangvz.OnTextChanged = function() vangzwang:SetValue(tonumber(areaangvz:GetValue())) end
- vsxwang:SetValue( data.scale.x )
- vsywang:SetValue( data.scale.y )
- vszwang:SetValue( data.scale.z )
- vposxwang:SetValue( data.pos.x )
- vposywang:SetValue( data.pos.y )
- vposzwang:SetValue( data.pos.z )
- vangxwang:SetValue( data.angle.p )
- vangywang:SetValue( data.angle.y )
- vangzwang:SetValue( data.angle.r )
- return bonepanel
- end
- local cur_bonepanel
- vsbonebox.OnSelect = function( p, index, value )
- local selbone = value
- if (!selbone or selbone == "") then return end
- if (!wep.v_bonemods[selbone]) then
- wep.v_bonemods[selbone] = { scale = Vector(1,1,1), pos = Vector(0,0,0), angle = Angle(0,0,0) }
- end
- if (cur_bonepanel) then
- cur_bonepanel:Remove()
- cur_bonepanel = nil
- end
- cur_bonepanel = CreateBoneMod( selbone, 10, bonepanely, wep.v_bonemods[selbone])
- curbone = selbone
- end
- vsbonebox:SetText( curbone )
- vsbonebox.OnSelect( vsbonebox, 1, curbone )
- timer.Simple(2, function()
- local option = PopulateBoneList( vsbonebox, LocalPlayer():GetViewModel() )
- if (option and curbone == "") then
- vsbonebox:ChooseOptionID(1)
- end
- end)
- resbtn.DoClick = function()
- wep.v_bonemods = {}
- if (curbone == "") then return end
- wep.v_bonemods[curbone] = { scale = Vector(1,1,1), pos = Vector(0,0,0), angle = Angle(0,0,0) }
- if (cur_bonepanel) then
- cur_bonepanel:Remove()
- cur_bonepanel = nil
- end
- cur_bonepanel = CreateBoneMod( curbone, 10, bonepanely, wep.v_bonemods[curbone])
- end
- resselbtn.DoClick = function()
- if (curbone == "") then return end
- wep.v_bonemods[curbone] = { scale = Vector(1,1,1), pos = Vector(0,0,0), angle = Angle(0,0,0) }
- if (cur_bonepanel) then
- cur_bonepanel:Remove()
- cur_bonepanel = nil
- end
- cur_bonepanel = CreateBoneMod( curbone, 10, bonepanely, wep.v_bonemods[curbone])
- end
- wep.v_modelbonebox = vsbonebox
- addy = addy + 130
- local wpbtn = vgui.Create( "DButton", pweapon )
- wpbtn:SetPos( 10, addy )
- wpbtn:SetSize( 260, 30 )
- wpbtn:SetText( "Print weapon code to console" )
- wpbtn.DoClick = function()
- MsgN("*********************************************")
- for k, v in pairs(string.Explode("\n",GetWeaponPrintText(wep))) do
- MsgN(v)
- end
- MsgN("*********************************************")
- LocalPlayer():ChatPrint("Code printed to console!")
- end
- addy = addy + 35
- local wpcbtn = vgui.Create( "DButton", pweapon )
- wpcbtn:SetPos( 10, addy )
- wpcbtn:SetSize( 260, 30 )
- wpcbtn:SetText( "Copy weapon code to clipboard" )
- wpcbtn.DoClick = function()
- SetClipboardText(GetWeaponPrintText(wep))
- LocalPlayer():ChatPrint("Code copied to clipboard!")
- end
- addy = addy + 35
- local wpdbtn = vgui.Create( "DButton", pweapon )
- wpdbtn:SetPos( 10, addy )
- wpdbtn:SetSize( 260, 30 )
- wpdbtn:SetText( "Drop weapon (hold reload key to pick back up)" )
- wpdbtn.DoClick = function()
- RunConsoleCommand("swepck_dropwep")
- end
- /*********************
- Ironsights page
- *********************/
- addy = 10
- local icbox = vgui.Create( "DCheckBoxLabel", pironsight )
- icbox:SetPos( 10, addy )
- icbox:SetSize( 150, 20 )
- icbox:SetText( "Enable ironsights" )
- icbox.OnChange = function()
- if (wep:GetIronSights() != icbox:GetChecked()) then
- RunConsoleCommand("swepck_toggleironsights")
- end
- end
- if (wep.save_data.IronSightsEnabled) then icbox:SetValue(1)
- else icbox:SetValue(0) end
- local ribtn = vgui.Create( "DButton", pironsight )
- ribtn:SetPos( 140, addy )
- ribtn:SetSize( 125, 20 )
- ribtn:SetText( "Reset ironsights" )
- ribtn.DoClick = function()
- wep:ResetIronSights()
- end
- addy = addy + 30
- local modlabel = vgui.Create( "DLabel", pironsight )
- modlabel:SetPos( 10, addy )
- modlabel:SetSize( 100, 20 )
- modlabel:SetText( "Drag mode:" )
- local drbox = vgui.Create( "DMultiChoice", pironsight )
- drbox:SetPos( 140, addy )
- drbox:SetSize( 125, 20 )
- drbox:SetEditable( false )
- drbox:SetText( wep.cur_drag_mode )
- for k, v in pairs( drag_modes ) do
- drbox:AddChoice( k )
- end
- drbox.OnSelect = function(panel,index,value)
- local modes = drag_modes[value]
- wep.cur_drag_mode = value
- for k, v in pairs( wep.ir_drag ) do
- v[1] = table.HasValue( modes, k ) // set the drag modus
- end
- end
- addy = addy + 30
- local ixslider = vgui.Create( "DNumSlider", pironsight )
- ixslider:SetPos( 10, addy )
- ixslider:SetWide( 260 )
- ixslider:SetText( "Translate x" )
- ixslider:SetMin( -20 )
- ixslider:SetMax( 20 )
- ixslider:SetDecimals( 3 )
- ixslider:SetConVar( "_sp_ironsight_x" )
- ixslider:SetValue( wep.save_data.IronSightsPos.x )
- local areaix = ixslider:GetTextArea()
- areaix.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_x",areaix:GetValue()) end
- addy = addy + 45
- local iyslider = vgui.Create( "DNumSlider", pironsight )
- iyslider:SetPos( 10, addy )
- iyslider:SetWide( 260 )
- iyslider:SetText( "Translate y" )
- iyslider:SetMin( -20 )
- iyslider:SetMax( 20 )
- iyslider:SetDecimals( 3 )
- iyslider:SetConVar( "_sp_ironsight_y" )
- iyslider:SetValue( wep.save_data.IronSightsPos.y )
- local areaiy = iyslider:GetTextArea()
- areaiy.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_y",areaiy:GetValue()) end
- addy = addy + 45
- local izslider = vgui.Create( "DNumSlider", pironsight )
- izslider:SetPos( 10, addy )
- izslider:SetWide( 260 )
- izslider:SetText( "Translate z" )
- izslider:SetMin( -20 )
- izslider:SetMax( 20 )
- izslider:SetDecimals( 3 )
- izslider:SetConVar( "_sp_ironsight_z" )
- izslider:SetValue( wep.save_data.IronSightsPos.z )
- local areaiz = izslider:GetTextArea()
- areaiz.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_z",areaiz:GetValue()) end
- addy = addy + 45
- local ipslider = vgui.Create( "DNumSlider", pironsight )
- ipslider:SetPos( 10, addy )
- ipslider:SetWide( 260 )
- ipslider:SetText( "Rotate pitch" )
- ipslider:SetMin( -70 )
- ipslider:SetMax( 70 )
- ipslider:SetDecimals( 3 )
- ipslider:SetConVar( "_sp_ironsight_pitch" )
- ipslider:SetValue( wep.save_data.IronSightsAng.x )
- local areaip = ipslider:GetTextArea()
- areaip.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_pitch",areaip:GetValue()) end
- addy = addy + 45
- local iyaslider = vgui.Create( "DNumSlider", pironsight )
- iyaslider:SetPos( 10, addy )
- iyaslider:SetWide( 260 )
- iyaslider:SetText( "Rotate yaw" )
- iyaslider:SetMin( -70 )
- iyaslider:SetMax( 70 )
- iyaslider:SetDecimals( 3 )
- iyaslider:SetConVar( "_sp_ironsight_yaw" )
- iyaslider:SetValue( wep.save_data.IronSightsAng.y )
- local areaiya = iyaslider:GetTextArea()
- areaiya.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_yaw",areaiya:GetValue()) end
- addy = addy + 45
- local irslider = vgui.Create( "DNumSlider", pironsight )
- irslider:SetPos( 10, addy )
- irslider:SetWide( 260 )
- irslider:SetText( "Rotate roll" )
- irslider:SetMin( -70 )
- irslider:SetMax( 70 )
- irslider:SetDecimals( 3 )
- irslider:SetConVar( "_sp_ironsight_roll" )
- irslider:SetValue( wep.save_data.IronSightsAng.z )
- local areair = irslider:GetTextArea()
- areair.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_roll",areair:GetValue()) end
- addy = addy + 45
- local prbtn = vgui.Create( "DButton", pironsight )
- prbtn:SetPos( 10, addy )
- prbtn:SetSize( 260, 30 )
- prbtn:SetText( "Print ironsights code to console" )
- prbtn.DoClick = function()
- local vec, ang = wep:GetIronSightCoordination()
- MsgN("*********************************************")
- MsgN(GetIronSightPrintText( vec, ang ))
- MsgN("*********************************************")
- LocalPlayer():ChatPrint("Code printed to console!")
- end
- addy = addy + 35
- local pcbtn = vgui.Create( "DButton", pironsight )
- pcbtn:SetPos( 10, addy )
- pcbtn:SetSize( 260, 30 )
- pcbtn:SetText( "Copy ironsights code to clipboard" )
- pcbtn.DoClick = function()
- local vec, ang = wep:GetIronSightCoordination()
- SetClipboardText(GetIronSightPrintText( vec, ang ))
- LocalPlayer():ChatPrint("Code copied to clipboard!")
- end
- /*********************
- Models page
- *********************/
- addy = 10
- local lastVisible = ""
- local mlist = vgui.Create( "DListView", pmodels)
- wep.v_modelListing = mlist
- local mlabel = vgui.Create( "DLabel", pmodels )
- mlabel:SetPos( 10, addy )
- mlabel:SetSize( 130, 20 )
- mlabel:SetText( "New viewmodel element:" )
- local function CreateNote( text )
- local templabel = vgui.Create( "DLabel" )
- templabel:SetText( text )
- templabel:SetSize( 120, 20 )
- local notif = vgui.Create( "DNotify" , pmodels )
- notif:SetPos( 140, 10 )
- notif:SetSize( 120, 20 )
- notif:SetLife( 5 )
- notif:AddItem(templabel)
- end
- addy = addy + 25
- local mntext = vgui.Create("DTextEntry", pmodels )
- mntext:SetPos( 10, addy )
- mntext:SetSize( 120, 20 )
- mntext:SetMultiline(false)
- mntext:SetText( "some_unique_name" )
- local tpbox = vgui.Create( "DMultiChoice", pmodels )
- tpbox:SetPos( 130, addy )
- tpbox:SetSize( 85, 20 )
- tpbox:SetEditable( false )
- tpbox:SetText( "Model" )
- tpbox:AddChoice( "Model" )
- tpbox:AddChoice( "Sprite" )
- tpbox:AddChoice( "Quad" )
- local boxselected = "Model"
- tpbox.OnSelect = function( p, index, value )
- boxselected = value
- end
- local mnbtn = vgui.Create( "DButton", pmodels )
- mnbtn:SetPos( 220, addy )
- mnbtn:SetSize( 45, 20 )
- mnbtn:SetText( "Add" )
- addy = addy + 30
- mlist:SetPos( 10, addy )
- mlist:SetSize( 260, 120 )
- mlist:SetMultiSelect(false)
- mlist:SetDrawBackground(true)
- mlist:AddColumn("Name")
- mlist:AddColumn("Type")
- // cache the created panels
- mlist.OnRowSelected = function( panel, line )
- local name = mlist:GetLine(line):GetValue(1)
- local posx, posy = wep.v_panelCache[name]:GetPos()
- if (wep.v_panelCache[lastVisible]) then
- wep.v_panelCache[lastVisible]:SetVisible(false)
- end
- wep.v_panelCache[name]:SetVisible(true)
- lastVisible = name
- end
- addy = addy + 125
- local rmbtn = vgui.Create( "DButton", pmodels )
- rmbtn:SetPos( 10, addy )
- rmbtn:SetSize( 130, 25 )
- rmbtn:SetText( "Remove selected" )
- local copybtn = vgui.Create( "DButton", pmodels )
- copybtn:SetPos( 145, addy )
- copybtn:SetSize( 125, 25 )
- copybtn:SetText( "Copy selected" )
- addy = addy + 30
- local function CreatePositionModifiers( data, addy, panel )
- local trlabel = vgui.Create( "DLabel", panel )
- trlabel:SetPos( 5, addy )
- trlabel:SetSize( 80, 20 )
- trlabel:SetText( "Pos x/y/z:" )
- local mxwang = vgui.Create( "DNumberWang", panel )
- mxwang:SetPos( 90, addy )
- mxwang:SetSize( 50, 20 )
- mxwang:SetMin( -30 )
- mxwang:SetMax( 30 )
- mxwang:SetDecimals( 3 )
- mxwang.OnValueChanged = function( p, value ) data.pos.x = tonumber(value) end
- mxwang:SetValue( data.pos.x )
- local areax = mxwang:GetTextArea()
- areax.OnTextChanged = function() mxwang:SetValue(tonumber(areax:GetValue())) end
- local mywang = vgui.Create( "DNumberWang", panel )
- mywang:SetPos( 145, addy )
- mywang:SetSize( 50, 20 )
- mywang:SetMin( -30 )
- mywang:SetMax( 30 )
- mywang:SetDecimals( 3 )
- mywang.OnValueChanged = function( p, value ) data.pos.y = tonumber(value) end
- mywang:SetValue( data.pos.y )
- local areay = mywang:GetTextArea()
- areay.OnTextChanged = function() mywang:SetValue(tonumber(areay:GetValue())) end
- local mzwang = vgui.Create( "DNumberWang", panel )
- mzwang:SetPos( 200, addy )
- mzwang:SetSize( 50, 20 )
- mzwang:SetMin( -30 )
- mzwang:SetMax( 30 )
- mzwang:SetDecimals( 3 )
- mzwang.OnValueChanged = function( p, value ) data.pos.z = tonumber(value) end
- mzwang:SetValue( data.pos.z )
- local areaz = mzwang:GetTextArea()
- areaz.OnTextChanged = function() mzwang:SetValue(tonumber(areaz:GetValue())) end
- end
- local function CreateAngleModifiers( data, addy, panel )
- local anlabel = vgui.Create( "DLabel", panel )
- anlabel:SetPos( 5, addy )
- anlabel:SetSize( 80, 20 )
- anlabel:SetText( "Angle p/y/r:" )
- local mpitchwang = vgui.Create( "DNumberWang", panel )
- mpitchwang:SetPos( 90, addy )
- mpitchwang:SetSize( 50, 20 )
- mpitchwang:SetMin( -180 )
- mpitchwang:SetMax( 180 )
- mpitchwang:SetDecimals( 3 )
- mpitchwang.OnValueChanged = function( p, value ) data.angle.p = tonumber(value) end
- mpitchwang:SetValue( data.angle.p )
- local areap = mpitchwang:GetTextArea()
- areap.OnTextChanged = function() mpitchwang:SetValue(tonumber(areap:GetValue())) end
- local myawwang = vgui.Create( "DNumberWang", panel )
- myawwang:SetPos( 145, addy )
- myawwang:SetSize( 50, 20 )
- myawwang:SetMin( -180 )
- myawwang:SetMax( 180 )
- myawwang:SetDecimals( 3 )
- myawwang.OnValueChanged = function( p, value ) data.angle.y = tonumber(value) end
- myawwang:SetValue( data.angle.y )
- local areay = myawwang:GetTextArea()
- areay.OnTextChanged = function() myawwang:SetValue(tonumber(areay:GetValue())) end
- local mrollwang = vgui.Create( "DNumberWang", panel )
- mrollwang:SetPos( 200, addy )
- mrollwang:SetSize( 50, 20 )
- mrollwang:SetMin( -180 )
- mrollwang:SetMax( 180 )
- mrollwang:SetDecimals( 3 )
- mrollwang.OnValueChanged = function( p, value ) data.angle.r = tonumber(value) end
- mrollwang:SetValue( data.angle.r )
- local arear = mrollwang:GetTextArea()
- arear.OnTextChanged = function() mrollwang:SetValue(tonumber(arear:GetValue())) end
- end
- local function CreateSizeModifiers( data, addy, panel, dimensions )
- local sizelabel = vgui.Create( "DLabel", panel )
- sizelabel:SetPos( 5, addy )
- sizelabel:SetSize( 80, 20 )
- if (dimensions == 2) then
- sizelabel:SetText( "Size (xy)/y:" )
- elseif ( dimensions == 3 ) then
- sizelabel:SetText( "Size (xyz)/y/z:" )
- else
- sizelabel:SetText( "Size:" )
- end
- local msxwang = vgui.Create( "DNumberWang", panel )
- msxwang:SetPos( 90, addy-2 )
- msxwang:SetSize( 52, 24 )
- msxwang:SetMin( 0.01 )
- msxwang:SetMax( 10 )
- msxwang:SetDecimals( 3 )
- local areasx = msxwang:GetTextArea()
- areasx.OnTextChanged = function() msxwang:SetValue(tonumber(areasx:GetValue())) end
- local msywang, mszwang
- if (dimensions > 1 ) then
- msywang = vgui.Create( "DNumberWang", panel )
- msywang:SetPos( 145, addy )
- msywang:SetSize( 50, 20 )
- msywang:SetMin( 0.01 )
- msywang:SetMax( 10 )
- msywang:SetDecimals( 3 )
- msywang.OnValueChanged = function( p, value ) data.size.y = tonumber(value) end
- local areasy = msywang:GetTextArea()
- areasy.OnTextChanged = function() msywang:SetValue(tonumber(areasy:GetValue())) end
- if (dimensions > 2) then
- mszwang = vgui.Create( "DNumberWang", panel )
- mszwang:SetPos( 200, addy )
- mszwang:SetSize( 50, 20 )
- mszwang:SetMin( 0.01 )
- mszwang:SetMax( 10 )
- mszwang:SetDecimals( 3 )
- mszwang.OnValueChanged = function( p, value ) data.size.z = tonumber(value) end
- local areasz = mszwang:GetTextArea()
- areasz.OnTextChanged = function() mszwang:SetValue(tonumber(areasz:GetValue())) end
- end
- end
- // make the x numberwang set the total size
- msxwang.OnValueChanged = function( p, value )
- if (mszwang) then
- mszwang:SetValue( value )
- end
- if (msywang) then
- msywang:SetValue( value )
- end
- if (dimensions > 1) then
- data.size.x = tonumber(value)
- else
- data.size = tonumber(value)
- end
- end
- if (dimensions == 1) then
- msxwang:SetValue( data.size )
- else
- local new_y = data.size.y
- local new_z = data.size.z
- msxwang:SetValue( data.size.x )
- msywang:SetValue( new_y )
- if (mszwang) then
- mszwang:SetValue( new_z )
- end
- end
- end
- local function CreateColorModifiers( data, addy, panel )
- local collabel = vgui.Create( "DLabel", panel )
- collabel:SetPos( 5, addy )
- collabel:SetSize( 80, 20 )
- collabel:SetText( "Color r/g/b/a:" )
- local colrwang = vgui.Create( "DNumberWang", panel )
- colrwang:SetPos( 90, addy )
- colrwang:SetSize( 38, 20 )
- colrwang:SetMin( 0 )
- colrwang:SetMax( 255 )
- colrwang:SetDecimals( 0 )
- colrwang.OnValueChanged = function( p, value ) data.color.r = tonumber(value) end
- colrwang:SetValue(data.color.r)
- local arear = colrwang:GetTextArea()
- arear.OnTextChanged = function() colrwang:SetValue(tonumber(arear:GetValue())) end
- local colgwang = vgui.Create( "DNumberWang", panel )
- colgwang:SetPos( 130, addy )
- colgwang:SetSize( 38, 20 )
- colgwang:SetMin( 0 )
- colgwang:SetMax( 255 )
- colgwang:SetDecimals( 0 )
- colgwang.OnValueChanged = function( p, value ) data.color.g = tonumber(value) end
- colgwang:SetValue(data.color.g)
- local areag = colgwang:GetTextArea()
- areag.OnTextChanged = function() colgwang:SetValue(tonumber(areag:GetValue())) end
- local colbwang = vgui.Create( "DNumberWang", panel )
- colbwang:SetPos( 170, addy )
- colbwang:SetSize( 38, 20 )
- colbwang:SetMin( 0 )
- colbwang:SetMax( 255 )
- colbwang:SetDecimals( 0 )
- colbwang.OnValueChanged = function( p, value ) data.color.b = tonumber(value) end
- colbwang:SetValue(data.color.b)
- local areab = colbwang:GetTextArea()
- areab.OnTextChanged = function() colbwang:SetValue(tonumber(areab:GetValue())) end
- local colawang = vgui.Create( "DNumberWang", panel )
- colawang:SetPos( 210, addy )
- colawang:SetSize( 40, 20 )
- colawang:SetMin( 0 )
- colawang:SetMax( 255 )
- colawang:SetDecimals( 0 )
- colawang.OnValueChanged = function( p, value ) data.color.a = tonumber(value) end
- colawang:SetValue(data.color.a)
- local areaa = colawang:GetTextArea()
- areaa.OnTextChanged = function() colawang:SetValue(tonumber(areaa:GetValue())) end
- end
- local function CreateModelModifier( data, addy, panel )
- local pmolabel = vgui.Create( "DLabel", panel )
- pmolabel:SetPos( 5, addy )
- pmolabel:SetSize( 80, 20 )
- pmolabel:SetText( "Model:" )
- local pmmtext = vgui.Create( "DTextEntry", panel )
- pmmtext:SetPos( 60, addy )
- pmmtext:SetSize( 170, 20 )
- pmmtext:SetMultiline(false)
- pmmtext:SetToolTip("Path to the model file")
- pmmtext.OnTextChanged = function()
- local newmod = pmmtext:GetValue()
- if file.Exists (newmod,true) then
- util.PrecacheModel(newmod)
- data.model = newmod
- end
- end
- pmmtext:SetText( data.model )
- pmmtext.OnTextChanged()
- local wtbtn = vgui.Create( "DButton", panel )
- wtbtn:SetPos( 230, addy )
- wtbtn:SetSize( 20, 20 )
- wtbtn:SetText("...")
- wtbtn.DoClick = function()
- OpenBrowser( data.model, "model", function( val ) pmmtext:SetText(val) pmmtext:OnTextChanged() end )
- end
- end
- local function CreateSpriteModifier( data, addy, panel )
- local pmolabel = vgui.Create( "DLabel", panel )
- pmolabel:SetPos( 5, addy )
- pmolabel:SetSize( 80, 20 )
- pmolabel:SetText( "Sprite:" )
- local pmmtext = vgui.Create( "DTextEntry", panel )
- pmmtext:SetPos( 60, addy )
- pmmtext:SetSize( 170, 20 )
- pmmtext:SetMultiline(false)
- pmmtext:SetToolTip("Path to the sprite material")
- pmmtext.OnTextChanged = function()
- local newsprite = pmmtext:GetValue()
- if file.Exists ("materials/"..newsprite..".vmt",true) then
- data.sprite = newsprite
- end
- end
- pmmtext:SetText( data.sprite )
- pmmtext.OnTextChanged()
- local wtbtn = vgui.Create( "DButton", panel )
- wtbtn:SetPos( 230, addy )
- wtbtn:SetSize( 20, 20 )
- wtbtn:SetText("...")
- wtbtn.DoClick = function()
- OpenBrowser( data.sprite, "material", function( val ) pmmtext:SetText(val) pmmtext:OnTextChanged() end )
- end
- end
- local function CreateNameLabel( name, addy, panel )
- local pnmlabel = vgui.Create( "DLabel", panel )
- pnmlabel:SetPos( 5, addy )
- pnmlabel:SetSize( 80, 20 )
- pnmlabel:SetText( "Name:" )
- local pnmtext = vgui.Create( "DTextEntry", panel )
- pnmtext:SetPos( 60, addy )
- pnmtext:SetSize( 190, 20 )
- pnmtext:SetMultiline(false)
- pnmtext:SetText( name )
- pnmtext:SetEditable( false )
- end
- local function CreateParamModifiers( data, addy, panel )
- local ncchbox = vgui.Create( "DCheckBoxLabel", panel )
- ncchbox:SetPos( 5, addy )
- ncchbox:SetSize( 120, 20 )
- ncchbox:SetText("$nocull")
- ncchbox:SetValue( 0 )
- ncchbox.OnChange = function()
- data.nocull = ncchbox:GetChecked()
- data.spriteMaterial = nil // dump old material
- end
- if (data.nocull) then ncchbox:SetValue( 1 ) end
- local adchbox = vgui.Create( "DCheckBoxLabel", panel )
- adchbox:SetPos( 140, addy )
- adchbox:SetSize( 120, 20 )
- adchbox:SetText("$additive")
- adchbox:SetValue( 0 )
- adchbox.OnChange = function()
- data.additive = adchbox:GetChecked()
- data.spriteMaterial = nil // dump old material
- end
- if (data.additive) then adchbox:SetValue( 1 ) end
- addy = addy + 22
- local vtachbox = vgui.Create( "DCheckBoxLabel", panel )
- vtachbox:SetPos( 5, addy )
- vtachbox:SetSize( 120, 20 )
- vtachbox:SetText("$vertexalpha")
- vtachbox:SetValue( 0 )
- vtachbox.OnChange = function()
- data.vertexalpha = vtachbox:GetChecked()
- data.spriteMaterial = nil // dump old material
- end
- if (data.vertexalpha) then vtachbox:SetValue( 1 ) end
- local vtcchbox = vgui.Create( "DCheckBoxLabel", panel )
- vtcchbox:SetPos( 140, addy )
- vtcchbox:SetSize( 120, 20 )
- vtcchbox:SetText("$vertexcolor")
- vtcchbox:SetValue( 0 )
- vtcchbox.OnChange = function()
- data.vertexcolor = vtcchbox:GetChecked()
- data.spriteMaterial = nil // dump old material
- end
- if (data.vertexcolor) then vtcchbox:SetValue( 1 ) end
- addy = addy + 22
- local izchbox = vgui.Create( "DCheckBoxLabel", panel )
- izchbox:SetPos( 5, addy )
- izchbox:SetSize( 120, 20 )
- izchbox:SetText("$ignorez")
- izchbox:SetValue( 0 )
- izchbox.OnChange = function()
- data.ignorez = izchbox:GetChecked()
- data.spriteMaterial = nil // dump old material
- end
- if (data.ignorez) then izchbox:SetValue( 1 ) end
- end
- local function CreateMaterialModifier( data, addy, panel )
- local matlabel = vgui.Create( "DLabel", panel )
- matlabel:SetPos( 5, addy )
- matlabel:SetSize( 80, 20 )
- matlabel:SetText( "Material:" )
- local mattext = vgui.Create("DTextEntry", panel )
- mattext:SetPos( 90, addy )
- mattext:SetSize( 140, 20 )
- mattext:SetMultiline(false)
- mattext:SetToolTip("Path to the material file")
- mattext.OnTextChanged = function()
- local newmat = mattext:GetValue()
- if file.Exists ("materials/"..newmat..".vmt",true) then
- data.material = newmat
- else
- data.material = ""
- end
- end
- mattext:SetText( data.material )
- local wtbtn = vgui.Create( "DButton", panel )
- wtbtn:SetPos( 230, addy )
- wtbtn:SetSize( 20, 20 )
- wtbtn:SetText("...")
- wtbtn.DoClick = function()
- OpenBrowser( data.material, "material", function( val ) mattext:SetText(val) mattext:OnTextChanged() end )
- end
- end
- local function CreateSLightningModifier( data, addy, panel )
- local lschbox = vgui.Create( "DCheckBoxLabel", panel )
- lschbox:SetPos( 5, addy )
- lschbox:SetSize( 200, 20 )
- lschbox:SetText("Surpress engine lightning")
- lschbox.OnChange = function()
- data.surpresslightning = lschbox:GetChecked()
- end
- if (data.surpresslightning) then
- lschbox:SetValue( 1 )
- else
- lschbox:SetValue( 0 )
- end
- end
- local function CreateBoneModifier( data, addy, panel, ent )
- local pbonelabel = vgui.Create( "DLabel", panel )
- pbonelabel:SetPos( 5, addy )
- pbonelabel:SetSize( 80, 20 )
- pbonelabel:SetText( "Bone:" )
- local bonebox = vgui.Create( "DMultiChoice", panel )
- bonebox:SetPos( 60, addy )
- bonebox:SetSize( 190, 20 )
- bonebox:SetEditable( false )
- bonebox:SetToolTip("Bone to parent the selected element to. Is ignored if the 'Relative' field is not empty")
- bonebox.OnSelect = function( p, index, value )
- data.bone = value
- end
- bonebox:SetText( data.bone )
- local delay = 0
- // we have to call it later when loading settings because the viewmodel needs to be changed first
- if (data.bone != "") then delay = 2 end
- timer.Simple(delay, function()
- local option = PopulateBoneList( bonebox, ent )
- if (option and data.bone == "") then
- bonebox:ChooseOptionID(1)
- end
- end)
- end
- local function CreateRelativeModifier( data, addy, panel )
- local prellabel = vgui.Create( "DLabel", panel )
- prellabel:SetPos( 5, addy )
- prellabel:SetSize( 80, 20 )
- prellabel:SetText( "Relative:" )
- local reltext = vgui.Create( "DTextEntry", panel )
- reltext:SetPos( 60, addy )
- reltext:SetSize( 190, 20 )
- reltext:SetMultiline(false)
- reltext:SetToolTip("Name of the element you want to parent this element to. Overrides parenting to a bone. Clear field to use bone as parent again")
- reltext.OnTextChanged = function()
- data.rel = reltext:GetValue()
- end
- reltext:SetText( data.rel )
- end
- local function CreateBodygroupSkinModifier( data, addy, panel )
- local addx = 5
- local bdlabel = vgui.Create( "DLabel", panel )
- bdlabel:SetPos( addx, addy )
- bdlabel:SetSize( 80, 20 )
- bdlabel:SetText( "Bodygroup:" )
- addx = addx + 85
- local bdwang = vgui.Create( "DNumberWang", panel )
- bdwang:SetPos( addx, addy )
- bdwang:SetSize( 30, 20 )
- bdwang:SetMin( 1 )
- bdwang:SetMax( 9 )
- bdwang:SetDecimals( 0 )
- bdwang:SetToolTip("Bodygroup number")
- local areabd = bdwang:GetTextArea()
- areabd.OnTextChanged = function() bdwang:SetValue(tonumber(areabd:GetValue())) end
- addx = addx + 30
- local islabel = vgui.Create( "DLabel", panel )
- islabel:SetPos( addx+2, addy )
- islabel:SetSize( 10, 20 )
- islabel:SetText( "=" )
- addx = addx + 10
- local bdvwang = vgui.Create( "DNumberWang", panel )
- bdvwang:SetPos( addx, addy )
- bdvwang:SetSize( 30, 20 )
- bdvwang:SetMin( 0 )
- bdvwang:SetMax( 9 )
- bdvwang:SetDecimals( 0 )
- bdvwang:SetToolTip("State number")
- local areabdv = bdvwang:GetTextArea()
- areabdv.OnTextChanged = function() bdvwang:SetValue(tonumber(areabdv:GetValue())) end
- bdvwang.OnValueChanged = function( p, value )
- local group = tonumber(bdwang:GetValue())
- local val = tonumber(value)
- data.bodygroup[group] = val
- end
- bdvwang:SetValue(0)
- bdwang.OnValueChanged = 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)
- addx = addx + 50
- local sklabel = vgui.Create( "DLabel", panel )
- sklabel:SetPos( addx, addy )
- sklabel:SetSize( 40, 20 )
- sklabel:SetText( "Skin:" )
- addx = addx + 40
- local skwang = vgui.Create( "DNumberWang", panel )
- skwang:SetPos( addx, addy )
- skwang:SetSize( 30, 20 )
- skwang:SetMin( 0 )
- skwang:SetMax( 9 )
- skwang:SetDecimals( 0 )
- skwang.OnValueChanged = function( p, value ) data.skin = tonumber(value) end
- skwang:SetValue(data.skin)
- local areask = skwang:GetTextArea()
- areask.OnTextChanged = function() skwang:SetValue(tonumber(areask:GetValue())) end
- end
- local panely = addy
- local panelh = 580 - panely - 60
- /*** Model panel for adjusting models ***
- Name:
- Model:
- Bone name:
- Translation x / y / z
- Rotation pitch / yaw / role
- Model size x / y / z
- Material
- Color modulation
- */
- local function CreateModelPanel( name, x, y, preset_data )
- local data = wep.v_models[name]
- if (!preset_data) then preset_data = {} end
- // default data
- 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
- local panel = vgui.Create( "DPanel", pmodels )
- panel:SetPos( x, y )
- panel:SetSize( 260, panelh )
- panel:SetPaintBackground( true )
- panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
- local addy = 5
- CreateNameLabel( name, addy, panel )
- addy = addy + 25
- CreateModelModifier( data, addy, panel )
- addy = addy + 25
- CreateBoneModifier( data, addy, panel, LocalPlayer():GetViewModel() )
- addy = addy + 25
- CreateRelativeModifier( data, addy, panel )
- addy = addy + 25
- CreatePositionModifiers( data, addy, panel )
- addy = addy + 25
- CreateAngleModifiers( data, addy, panel )
- addy = addy + 25
- CreateSizeModifiers( data, addy, panel, 3 )
- addy = addy + 25
- CreateColorModifiers( data, addy, panel )
- addy = addy + 25
- CreateSLightningModifier( data, addy, panel )
- addy = addy + 22
- CreateMaterialModifier( data, addy, panel )
- addy = addy + 25
- CreateBodygroupSkinModifier( data, addy, panel )
- return panel
- end
- /*** Sprite panel for adjusting sprites ***
- Name:
- Sprite:
- Bone name:
- Translation x / y / z
- Sprite x / y size
- Color
- */
- local function CreateSpritePanel( name, x, y, preset_data )
- local data = wep.v_models[name]
- if (!preset_data) then preset_data = {} end
- // default data
- 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
- wep.vRenderOrder = nil
- local panel = vgui.Create( "DPanel", pmodels )
- panel:SetPos( x, y )
- panel:SetSize( 260, panelh )
- panel:SetPaintBackground( true )
- panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
- local addy = 5
- CreateNameLabel( name, addy, panel )
- addy = addy + 25
- CreateSpriteModifier( data, addy, panel )
- addy = addy + 25
- CreateBoneModifier( data, addy, panel, LocalPlayer():GetViewModel() )
- addy = addy + 25
- CreateRelativeModifier( data, addy, panel )
- addy = addy + 25
- CreatePositionModifiers( data, addy, panel )
- addy = addy + 25
- CreateSizeModifiers( data, addy, panel, 2 )
- addy = addy + 25
- CreateColorModifiers( data, addy, panel )
- addy = addy + 25
- CreateParamModifiers( data, addy, panel )
- return panel
- end
- /*** Model panel for adjusting models ***
- Name:
- Model:
- Bone name:
- Translation x / y / z
- Rotation pitch / yaw / role
- Size
- */
- local function CreateQuadPanel( name, x, y, preset_data )
- local data = wep.v_models[name]
- if (!preset_data) then preset_data = {} end
- // default data
- 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
- local panel = vgui.Create( "DPanel", pmodels )
- panel:SetPos( x, y )
- panel:SetSize( 260, panelh )
- panel:SetPaintBackground( true )
- panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
- local addy = 5
- CreateNameLabel( name, addy, panel )
- addy = addy + 25
- CreateBoneModifier( data, addy, panel, LocalPlayer():GetViewModel() )
- addy = addy + 25
- CreateRelativeModifier( data, addy, panel )
- addy = addy + 25
- CreatePositionModifiers( data, addy, panel )
- addy = addy + 25
- CreateAngleModifiers( data, addy, panel )
- addy = addy + 25
- CreateSizeModifiers( data, addy, panel, 1 )
- return panel
- end
- // adding button DoClick
- 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] = {}
- if (!wep.v_panelCache[new]) then
- if (boxselected == "Model") then
- wep.v_panelCache[new] = CreateModelPanel( new, 10, panely )
- elseif (boxselected == "Sprite") then
- wep.v_panelCache[new] = CreateSpritePanel( new, 10, panely )
- elseif (boxselected == "Quad") then
- wep.v_panelCache[new] = CreateQuadPanel( new, 10, panely )
- else
- Error("wtf are u doing")
- end
- end
- wep.v_panelCache[new]:SetVisible(false)
- 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, 10, panely, v )
- elseif (v.type == "Sprite") then
- wep.v_panelCache[k] = CreateSpritePanel( k, 10, panely, v )
- elseif (v.type == "Quad") then
- wep.v_panelCache[k] = CreateQuadPanel( k, 10, panely, v )
- end
- wep.v_panelCache[k]:SetVisible(false)
- mlist:AddLine(k,v.type)
- end
- local prtbtn = vgui.Create( "DButton", pmodels)
- prtbtn:SetPos( 10, 525 )
- prtbtn:SetSize( 260, 20 )
- 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
- local pctbtn = vgui.Create( "DButton", pmodels)
- pctbtn:SetPos( 10, 550 )
- pctbtn:SetSize( 260, 20 )
- pctbtn:SetText("Copy view model table to clipboard")
- pctbtn.DoClick = function()
- SetClipboardText(GetVModelsText())
- LocalPlayer():ChatPrint("Code copied to clipboard!")
- end
- // remove a line
- 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
- wep.v_panelCache[name]:Remove()
- wep.v_panelCache[name] = nil
- end
- mlist:RemoveLine(line)
- end
- end
- // duplicate line
- 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
- while(wep.v_models[name]) do
- name = name.."+"
- end
- // have to fix every sub-table as well because table.Copy copies references
- 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
- wep.v_models[name] = {}
- if (new_preset.type == "Model") then
- wep.v_panelCache[name] = CreateModelPanel( name, 10, panely, new_preset )
- elseif (new_preset.type == "Sprite") then
- wep.v_panelCache[name] = CreateSpritePanel( name, 10, panely, new_preset )
- elseif (new_preset.type == "Quad") then
- wep.v_panelCache[name] = CreateQuadPanel( name, 10, panely, new_preset )
- end
- wep.v_panelCache[name]:SetVisible(false)
- mlist:AddLine(name,new_preset.type)
- end
- end
- /*********************
- World models page
- *********************/
- addy = 10
- local lastVisible = ""
- local mwlist = vgui.Create( "DListView", pwmodels)
- wep.w_modelListing = mwlist
- local mlabel = vgui.Create( "DLabel", pwmodels )
- mlabel:SetPos( 10, addy )
- mlabel:SetSize( 130, 20 )
- mlabel:SetText( "New worldmodel element:" )
- local function CreateWNote( text )
- local templabel = vgui.Create( "DLabel" )
- templabel:SetText( text )
- templabel:SetSize( 120, 20 )
- local notif = vgui.Create( "DNotify" , pwmodels )
- notif:SetPos( 140, 10 )
- notif:SetSize( 120, 20 )
- notif:SetLife( 5 )
- notif:AddItem(templabel)
- end
- addy = addy + 25
- local mnwtext = vgui.Create("DTextEntry", pwmodels )
- mnwtext:SetPos( 10, addy )
- mnwtext:SetSize( 120, 20 )
- mnwtext:SetMultiline(false)
- mnwtext:SetText( "some_unique_name" )
- local tpbox = vgui.Create( "DMultiChoice", pwmodels )
- tpbox:SetPos( 130, addy )
- tpbox:SetSize( 85, 20 )
- tpbox:SetEditable( false )
- tpbox:SetText( "Model" )
- tpbox:AddChoice( "Model" )
- tpbox:AddChoice( "Sprite" )
- tpbox:AddChoice( "Quad" )
- local wboxselected = "Model"
- tpbox.OnSelect = function( p, index, value )
- wboxselected = value
- end
- local mnwbtn = vgui.Create( "DButton", pwmodels )
- mnwbtn:SetPos( 220, addy )
- mnwbtn:SetSize( 45, 20 )
- mnwbtn:SetText( "Add" )
- addy = addy + 30
- mwlist:SetPos( 10, addy )
- mwlist:SetSize( 260, 125 )
- mwlist:SetMultiSelect(false)
- mwlist:SetDrawBackground(true)
- mwlist:AddColumn("Name")
- mwlist:AddColumn("Type")
- // cache the created panels
- mwlist.OnRowSelected = function( panel, line )
- local name = mwlist:GetLine(line):GetValue(1)
- if (wep.w_panelCache[lastVisible]) then
- wep.w_panelCache[lastVisible]:SetVisible(false)
- end
- wep.w_panelCache[name]:SetVisible(true)
- lastVisible = name
- end
- addy = addy + 130
- local importbtn = vgui.Create( "DButton", pwmodels )
- importbtn:SetPos( 10, addy )
- importbtn:SetSize( 260, 20 )
- importbtn:SetText( "Import viewmodels" )
- addy = addy + 25
- local rmbtn = vgui.Create( "DButton", pwmodels )
- rmbtn:SetPos( 10, addy )
- rmbtn:SetSize( 130, 20 )
- rmbtn:SetText( "Remove selected" )
- local copybtn = vgui.Create( "DButton", pwmodels )
- copybtn:SetPos( 145, addy )
- copybtn:SetSize( 125, 20 )
- copybtn:SetText( "Copy selected" )
- addy = addy + 25
- local panely = addy
- local panelh = 580 - panely - 60
- /*** Model panel for adjusting models ***
- Name:
- Model:
- Translation x / y / z
- Rotation pitch / yaw / role
- Model size x / y / z
- Material
- Color modulation
- */
- local function CreateWorldModelPanel( name, x, y, preset_data )
- local data = wep.w_models[name]
- if (!preset_data) then preset_data = {} end
- // default data
- 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
- wep.wRenderOrder = nil
- local panel = vgui.Create( "DPanel", pwmodels )
- panel:SetPos( x, y )
- panel:SetSize( 260, panelh )
- panel:SetPaintBackground( true )
- panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
- local addy = 5
- CreateNameLabel( name, addy, panel )
- addy = addy + 25
- CreateModelModifier( data, addy, panel )
- addy = addy + 25
- CreateBoneModifier( data, addy, panel, LocalPlayer() )
- addy = addy + 25
- CreateRelativeModifier( data, addy, panel )
- addy = addy + 25
- CreatePositionModifiers( data, addy, panel )
- addy = addy + 25
- CreateAngleModifiers( data, addy, panel )
- addy = addy + 25
- CreateSizeModifiers( data, addy, panel, 3 )
- addy = addy + 25
- CreateColorModifiers( data, addy, panel )
- addy = addy + 25
- CreateSLightningModifier( data, addy, panel )
- addy = addy + 22
- CreateMaterialModifier( data, addy, panel )
- addy = addy + 25
- CreateBodygroupSkinModifier( data, addy, panel )
- return panel
- end
- /*** Sprite panel for adjusting sprites ***
- Name:
- Sprite:
- Translation x / y / z
- Sprite x / y size
- Color
- */
- local function CreateWorldSpritePanel( name, x, y, preset_data )
- local data = wep.w_models[name]
- if (!preset_data) then preset_data = {} end
- // default data
- 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
- wep.wRenderOrder = nil
- local panel = vgui.Create( "DPanel", pwmodels )
- panel:SetPos( x, y )
- panel:SetSize( 260, panelh )
- panel:SetPaintBackground( true )
- panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
- local addy = 5
- CreateNameLabel( name, addy, panel )
- addy = addy + 25
- CreateSpriteModifier( data, addy, panel )
- addy = addy + 25
- CreateBoneModifier( data, addy, panel, LocalPlayer() )
- addy = addy + 25
- CreateRelativeModifier( data, addy, panel )
- addy = addy + 25
- CreatePositionModifiers( data, addy, panel )
- addy = addy + 25
- CreateSizeModifiers( data, addy, panel, 2 )
- addy = addy + 25
- CreateColorModifiers( data, addy, panel )
- addy = addy + 25
- CreateParamModifiers( data, addy, panel )
- return panel
- end
- /*** Model panel for adjusting models ***
- Name:
- Model:
- Bone name:
- Translation x / y / z
- Rotation pitch / yaw / role
- Size
- */
- local function CreateWorldQuadPanel( name, x, y, preset_data )
- local data = wep.w_models[name]
- if (!preset_data) then preset_data = {} end
- // default data
- 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
- local panel = vgui.Create( "DPanel", pwmodels )
- panel:SetPos( x, y )
- panel:SetSize( 260, panelh )
- panel:SetPaintBackground( true )
- panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
- local addy = 5
- CreateNameLabel( name, addy, panel )
- addy = addy + 25
- CreateBoneModifier( data, addy, panel, LocalPlayer() )
- addy = addy + 25
- CreateRelativeModifier( data, addy, panel )
- addy = addy + 25
- CreatePositionModifiers( data, addy, panel )
- addy = addy + 25
- CreateAngleModifiers( data, addy, panel )
- addy = addy + 25
- CreateSizeModifiers( data, addy, panel, 1 )
- return panel
- end
- // adding button DoClick
- 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] = {}
- if (!wep.w_panelCache[new]) then
- if (wboxselected == "Model") then
- wep.w_panelCache[new] = CreateWorldModelPanel( new, 10, panely )
- elseif (wboxselected == "Sprite") then
- wep.w_panelCache[new] = CreateWorldSpritePanel( new, 10, panely )
- elseif (wboxselected == "Quad") then
- wep.w_panelCache[new] = CreateWorldQuadPanel( new, 10, panely )
- else
- Error("wtf are u doing")
- end
- end
- wep.w_panelCache[new]:SetVisible(false)
- mwlist:AddLine(new,wboxselected)
- end
- end
- for k, v in pairs( wep.save_data.w_models ) do
- wep.w_models[k] = {}
- // backwards compatability
- if (!v.bone or v.bone == "") then
- v.bone = "ValveBiped.Bip01_R_Hand"
- end
- if (v.type == "Model") then
- wep.w_panelCache[k] = CreateWorldModelPanel( k, 10, panely, v )
- elseif (v.type == "Sprite") then
- wep.w_panelCache[k] = CreateWorldSpritePanel( k, 10, panely, v )
- elseif (v.type == "Quad") then
- wep.w_panelCache[k] = CreateWorldQuadPanel( k, 10, panely, v )
- end
- wep.w_panelCache[k]:SetVisible(false)
- mwlist:AddLine(k,v.type)
- end
- local prtbtn = vgui.Create( "DButton", pwmodels)
- prtbtn:SetPos( 10, 525 )
- prtbtn:SetSize( 260, 20 )
- 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
- local pctbtn = vgui.Create( "DButton", pwmodels)
- pctbtn:SetPos( 10, 550 )
- pctbtn:SetSize( 260, 20 )
- pctbtn:SetText("Copy world model table to clipboard")
- pctbtn.DoClick = function()
- SetClipboardText(GetWModelsText())
- LocalPlayer():ChatPrint("Code copied to clipboard!")
- end
- // import viewmodels
- 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.
- end
- 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
- 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
- new_preset.pos = Vector(num*5,0,-10)
- if (v.angle) then
- new_preset.angle = Angle(0,0,0)
- end
- end
- 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
- wep.w_models[name] = {}
- if (v.type == "Model") then
- wep.w_panelCache[name] = CreateWorldModelPanel( name, 10, panely, new_preset )
- elseif (v.type == "Sprite") then
- wep.w_panelCache[name] = CreateWorldSpritePanel( name, 10, panely, new_preset )
- elseif (v.type == "Quad") then
- wep.w_panelCache[name] = CreateWorldQuadPanel( name, 10, panely, new_preset )
- end
- wep.w_panelCache[name]:SetVisible(false)
- mwlist:AddLine(name,v.type)
- num = num + 1
- end
- end
- // remove a line
- 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
- wep.w_panelCache[name]:Remove()
- wep.w_panelCache[name] = nil
- end
- mwlist:RemoveLine(line)
- end
- end
- // duplicate line
- 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
- while(wep.w_models[name]) do
- name = name.."+"
- end
- // have to fix every sub-table as well because table.Copy copies references
- 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
- wep.w_models[name] = {}
- if (new_preset.type == "Model") then
- wep.w_panelCache[name] = CreateWorldModelPanel( name, 10, panely, new_preset )
- elseif (new_preset.type == "Sprite") then
- wep.w_panelCache[name] = CreateWorldSpritePanel( name, 10, panely, new_preset )
- elseif (new_preset.type == "Quad") then
- wep.w_panelCache[name] = CreateWorldQuadPanel( name, 10, panely, new_preset )
- end
- wep.w_panelCache[name]:SetVisible(false)
- mwlist:AddLine(name,new_preset.type)
- end
- end
- // finally, return the frame!
- return f
- end
- function SWEP:OpenMenu( preset )
- if (!self.Frame) then
- self.Frame = CreateMenu( preset )
- end
- if (ValidEntity(self.Frame)) then
- self.Frame:SetVisible(true)
- self.Frame:MakePopup()
- else
- self.Frame = nil
- end
- end
- function SWEP:OnRemove()
- self:CleanMenu()
- end
- function SWEP:OnDropWeapon()
- self.LastOwner = nil
- if (!self.Frame) then return end
- self.Frame:Close()
- end
- function SWEP:CleanMenu()
- self:RemoveModels()
- if (!self.Frame) then return end
- self.v_modelListing = nil
- self.w_modelListing = nil
- self.v_panelCache = {}
- self.w_panelCache = {}
- self.Frame:Remove()
- self.Frame = nil
- end
- function SWEP:HUDShouldDraw( el )
- return el != "CHudAmmo" and el != "CHudSecondaryAmmo"
- end
- /***************************
- Third person view
- ***************************/
- function TPCalcView(pl, pos, angles, fov)
- local wep = pl:GetActiveWeapon()
- if (!ValidEntity(wep) or !wep.IsSCK or !wep.useThirdPerson) then
- wep.useThirdPerson = false
- return
- end
- local look_pos = pos
- local rhand_bone = pl:LookupBone("ValveBiped.Bip01_R_Hand")
- if (rhand_bone) then
- look_pos = pl:GetBonePosition( rhand_bone )
- end
- local view = {}
- view.origin = look_pos + ((pl:GetAngles()+wep.thirdPersonAngle):Forward()*wep.thirdPersonDis)
- view.angles = (look_pos - view.origin):Angle()
- view.fov = fov
- return view
- end
- oldCVHooks = {}
- hooksCleared = false
- local function CVHookReset()
- //print("Hook reset")
- hook.Remove( "CalcView", "TPCalcView" )
- for k, v in pairs( oldCVHooks ) do
- hook.Add("CalcView", k, v)
- end
- oldCVHooks = {}
- hooksCleared = false
- end
- function SWEP:CalcViewHookManagement()
- if (!hooksCleared) then
- local CVHooks = hook.GetTable()["CalcView"]
- if CVHooks then
- for k, v in pairs( CVHooks ) do
- oldCVHooks[k] = v
- hook.Remove( "CalcView", k )
- end
- end
- hook.Add("CalcView", "TPCalcView", TPCalcView)
- hooksCleared = true
- else
- timer.Create("CVHookReset", 2, 1, CVHookReset)
- end
- end
- hook.Add("ShouldDrawLocalPlayer", "ThirdPerson23", function(pl)
- local wep = pl:GetActiveWeapon()
- if (ValidEntity(wep) and wep.useThirdPerson) then
- return true
- end
- end)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement