This week only. Pastebin PRO Accounts Christmas Special! Don't miss out!Want more features on Pastebin? Sign Up, it's FREE!
Guest

CKit SWEP

By: a guest on Nov 6th, 2011  |  syntax: Lua  |  size: 143.85 KB  |  views: 113  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. if SERVER then
  2.     AddCSLuaFile("shared.lua")
  3. end
  4.  
  5. if CLIENT then
  6.  
  7.     SWEP.PrintName        = "SWEP Construction Kit"
  8.     SWEP.Author            = "Clavus"
  9.     SWEP.Contact        = "clavus@clavusstudios.com"
  10.     SWEP.Purpose        = "Design SWEP ironsights and clientside models"
  11.     SWEP.Instructions    = "http://tinyurl.com/swepkit"
  12.     SWEP.Slot            = 5
  13.     SWEP.SlotPos        = 10
  14.     SWEP.ViewModelFlip    = false
  15.    
  16.     SWEP.DrawCrosshair    = false
  17.    
  18.     SWEP.ShowViewModel     = true
  19.     SWEP.ShowWorldModel = true
  20.    
  21. end
  22.  
  23. SWEP.HoldType = "pistol"
  24. SWEP.HoldTypes = { "normal", "melee", "melee2", "fist",
  25. "knife", "smg", "ar2", "pistol", "rpg", "physgun",
  26. "grenade", "shotgun", "crossbow", "slam" }
  27.  
  28. SWEP.Spawnable            = true
  29. SWEP.AdminSpawnable        = true
  30.  
  31. SWEP.ViewModel            = "models/weapons/v_pistol.mdl"
  32. SWEP.WorldModel            = "models/weapons/w_pistol.mdl"
  33. SWEP.CurWorldModel         = "models/weapons/w_pistol.mdl" // this is where shit gets hacky
  34.  
  35. SWEP.ViewModelFOV        = 70
  36. SWEP.BobScale            = 0
  37. SWEP.SwayScale            = 0
  38.  
  39. SWEP.Primary.Automatic    = false
  40.  
  41. SWEP.IronsightTime = 0.2
  42.  
  43. SWEP.IronSightsPos = Vector(0, 0, 0)
  44. SWEP.IronSightsAng = Vector(0, 0, 0)
  45.  
  46. local sck_class = ""
  47.  
  48. function SWEP:Initialize()
  49.  
  50.     self:SetWeaponHoldType(self.HoldType)
  51.    
  52.     self:SetIronSights( true )
  53.     self:ResetIronSights()
  54.    
  55.     if CLIENT then
  56.         self:CreateWeaponWorldModel()
  57.         self:ClientInit()
  58.         if (not file.IsDir("swep_construction_kit")) then
  59.             file.CreateDir("swep_construction_kit")
  60.         end
  61.     end
  62.    
  63.     self.Dropped = false
  64.    
  65.     sck_class = self:GetClass()
  66.    
  67. end
  68.  
  69. function SWEP:Equip()
  70.  
  71.     self.Dropped = false
  72.  
  73. end
  74.  
  75. function SWEP:PrimaryAttack()
  76.  
  77.     self.Weapon:SetNextPrimaryFire(CurTime() + 0.2)
  78.  
  79.     if CLIENT then
  80.         self:OpenMenu()
  81.     end
  82.     if SinglePlayer() then
  83.         self.Owner:SendLua("LocalPlayer():GetActiveWeapon():OpenMenu()")
  84.     end
  85.    
  86. end
  87.  
  88. function SWEP:SecondaryAttack()
  89.    
  90.     self.Weapon:SetNextSecondaryFire(CurTime() + 0.2)
  91.    
  92.     if CLIENT then
  93.         self:OpenMenu()
  94.     end
  95.     if SinglePlayer() then
  96.         self.Owner:SendLua("LocalPlayer():GetActiveWeapon():OpenMenu()")
  97.     end
  98.    
  99. end
  100.  
  101.  
  102. function SWEP:SetupDataTables()
  103.  
  104.     self:DTVar( "Bool", 0, "ironsights" )
  105.     self:DTVar( "Bool", 1, "thirdperson" )
  106.    
  107. end
  108.  
  109. function SWEP:ToggleIronSights()
  110.     self.dt.ironsights = !self.dt.ironsights
  111. end
  112.  
  113. function SWEP:SetIronSights( b )
  114.     self.dt.ironsights = b
  115. end
  116.  
  117. function SWEP:GetIronSights()
  118.     return self.dt.ironsights
  119. end
  120.  
  121. function SWEP:ResetIronSights()
  122.     RunConsoleCommand("_sp_ironsight_x", 0)
  123.     RunConsoleCommand("_sp_ironsight_y", 0)
  124.     RunConsoleCommand("_sp_ironsight_z", 0)
  125.     RunConsoleCommand("_sp_ironsight_pitch", 0)
  126.     RunConsoleCommand("_sp_ironsight_yaw", 0)
  127.     RunConsoleCommand("_sp_ironsight_roll", 0)
  128. end
  129.  
  130. function SWEP:ToggleThirdPerson()
  131.     self.dt.thirdperson = !self.dt.thirdperson
  132.     if (self.dt.thirdperson) then self.Owner:CrosshairDisable()
  133.     else self.Owner:CrosshairEnable() end
  134. end
  135.  
  136. function SWEP:SetThirdPerson( b )
  137.     self.dt.thirdperson = b
  138.     if (self.dt.thirdperson) then self.Owner:CrosshairDisable()
  139.     else self.Owner:CrosshairEnable() end
  140. end
  141.  
  142. function SWEP:GetThirdPerson()
  143.     return self.dt.thirdperson
  144. end
  145.  
  146. function SWEP:GetViewModelPosition(pos, ang)
  147.  
  148.     local bIron = self.dt.ironsights
  149.     local fIronTime = self.fIronTime or 0
  150.  
  151.     if (not bIron and fIronTime < CurTime() - self.IronsightTime) then
  152.         return pos, ang
  153.     end
  154.    
  155.     self.IronSightsPos, self.IronSightsAng = self:GetIronSightCoordination()
  156.  
  157.     local Mul = 1.0
  158.  
  159.     if (fIronTime > CurTime() - self.IronsightTime) then
  160.         Mul = math.Clamp((CurTime() - fIronTime) / self.IronsightTime, 0, 1)
  161.  
  162.         if not bIron then Mul = 1 - Mul end
  163.     end
  164.  
  165.     local Offset    = self.IronSightsPos
  166.  
  167.     if (self.IronSightsAng) then
  168.         ang = ang * 1
  169.         ang:RotateAroundAxis(ang:Right(),         self.IronSightsAng.x * Mul)
  170.         ang:RotateAroundAxis(ang:Up(),         self.IronSightsAng.y * Mul)
  171.         ang:RotateAroundAxis(ang:Forward(),     self.IronSightsAng.z * Mul)
  172.     end
  173.  
  174.     local Right     = ang:Right()
  175.     local Up         = ang:Up()
  176.     local Forward     = ang:Forward()
  177.  
  178.     pos = pos + Offset.x * Right * Mul
  179.     pos = pos + Offset.y * Forward * Mul
  180.     pos = pos + Offset.z * Up * Mul
  181.    
  182.     return pos, ang
  183. end
  184.  
  185. SWEP.ir_x = CreateConVar( "_sp_ironsight_x", 0.0 )
  186. SWEP.ir_y = CreateConVar( "_sp_ironsight_y", 0.0 )
  187. SWEP.ir_z = CreateConVar( "_sp_ironsight_z", 0.0 )
  188. SWEP.ir_p = CreateConVar( "_sp_ironsight_pitch", 0.0 )
  189. SWEP.ir_yw = CreateConVar( "_sp_ironsight_yaw", 0.0 )
  190. SWEP.ir_r = CreateConVar( "_sp_ironsight_roll", 0.0 )
  191.  
  192. function SWEP:GetIronSightCoordination()
  193.    
  194.     local vec = Vector( self.ir_x:GetFloat(), self.ir_y:GetFloat(), self.ir_z:GetFloat() )
  195.     local ang = Vector( self.ir_p:GetFloat(), self.ir_yw:GetFloat(), self.ir_r:GetFloat() )
  196.     return vec, ang
  197.    
  198. end
  199.  
  200. function SWEP:GetHoldTypes()
  201.     return self.HoldTypes
  202. end
  203.  
  204. SWEP.LastOwner = nil
  205. /***************************
  206.     Helper functions
  207. ***************************/
  208. SWEP.IsSCK = true
  209. local function GetSWEP( pl )
  210.     local wep = pl:GetActiveWeapon()
  211.     if (ValidEntity(wep) and wep.IsSCK) then
  212.         return wep
  213.     end
  214.     //Error("Not holding SWEP Construction Kit!")
  215.     return NULL
  216. end
  217.    
  218. /***********************************************
  219.         SERVER CODE YEEEEEAAAAAHHH
  220. ***********************************************/
  221. if SERVER then
  222.  
  223.     local function CanPickup( pl, wep )
  224.        
  225.         if (wep:GetClass() == sck_class) then
  226.             return pl:KeyDown(IN_RELOAD) or !wep.Dropped
  227.         end
  228.        
  229.     end
  230.     hook.Add("PlayerCanPickupWeapon","SCKPickup",CanPickup)
  231.        
  232.     function SWEP:Deploy()
  233.         self.LastOwner = self.Owner
  234.     end
  235.  
  236.     function SWEP:OnDrop()
  237.         if (ValidEntity(self.LastOwner)) then
  238.             self.LastOwner:SendLua("Entity("..self:EntIndex().."):OnDropWeapon()")
  239.         end
  240.         self.LastOwner = nil
  241.     end
  242.    
  243.     local function Cmd_SetHoldType( pl, cmd, args )
  244.  
  245.         local holdtype = args[1]
  246.         local wep = GetSWEP( pl )
  247.         if (ValidEntity(wep) and holdtype and table.HasValue( wep:GetHoldTypes(), holdtype )) then
  248.             wep:SetWeaponHoldType( holdtype )
  249.             wep.HoldType = holdtype
  250.         end    
  251.  
  252.     end
  253.     concommand.Add("swepck_setholdtype", Cmd_SetHoldType)
  254.  
  255.     local function Cmd_ToggleThirdPerson( pl, cmd, args )
  256.  
  257.         local wep = GetSWEP( pl )
  258.         if (ValidEntity(wep)) then
  259.             wep:ToggleThirdPerson()
  260.         end
  261.  
  262.     end
  263.     concommand.Add("swepck_togglethirdperson", Cmd_ToggleThirdPerson)
  264.    
  265.     local function Cmd_PlayAnimation( pl, cmd, args )
  266.  
  267.         local wep = GetSWEP( pl )
  268.         if (ValidEntity(wep)) then
  269.             local anim = tonumber(args[1] or 0)
  270.             wep:ResetSequenceInfo()
  271.             wep:SendWeaponAnim( anim )
  272.         end
  273.        
  274.     end
  275.     concommand.Add("swepck_playanimation", Cmd_PlayAnimation)
  276.    
  277.     local function Cmd_ToggleSights( pl, cmd, args )
  278.  
  279.         local wep = GetSWEP( pl )
  280.         if (ValidEntity(wep)) then
  281.             wep:ToggleIronSights()
  282.         end
  283.  
  284.     end
  285.     concommand.Add("swepck_toggleironsights", Cmd_ToggleSights)
  286.  
  287.     local function Cmd_ViewModelFOV( pl, cmd, args )
  288.  
  289.         local wep = GetSWEP( pl )
  290.         if (ValidEntity(wep)) then
  291.             wep.ViewModelFOV = tonumber(args[1] or wep.ViewModelFOV)
  292.         end
  293.        
  294.     end
  295.     concommand.Add("swepck_viewmodelfov", Cmd_ViewModelFOV)
  296.    
  297.     local function Cmd_ViewModel( pl, cmd, args )
  298.  
  299.         local wep = GetSWEP( pl )
  300.         if (!ValidEntity(wep)) then return end
  301.         local newmod = args[1] or wep.ViewModel
  302.         newmod = newmod..".mdl"
  303.         if !file.Exists (newmod,true) then return end
  304.        
  305.         //util.PrecacheModel(newmod)
  306.         wep.ViewModel = newmod
  307.         pl:GetViewModel():SetWeaponModel(Model(newmod), wep)
  308.         pl:SendLua([[LocalPlayer():GetActiveWeapon().ViewModel = "]]..newmod..[["]])
  309.         //pl:SendLua([[LocalPlayer():GetViewModel():SetModel("]]..newmod..[[")]])
  310.         pl:SendLua([[LocalPlayer():GetViewModel():SetWeaponModel(Model("]]..newmod..[["), Entity(]]..wep:EntIndex()..[[))]])
  311.        
  312.         local quickswitch = nil
  313.         for k, v in pairs( pl:GetWeapons() ) do
  314.             if (v:GetClass() != wep:GetClass()) then
  315.                 quickswitch = v:GetClass()
  316.                 break
  317.             end
  318.         end
  319.        
  320.         if (quickswitch) then
  321.             pl:SelectWeapon( quickswitch )
  322.             pl:SelectWeapon( wep:GetClass() )
  323.         else
  324.             pl:ChatPrint("Switch weapons to make the new viewmodel show up")
  325.         end
  326.        
  327.         //print("Changed viewmodel to \""..wep.ViewModel.."\"")
  328.        
  329.     end
  330.     concommand.Add("swepck_viewmodel", Cmd_ViewModel)
  331.    
  332.     local function Cmd_WorldModel( pl, cmd, args )
  333.  
  334.         local wep = GetSWEP( pl )
  335.         if (!ValidEntity(wep)) then return end
  336.         local newmod = args[1] or wep.CurWorldModel
  337.         newmod = newmod..".mdl"
  338.         if !file.Exists (newmod,true) then return end
  339.        
  340.         util.PrecacheModel(newmod)
  341.         wep.CurWorldModel = newmod
  342.         wep:SetModel(newmod)
  343.         pl:SendLua([[LocalPlayer():GetActiveWeapon().CurWorldModel = "]]..newmod..[["]])
  344.         pl:SendLua([[LocalPlayer():GetActiveWeapon():CreateWeaponWorldModel()]])
  345.         //print("Changed worldmodel to \""..wep.CurWorldModel.."\"")
  346.        
  347.     end
  348.     concommand.Add("swepck_worldmodel", Cmd_WorldModel)
  349.    
  350.     local function Cmd_DropWep( pl, cmd, args )
  351.  
  352.         local wep = GetSWEP( pl )
  353.         if (ValidEntity(wep)) then
  354.             wep.Dropped = true
  355.             pl:DropWeapon(wep)
  356.         end
  357.        
  358.     end
  359.     concommand.Add("swepck_dropwep", Cmd_DropWep)
  360.    
  361. end
  362.  
  363. /***********************************************
  364.         CLIENT CODE WHOOOOOOOOOOO
  365. ***********************************************/
  366. if CLIENT then
  367.  
  368.     surface.CreateFont("Arial", 12, 500, true, false, "12ptFont")
  369.     surface.CreateFont("Arial", 24, 500, true, false, "24ptFont")
  370.    
  371.     local tutorialURL = "http://www.facepunch.com/threads/1032378-SWEP-Construction-Kit-developer-tool-for-modifying-viewmodels-ironsights/"
  372.     SWEP.useThirdPerson = false
  373.     SWEP.thirdPersonAngle = Angle(0,-90,0)
  374.     SWEP.thirdPersonDis = 100
  375.     SWEP.mlast_x = ScrW()/2
  376.     SWEP.mlast_y = ScrH()/2
  377.    
  378.     local playerBones = { "ValveBiped.Bip01_Head1", "ValveBiped.Bip01_Spine",
  379.     "ValveBiped.Anim_Attachment_RH", "ValveBiped.Bip01_R_Hand", "ValveBiped.Bip01_R_Forearm",
  380.     "ValveBiped.Bip01_R_Foot", "ValveBiped.Bip01_R_Thigh", "ValveBiped.Bip01_R_Calf",
  381.     "ValveBiped.Bip01_R_Shoulder", "ValveBiped.Bip01_R_Elbow",
  382.     "ValveBiped.Anim_Attachment_LH", "ValveBiped.Bip01_L_Hand", "ValveBiped.Bip01_L_Forearm",
  383.     "ValveBiped.Bip01_L_Foot", "ValveBiped.Bip01_L_Thigh", "ValveBiped.Bip01_L_Calf",
  384.     "ValveBiped.Bip01_L_Shoulder", "ValveBiped.Bip01_L_Elbow" }
  385.    
  386.     SWEP.v_models = {}
  387.     SWEP.v_panelCache = {}
  388.     SWEP.v_modelListing = nil
  389.     SWEP.v_bonemods = {}
  390.     SWEP.v_modelbonebox = nil
  391.    
  392.     SWEP.w_models = {}
  393.     SWEP.w_panelCache = {}
  394.     SWEP.w_modelListing = nil
  395.    
  396.     SWEP.world_model = nil
  397.     SWEP.cur_wmodel = nil
  398.    
  399.     SWEP.browser_callback = nil
  400.     SWEP.modelbrowser = nil
  401.     SWEP.modelbrowser_list = nil
  402.     SWEP.matbrowser = nil
  403.     SWEP.matbrowser_list = nil
  404.    
  405.     SWEP.save_data = {}
  406.     local save_data_template = {
  407.         ViewModel = SWEP.ViewModel,
  408.         CurWorldModel = SWEP.CurWorldModel,
  409.         w_models = {},
  410.         v_models = {},
  411.         v_bonemods = {},
  412.         ViewModelFOV = SWEP.ViewModelFOV,
  413.         HoldType = SWEP.HoldType,
  414.         ViewModelFlip = SWEP.ViewModelFlip,
  415.         IronSightsEnabled = true,
  416.         IronSightsPos = SWEP.IronSightsPos,
  417.         IronSightsAng = SWEP.IronSightsAng,
  418.         ShowViewModel = true,
  419.         ShowWorldModel = true
  420.     }
  421.  
  422.     SWEP.ir_drag = {
  423.         x = { true, "-x", 25 },
  424.         y = { false, "y", 25 },
  425.         z = { true, "y", 25 },
  426.         pitch = { false, "y", 10 },
  427.         yaw = { false, "x", 10 },
  428.         roll = { false, "y", 10 }
  429.     }
  430.     local drag_modes = {
  431.         ["x / z"] = { "x", "z" },
  432.         ["y"] = { "y" },
  433.         ["pitch / yaw"] = { "pitch", "yaw" },
  434.         ["roll"] = { "roll" }    
  435.     }
  436.     SWEP.cur_drag_mode = "x / z"
  437.     SWEP.Frame = nil
  438.    
  439.     local function PrintVec( vec )
  440.         local px, py, pz = math.floor(vec.x*1000)/1000,math.floor(vec.y*1000)/1000,math.floor(vec.z*1000)/1000
  441.         return "Vector("..px..", "..py..", "..pz..")"
  442.     end
  443.    
  444.     local function PrintAngle( angle )
  445.         local pp, py, pr = math.floor(angle.p*1000)/1000,math.floor(angle.y*1000)/1000,math.floor(angle.r*1000)/1000
  446.         return "Angle("..pp..", "..py..", "..pr..")"
  447.     end
  448.    
  449.     local function PrintColor( col )
  450.         return "Color("..col.r..", "..col.g..", "..col.b..", "..col.a..")"
  451.     end    
  452.  
  453.     function SWEP:ClientInit()
  454.    
  455.         // init view model bone build function
  456.         self.BuildViewModelBones = function( s )
  457.             if LocalPlayer():GetActiveWeapon() == self and self.v_bonemods then
  458.                 for k, v in pairs( self.v_bonemods ) do
  459.                     local bone = s:LookupBone(k)
  460.                     if (!bone) then continue end
  461.                     local m = s:GetBoneMatrix(bone)
  462.                     if (!m) then continue end
  463.                     m:Scale(v.scale)
  464.                     m:Rotate(v.angle)
  465.                     m:Translate(v.pos)
  466.                     s:SetBoneMatrix(bone, m)
  467.                 end
  468.             end
  469.         end
  470.        
  471.     end
  472.    
  473.     // Populates a DMultiChoice with all the bones of the specified entity
  474.     // returns if it has a first option
  475.     local function PopulateBoneList( choicelist, ent )
  476.         if (!ValidEntity(choicelist)) then return false end
  477.         if (!ValidEntity(ent)) then return end
  478.        
  479.         if (ent == LocalPlayer()) then
  480.             // if the local player is in third person, his bone lookup is all messed up so
  481.             // we just use the predefined playerBones table
  482.             for k, v in pairs(playerBones) do
  483.                 choicelist:AddChoice(v)
  484.             end
  485.            
  486.             return true
  487.         else
  488.             local hasfirstoption
  489.             for i = 0, ent:GetBoneCount() - 1 do
  490.                 local name = ent:GetBoneName(i)
  491.                 if (ent:LookupBone(name)) then // filter out invalid bones
  492.                     choicelist:AddChoice(name)
  493.                     if (!firstoption) then hasfirstoption = true end
  494.                 end
  495.             end
  496.            
  497.             return hasfirstoption
  498.         end
  499.     end
  500.    
  501.     local function GetWeaponPrintText( wep )
  502.        
  503.         str = ""
  504.         str = str.."SWEP.HoldType = \""..wep.HoldType.."\"\n"
  505.         str = str.."SWEP.ViewModelFOV = "..wep.ViewModelFOV.."\n"
  506.         str = str.."SWEP.ViewModelFlip = "..tostring(wep.ViewModelFlip).."\n"
  507.         str = str.."SWEP.ViewModel = \""..wep.ViewModel.."\"\n"
  508.         str = str.."SWEP.WorldModel = \""..wep.CurWorldModel.."\"\n"
  509.         str = str.."SWEP.ShowViewModel = "..tostring(wep.ShowViewModel).."\n"
  510.         str = str.."SWEP.ShowWorldModel = "..tostring(wep.ShowWorldModel).."\n"
  511.         str = str.."SWEP.ViewModelBoneMods = {"
  512.         local i = 0
  513.         local num = table.Count( wep.v_bonemods )
  514.         for k, v in pairs( wep.v_bonemods ) do
  515.             if !(v.scale == Vector(1,1,1) and v.pos == Vector(0,0,0) and v.angle == Angle(0,0,0)) then
  516.                 if (i == 0) then str = str.."\n" end
  517.                 i = i + 1
  518.                 str = str.."\t[\""..k.."\"] = { scale = "..PrintVec( v.scale )..", pos = "..PrintVec( v.pos )..", angle = "..PrintAngle( v.angle ).." }"
  519.                
  520.                 if (i < num) then str = str.."," end
  521.                 str = str.."\n"
  522.             end
  523.         end
  524.         str = str.."}"
  525.        
  526.         str = string.Replace(str,",\n}","\n}") // remove the last comma
  527.        
  528.         return str
  529.        
  530.     end
  531.    
  532.     local function GetIronSightPrintText( vec, ang )
  533.         return "SWEP.IronSightsPos = "..PrintVec( vec ).."\nSWEP.IronSightsAng = "..PrintVec( ang )
  534.     end
  535.    
  536.     local function GetVModelsText()
  537.    
  538.         local wep = GetSWEP( LocalPlayer() )
  539.         if (!ValidEntity(wep)) then return "" end
  540.        
  541.         local str = ("SWEP.VElements = {\n")
  542.         local i = 0
  543.         local num = table.Count(wep.v_models)
  544.         for k, v in pairs( wep.v_models ) do
  545.        
  546.             if (v.type == "Model") then
  547.                 str = str.."\t[\""..k.."\"] = { type = \"Model\", model = \""..v.model.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
  548.                 str = str..", angle = "..PrintAngle( v.angle )..", size = "..PrintVec(v.size)..", color = "..PrintColor( v.color )
  549.                 str = str..", surpresslightning = "..tostring(v.surpresslightning)..", material = \""..v.material.."\", skin = "..v.skin
  550.                 str = str..", bodygroup = {"
  551.                 local i = 0
  552.                 for k, v in pairs( v.bodygroup ) do
  553.                     if (v <= 0) then continue end
  554.                     if ( i != 0 ) then str = str..", " end
  555.                     i = 1
  556.                     str = str.."["..k.."] = "..v
  557.                 end
  558.                 str = str.."} }"
  559.             elseif (v.type == "Sprite") then
  560.                 str = str.."\t[\""..k.."\"] = { type = \"Sprite\", sprite = \""..v.sprite.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
  561.                 str = str..", size = { x = "..v.size.x..", y = "..v.size.y.." }, color = "..PrintColor( v.color )..", nocull = "..tostring(v.nocull)
  562.                 str = str..", additive = "..tostring(v.additive)..", vertexalpha = "..tostring(v.vertexalpha)..", vertexcolor = "..tostring(v.vertexcolor)
  563.                 str = str..", ignorez = "..tostring(v.ignorez).."}"
  564.             elseif (v.type == "Quad") then
  565.                 str = str.."\t[\""..k.."\"] = { type = \"Quad\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)..", angle = "..PrintAngle( v.angle )
  566.                 str = str..", size = "..v.size..", draw_func = nil}"
  567.             end
  568.            
  569.             if (v.type) then
  570.                 i = i + 1
  571.                 if (i < num) then str = str.."," end
  572.                 str = str.."\n"
  573.             end
  574.         end
  575.         str = str.."}"
  576.         return str
  577.     end
  578.    
  579.     local function GetWModelsText()
  580.    
  581.         local wep = GetSWEP( LocalPlayer() )
  582.         if (!ValidEntity(wep)) then return "" end
  583.    
  584.         local str = ("SWEP.WElements = {\n")
  585.         local i = 0
  586.         local num = table.Count(wep.w_models)
  587.         for k, v in pairs( wep.w_models ) do
  588.        
  589.             if (v.type == "Model") then
  590.                 str = str.."\t[\""..k.."\"] = { type = \"Model\", model = \""..v.model.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
  591.                 str = str..", angle = "..PrintAngle( v.angle )..", size = "..PrintVec(v.size)..", color = "..PrintColor( v.color )
  592.                 str = str..", surpresslightning = "..tostring(v.surpresslightning)..", material = \""..v.material.."\", skin = "..v.skin
  593.                 str = str..", bodygroup = {"
  594.                 local i = 0
  595.                 for k, v in pairs( v.bodygroup ) do
  596.                     if (v <= 0) then continue end
  597.                     if ( i != 0 ) then str = str..", " end
  598.                     i = 1
  599.                     str = str.."["..k.."] = "..v
  600.                 end
  601.                 str = str.."} }"
  602.             elseif (v.type == "Sprite") then
  603.                 str = str.."\t[\""..k.."\"] = { type = \"Sprite\", sprite = \""..v.sprite.."\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)
  604.                 str = str..", size = { x = "..v.size.x..", y = "..v.size.y.." }, color = "..PrintColor( v.color )..", nocull = "..tostring(v.nocull)
  605.                 str = str..", additive = "..tostring(v.additive)..", vertexalpha = "..tostring(v.vertexalpha)..", vertexcolor = "..tostring(v.vertexcolor)
  606.                 str = str..", ignorez = "..tostring(v.ignorez).."}"
  607.             elseif (v.type == "Quad") then
  608.                 str = str.."\t[\""..k.."\"] = { type = \"Quad\", bone = \""..v.bone.."\", rel = \""..v.rel.."\", pos = "..PrintVec(v.pos)..", angle = "..PrintAngle( v.angle )
  609.                 str = str..", size = "..v.size..", draw_func = nil}"
  610.             end
  611.            
  612.             if (v.type) then
  613.                 i = i + 1
  614.                 if (i < num) then str = str.."," end
  615.                 str = str.."\n"
  616.             end
  617.         end
  618.         str = str.."}"
  619.         return str
  620.     end
  621.    
  622.     local function ClearViewModels()
  623.    
  624.         local wep = GetSWEP( LocalPlayer() )
  625.    
  626.         wep.v_models = {}
  627.         if (wep.v_modelListing) then wep.v_modelListing:Clear() end
  628.         for k, v in pairs( wep.v_panelCache ) do
  629.             if (v) then
  630.                 v:Remove()
  631.             end
  632.         end
  633.         wep.v_panelCache = {}
  634.     end
  635.    
  636.     local function RefreshViewModelBoneMods()
  637.    
  638.         local wep = GetSWEP( LocalPlayer() )
  639.         if (!ValidEntity(wep)) then return end
  640.        
  641.         if (!ValidEntity(wep.v_modelbonebox)) then return end
  642.         wep.v_bonemods = {}
  643.        
  644.         wep.v_modelbonebox:Clear()
  645.        
  646.         timer.Destroy("repop")
  647.        
  648.         timer.Create("repop", 1, 1, function()
  649.             local option = PopulateBoneList( wep.v_modelbonebox, LocalPlayer():GetViewModel() )
  650.             if (option) then
  651.                 wep.v_modelbonebox:ChooseOptionID(1)
  652.             end
  653.         end)
  654.    
  655.     end
  656.    
  657.     local function ClearWorldModels()
  658.        
  659.         local wep = GetSWEP( LocalPlayer() )
  660.         if (!ValidEntity(wep)) then return end
  661.    
  662.         wep.w_models = {}
  663.         if (wep.w_modelListing) then wep.w_modelListing:Clear() end
  664.         for k, v in pairs( wep.w_panelCache ) do
  665.             if (v) then
  666.                 v:Remove()
  667.             end
  668.         end
  669.         wep.w_panelCache = {}
  670.     end
  671.    
  672.     function SWEP:CreateWeaponWorldModel()
  673.        
  674.         local model = self.CurWorldModel
  675.        
  676.         if ((!self.world_model or (ValidEntity(self.world_model) and self.cur_wmodel != model)) and
  677.             string.find(model, ".mdl") and file.Exists (model,true) ) then
  678.            
  679.             if ValidEntity(self.world_model) then self.world_model:Remove() end
  680.             self.world_model = ClientsideModel(model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
  681.             if (ValidEntity(self.world_model)) then
  682.                 self.world_model:SetParent(self.Owner)
  683.                 self.world_model:SetNoDraw(true)
  684.                 self.cur_wmodel = model
  685.                 if (self.world_model:LookupBone( "ValveBiped.Bip01_R_Hand" )) then
  686.                     self.world_model:AddEffects(EF_BONEMERGE)
  687.                 end
  688.             else
  689.                 self.world_model = nil
  690.                 self.cur_wmodel = nil
  691.             end
  692.  
  693.         end
  694.        
  695.     end
  696.  
  697.     function SWEP:CreateModels( tab )
  698.    
  699.         // Create the clientside models here because Garry says we can't do it in the render hook
  700.        for k, v in pairs( tab ) do
  701.            if (v.type == "Model" and v.model and v.model != "" and (!ValidEntity(v.modelEnt) or v.createdModel != v.model) and
  702.                    string.find(v.model, ".mdl") and file.Exists (v.model,true) ) then
  703.                
  704.                v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
  705.                if (ValidEntity(v.modelEnt)) then
  706.                    v.modelEnt:SetPos(self:GetPos())
  707.                    v.modelEnt:SetAngles(self:GetAngles())
  708.                    v.modelEnt:SetParent(self)
  709.                    v.modelEnt:SetNoDraw(true)
  710.                    v.createdModel = v.model
  711.                else
  712.                    v.modelEnt = nil
  713.                end
  714.                
  715.            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
  716.                
  717.                local name = v.sprite.."-"
  718.                local params = { ["$basetexture"] = v.sprite }
  719.                // make sure we create a unique name based on the selected options
  720.                local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
  721.                for i, j in pairs( tocheck ) do
  722.                    if (v[j]) then
  723.                        params["$"..j] = 1
  724.                        name = name.."1"
  725.                    else
  726.                        name = name.."0"
  727.                    end
  728.                end
  729.  
  730.                v.createdSprite = v.sprite
  731.                v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
  732.                
  733.            end
  734.        end
  735.        
  736.    end
  737.    
  738.    function SWEP:Think()
  739.        
  740.        self:CreateModels( self.v_models )
  741.        self:CreateModels( self.w_models )
  742.        
  743.        // Some hacky shit to get 3rd person view compatible with
  744.        // other addons that override CalcView
  745.        self:CalcViewHookManagement()
  746.        
  747.        /************************
  748.            Camera fiddling
  749.        ************************/
  750.        self.useThirdPerson = self:GetThirdPerson()
  751.        
  752.        local mx, my = gui.MousePos()
  753.        local diffx, diffy = (mx - self.mlast_x), (my - self.mlast_y)
  754.        
  755.        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
  756.        
  757.            if (self.useThirdPerson) then
  758.            
  759.                if (input.IsKeyDown(KEY_E)) then
  760.                    self.thirdPersonDis = math.Clamp( self.thirdPersonDis + diffy, 10, 500 )
  761.                else
  762.                    self.thirdPersonAngle = self.thirdPersonAngle + Angle( diffy/2, diffx/2, 0 )
  763.                end
  764.                
  765.            else
  766.                // ironsight adjustment
  767.                for k, v in pairs( self.ir_drag ) do
  768.                    if (v[1]) then
  769.                        local temp = GetConVar( "_sp_ironsight_"..k ):GetFloat()
  770.                        if (v[2] == "x") then
  771.                            local add = -(diffx/v[3])
  772.                            if (self.ViewModelFlip) then add = add*-1 end
  773.                            RunConsoleCommand( "_sp_ironsight_"..k, temp + add )
  774.                        elseif (v[2] == "-x") then
  775.                            local add = diffx/v[3]
  776.                            if (self.ViewModelFlip) then add = add*-1 end
  777.                            RunConsoleCommand( "_sp_ironsight_"..k, temp + add )
  778.                        elseif (v[2] == "y") then
  779.                            RunConsoleCommand( "_sp_ironsight_"..k, temp - diffy/v[3] )
  780.                        end
  781.                    end
  782.                end
  783.            
  784.            end
  785.            
  786.        end
  787.        
  788.        self.mlast_x, self.mlast_y = mx, my
  789.    end
  790.    
  791.    function SWEP:RemoveModels()
  792.        for k, v in pairs( self.v_models ) do
  793.            if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
  794.        end
  795.        for k, v in pairs( self.w_models ) do
  796.            if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
  797.        end
  798.        self.v_models = {}
  799.        self.w_models = {}
  800.        
  801.        if (ValidEntity(self.world_model)) then
  802.            self.world_model:Remove()
  803.            self.world_model = nil
  804.            self.cur_wmodel = nil
  805.        end
  806.    end
  807.  
  808.    function SWEP:GetBoneOrientation( basetab, name, ent, bone_override, buildup )
  809.        
  810.        local bone, pos, ang
  811.        local tab = basetab[name]
  812.        
  813.        if (tab.rel and tab.rel != "") then
  814.  
  815.            local v = basetab[tab.rel]
  816.            
  817.            if (!v) then return end
  818.            
  819.            if (!buildup) then
  820.                buildup = {}
  821.            end
  822.            
  823.            table.insert(buildup, name)
  824.            if (table.HasValue(buildup, tab.rel)) then return end
  825.            
  826.            // Technically, if there exists an element with the same name as a bone
  827.            // you can get in an infinite loop. Let's just hope nobody's that stupid.
  828.            pos, ang = self:GetBoneOrientation( basetab, tab.rel, ent, nil, buildup )
  829.            
  830.            if (!pos) then return end
  831.            
  832.            pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  833.            ang:RotateAroundAxis(ang:Up(), v.angle.y)
  834.            ang:RotateAroundAxis(ang:Right(), v.angle.p)
  835.            ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  836.                
  837.        else
  838.        
  839.            bone = ent:LookupBone(bone_override or tab.bone)
  840.  
  841.            if (!bone) then return end
  842.            
  843.            pos, ang = Vector(0,0,0), Angle(0,0,0)
  844.            local m = ent:GetBoneMatrix(bone)
  845.            if (m) then
  846.                pos, ang = m:GetTranslation(), m:GetAngle()
  847.            end
  848.            
  849.            if (ValidEntity(self.Owner) and self.Owner:IsPlayer() and
  850.                ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
  851.                ang.r = -ang.r // Fixes mirrored models
  852.            end
  853.        
  854.        end
  855.        
  856.        return pos, ang
  857.    end
  858.    
  859.    /********************************
  860.        All viewmodel drawing magic
  861.    *********************************/
  862.    SWEP.vRenderOrder = nil
  863.    function SWEP:ViewModelDrawn()
  864.        
  865.        local vm = self.Owner:GetViewModel()
  866.        if !ValidEntity(vm) then return end
  867.        
  868.        if vm.BuildBonePositions ~= self.BuildViewModelBones then
  869.            vm.BuildBonePositions = self.BuildViewModelBones
  870.        end
  871.    
  872.        if (!self.vRenderOrder) then
  873.            
  874.            // we build a render order because sprites need to be drawn after models
  875.            self.vRenderOrder = {}
  876.  
  877.            for k, v in pairs( self.v_models ) do
  878.                if (v.type == "Model") then
  879.                    table.insert(self.vRenderOrder, 1, k)
  880.                elseif (v.type == "Sprite" or v.type == "Quad") then
  881.                    table.insert(self.vRenderOrder, k)
  882.                end
  883.            end
  884.            
  885.        end
  886.  
  887.        for k, name in ipairs( self.vRenderOrder ) do
  888.        
  889.            local v = self.v_models[name]
  890.            if (!v) then self.vRenderOrder = nil break end
  891.        
  892.            local model = v.modelEnt
  893.            local sprite = v.spriteMaterial
  894.            
  895.            if (!v.bone) then continue end
  896.            
  897.            local pos, ang = self:GetBoneOrientation( self.v_models, name, vm )
  898.            
  899.            if (!pos) then continue end
  900.            
  901.            if (v.type == "Model" and ValidEntity(model)) then
  902.  
  903.                model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  904.                ang:RotateAroundAxis(ang:Up(), v.angle.y)
  905.                ang:RotateAroundAxis(ang:Right(), v.angle.p)
  906.                ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  907.  
  908.                model:SetAngles(ang)
  909.                model:SetModelScale(v.size)
  910.                
  911.                if (v.material == "") then
  912.                    model:SetMaterial("")
  913.                elseif (model:GetMaterial() != v.material) then
  914.                    model:SetMaterial( v.material )
  915.                end
  916.                
  917.                if (v.skin != model:GetSkin()) then
  918.                    model:SetSkin(v.skin)
  919.                end
  920.                
  921.                for k, v in pairs( v.bodygroup ) do
  922.                    if (model:GetBodygroup(k) != v) then
  923.                        model:SetBodygroup(k, v)
  924.                    end
  925.                end
  926.                
  927.                if (v.surpresslightning) then
  928.                    render.SuppressEngineLighting(true)
  929.                end
  930.                
  931.                render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  932.                render.SetBlend(v.color.a/255)
  933.                model:DrawModel()
  934.                render.SetBlend(1)
  935.                render.SetColorModulation(1, 1, 1)
  936.                
  937.                if (v.surpresslightning) then
  938.                    render.SuppressEngineLighting(false)
  939.                end
  940.                
  941.            elseif (v.type == "Sprite" and sprite) then
  942.                
  943.                local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  944.                render.SetMaterial(sprite)
  945.                render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  946.                
  947.            elseif (v.type == "Quad") then
  948.            
  949.                local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  950.                ang:RotateAroundAxis(ang:Up(), v.angle.y)
  951.                ang:RotateAroundAxis(ang:Right(), v.angle.p)
  952.                ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  953.                
  954.                cam.Start3D2D(drawpos, ang, v.size)
  955.                    draw.RoundedBox( 0, -20, -20, 40, 40, Color(200,0,0,100) )
  956.                    surface.SetDrawColor( 255, 255, 255, 100 )
  957.                    surface.DrawOutlinedRect( -20, -20, 40, 40 )
  958.                    draw.SimpleTextOutlined("12pt arial","12ptFont",0, -12, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
  959.                    draw.SimpleTextOutlined("40x40 box","12ptFont",0, 2, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
  960.                    surface.SetDrawColor( 0, 255, 0, 230 )
  961.                    surface.DrawLine( 0, 0, 0, 8 )
  962.                    surface.DrawLine( 0, 0, 8, 0 )
  963.                cam.End3D2D()
  964.  
  965.            end
  966.            
  967.        end
  968.        
  969.    end
  970.    
  971.    /********************************
  972.        All worldmodel drawing science
  973.    *********************************/
  974.    SWEP.wRenderOrder = nil
  975.    function SWEP:DrawWorldModel()
  976.        
  977.        local wm = self.world_model
  978.        if !ValidEntity(wm) then return end
  979.        
  980.        if (!self.wRenderOrder) then
  981.  
  982.            self.wRenderOrder = {}
  983.  
  984.            for k, v in pairs( self.w_models ) do
  985.                if (v.type == "Model") then
  986.                    table.insert(self.wRenderOrder, 1, k)
  987.                elseif (v.type == "Sprite" or v.type == "Quad") then
  988.                    table.insert(self.wRenderOrder, k)
  989.                end
  990.            end
  991.  
  992.        end
  993.  
  994.        local bone_ent
  995.        
  996.        if (ValidEntity(self.Owner)) then
  997.            self:SetColor(255,255,255,255)
  998.            wm:SetNoDraw(true)
  999.            if (self.Owner:GetActiveWeapon() != self.Weapon) then return end
  1000.            wm:SetParent(self.Owner)
  1001.            if (self.ShowWorldModel) then
  1002.                wm:DrawModel()
  1003.            end
  1004.            bone_ent = self.Owner
  1005.        else
  1006.            // this only happens if the weapon is dropped, which shouldn't happen normally.
  1007.             self:SetColor(255,255,255,0)
  1008.             wm:SetNoDraw(false) // else DrawWorldModel stops being called for some reason
  1009.             wm:SetParent(self)
  1010.             //wm:SetPos(opos)
  1011.             //wm:SetAngles(oang)
  1012.             if (self.ShowWorldModel) then
  1013.                 wm:DrawModel()
  1014.             end
  1015.        
  1016.             // 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
  1017.             bone_ent = wm
  1018.         end
  1019.        
  1020.         /* BASE CODE FOR NEW SWEPS */
  1021.         /*self:DrawModel()
  1022.         if (ValidEntity(self.Owner)) then
  1023.             bone_ent = self.Owner
  1024.         else
  1025.             // when the weapon is dropped
  1026.             bone_ent = self
  1027.         end*/
  1028.        
  1029.         for k, name in pairs( self.wRenderOrder ) do
  1030.        
  1031.             local v = self.w_models[name]
  1032.             if (!v) then self.wRenderOrder = nil break end
  1033.            
  1034.             local pos, ang
  1035.            
  1036.             if (v.bone) then
  1037.                 pos, ang = self:GetBoneOrientation( self.w_models, name, bone_ent )
  1038.             else
  1039.                 pos, ang = self:GetBoneOrientation( self.w_models, name, bone_ent, "ValveBiped.Bip01_R_Hand" )
  1040.             end
  1041.            
  1042.             if (!pos) then continue end
  1043.            
  1044.             local model = v.modelEnt
  1045.             local sprite = v.spriteMaterial
  1046.  
  1047.             if (v.type == "Model" and ValidEntity(model)) then
  1048.  
  1049.                 model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  1050.                 ang:RotateAroundAxis(ang:Up(), v.angle.y)
  1051.                 ang:RotateAroundAxis(ang:Right(), v.angle.p)
  1052.                 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  1053.  
  1054.                 model:SetAngles(ang)
  1055.                 model:SetModelScale(v.size)
  1056.                
  1057.                 if (v.material == "") then
  1058.                     model:SetMaterial("")
  1059.                 elseif (model:GetMaterial() != v.material) then
  1060.                     model:SetMaterial( v.material )
  1061.                 end
  1062.                
  1063.                 if (v.skin != model:GetSkin()) then
  1064.                     model:SetSkin(v.skin)
  1065.                 end
  1066.                
  1067.                 for k, v in pairs( v.bodygroup ) do
  1068.                     if (model:GetBodygroup(k) != v) then
  1069.                         model:SetBodygroup(k, v)
  1070.                     end
  1071.                 end
  1072.                
  1073.                 if (v.surpresslightning) then
  1074.                     render.SuppressEngineLighting(true)
  1075.                 end
  1076.                
  1077.                 render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  1078.                 render.SetBlend(v.color.a/255)
  1079.                 model:DrawModel()
  1080.                 render.SetBlend(1)
  1081.                 render.SetColorModulation(1, 1, 1)
  1082.                
  1083.                 if (v.surpresslightning) then
  1084.                     render.SuppressEngineLighting(false)
  1085.                 end
  1086.                
  1087.             elseif (v.type == "Sprite" and sprite) then
  1088.                
  1089.                 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  1090.                 render.SetMaterial(sprite)
  1091.                 render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  1092.                
  1093.             elseif (v.type == "Quad") then
  1094.            
  1095.                 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  1096.                 ang:RotateAroundAxis(ang:Up(), v.angle.y)
  1097.                 ang:RotateAroundAxis(ang:Right(), v.angle.p)
  1098.                 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  1099.                
  1100.                 cam.Start3D2D(drawpos, ang, v.size)
  1101.                     draw.RoundedBox( 0, -20, -20, 40, 40, Color(200,0,0,100) )
  1102.                     surface.SetDrawColor( 255, 255, 255, 100 )
  1103.                     surface.DrawOutlinedRect( -20, -20, 40, 40 )
  1104.                     draw.SimpleTextOutlined("12pt arial","12ptFont",0, -12, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
  1105.                     draw.SimpleTextOutlined("40x40 box","12ptFont",0, 2, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, Color(0,0,0,255))
  1106.                     surface.SetDrawColor( 0, 255, 0, 230 )
  1107.                     surface.DrawLine( 0, 0, 0, 8 )
  1108.                     surface.DrawLine( 0, 0, 8, 0 )
  1109.                 cam.End3D2D()
  1110.  
  1111.             end
  1112.            
  1113.         end
  1114.        
  1115.     end
  1116.    
  1117.     function SWEP:Holster()
  1118.         self.useThirdPerson = false
  1119.         return true
  1120.     end
  1121.    
  1122.     local function DrawDot( x, y )
  1123.    
  1124.         surface.SetDrawColor(100, 100, 100, 255)
  1125.         surface.DrawRect(x - 2, y - 2, 4, 4)
  1126.        
  1127.         surface.SetDrawColor(255, 255, 255, 255)
  1128.         surface.DrawRect(x - 1, y - 1, 2, 2)
  1129.        
  1130.     end
  1131.    
  1132.     function SWEP:DrawHUD()
  1133.        
  1134.         DrawDot( ScrW()/2, ScrH()/2 )
  1135.         DrawDot( ScrW()/2 + 10, ScrH()/2 )
  1136.         DrawDot( ScrW()/2 - 10, ScrH()/2 )
  1137.         DrawDot( ScrW()/2, ScrH()/2 + 10 )
  1138.         DrawDot( ScrW()/2, ScrH()/2 - 10 )
  1139.        
  1140.         if (self.Frame and self.Frame:IsVisible()) then
  1141.        
  1142.             local text = ""
  1143.             if (self.useThirdPerson) then
  1144.                 text = "Hold right mouse and drag to rotate. Additionally hold E key to zoom."
  1145.             else
  1146.                 text = "Hold right mouse and drag to adjust ironsights (mode: "..self.cur_drag_mode..")"
  1147.             end
  1148.             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))
  1149.            
  1150.         end
  1151.     end
  1152.    
  1153.     /***************************
  1154.                 Menu
  1155.     ***************************/
  1156.     local function CreateMenu( preset )
  1157.        
  1158.         local wep = GetSWEP( LocalPlayer() )
  1159.         if !ValidEntity(wep) then return nil end
  1160.        
  1161.         wep.save_data = table.Copy(save_data_template)
  1162.        
  1163.         if (preset) then
  1164.             // use the preset
  1165.             for k, v in pairs( preset ) do
  1166.                 wep.save_data[k] = v
  1167.             end
  1168.         end
  1169.        
  1170.         /****** Create model browser *****/
  1171.  
  1172.         // callback = function( selected_model )
  1173.         local function OpenBrowser( current, browse_type, callback )
  1174.            
  1175.             wep.browser_callback = callback
  1176.             wep.Frame:SetVisible( false )
  1177.            
  1178.             if (browse_type == "model" and wep.modelbrowser) then
  1179.                 wep.modelbrowser:SetVisible(true)
  1180.                 wep.modelbrowser:MakePopup()
  1181.                 wep.modelbrowser_list.OnRowSelected(nil,nil,current)
  1182.                 return
  1183.             elseif (browse_type == "material" and wep.matbrowser) then
  1184.                 wep.matbrowser:SetVisible(true)
  1185.                 wep.matbrowser:MakePopup()
  1186.                 wep.matbrowser_list.OnRowSelected(nil,nil,current)
  1187.                 return
  1188.             end
  1189.        
  1190.             local browser = vgui.Create("DFrame")
  1191.             browser:SetSize( 300, 580 )
  1192.             browser:SetPos( ScrW()/4 - 150, ScrH()/2 - 250 )
  1193.             browser:SetDraggable( true )
  1194.             browser:ShowCloseButton( false )
  1195.             browser:SetSizable( false )
  1196.             browser:SetDeleteOnClose( false )
  1197.  
  1198.             if (browse_type == "model") then
  1199.                 browser:SetTitle( "Model browser" )
  1200.                 wep.modelbrowser = browser
  1201.             elseif (browse_type == "material") then
  1202.                 browser:SetTitle( "Material browser" )
  1203.                 wep.matbrowser = browser
  1204.             end
  1205.            
  1206.             local tree = vgui.Create( "DTree", browser )
  1207.             tree:SetPos( 5, 30 )
  1208.             tree:SetSize( browser:GetWide() - 10, browser:GetTall()-355 )
  1209.  
  1210.             local nodelist = {}
  1211.             local filecache = {}
  1212.             local checked = {}
  1213.            
  1214.             local modlist = vgui.Create("DListView", browser)
  1215.             modlist:SetPos( 5, browser:GetTall() - 320 )
  1216.             modlist:SetSize( browser:GetWide() - 10, 200 )
  1217.             modlist:SetMultiSelect(false)
  1218.             modlist:SetDrawBackground(true)
  1219.             if (browse_type == "model") then
  1220.                 modlist:AddColumn("Model")
  1221.             elseif (browse_type == "material") then
  1222.                 modlist:AddColumn("Material")
  1223.             end
  1224.            
  1225.             local modzoom = 32
  1226.             local modview
  1227.            
  1228.             if (browse_type == "model") then
  1229.                 modview = vgui.Create("DModelPanel", browser)
  1230.                 modview:SetModel("")
  1231.                 modview:SetCamPos( Vector(modzoom,modzoom,modzoom/2) )
  1232.                 modview:SetLookAt( Vector( 0, 0, 0 ) )
  1233.             elseif (browse_type == "material") then
  1234.                 modview = vgui.Create("DImage", browser)
  1235.                 modview:SetImage("")
  1236.             end
  1237.            
  1238.             modview:SetPos( 5, browser:GetTall() - 115)
  1239.             modview:SetSize(110,110)
  1240.  
  1241.             local mdlabel = vgui.Create("DLabel", browser)
  1242.             mdlabel:SetPos( 120, browser:GetTall() - 115 )
  1243.             mdlabel:SetSize( browser:GetWide() - 125, 20 )
  1244.             mdlabel:SetText( current )
  1245.  
  1246.             if (browse_type == "model") then
  1247.            
  1248.                 local zoomslider = vgui.Create( "DNumSlider", browser)
  1249.                 zoomslider:SetPos( 120, browser:GetTall() - 90 )
  1250.                 zoomslider:SetWide( browser:GetWide() - 125 )
  1251.                 zoomslider:SetText( "Zoom" )
  1252.                 zoomslider:SetMin( 16 )
  1253.                 zoomslider:SetMax( 256 )
  1254.                 zoomslider:SetDecimals( 0 )
  1255.                 zoomslider:SetValue( modzoom )
  1256.                 zoomslider.OnValueChanged = function( panel, value )
  1257.                     local modzoom = tonumber(value)
  1258.                     modview:SetCamPos( Vector(modzoom,modzoom,modzoom/2) )
  1259.                 end
  1260.                 local areazm = zoomslider:GetTextArea()
  1261.                 areazm.OnTextChanged = function() zoomslider:SetValue(areazm:GetValue()) end
  1262.                
  1263.             end
  1264.            
  1265.             local selected = ""
  1266.            
  1267.             modlist.OnRowSelected = function( panel, line, override )
  1268.                 if (type(override) != "string") then override = nil end // for some reason the list itself throws a panel at it in the callback
  1269.                 local path = override or modlist:GetLine(line):GetValue(1)
  1270.  
  1271.                 if (browse_type == "model") then
  1272.                     modview:SetModel(path)
  1273.                 elseif (browse_type == "material") then
  1274.                     if (path:sub( 1, 10 ) == "materials/") then
  1275.                         path = path:sub( 11 ) // removes the "materials/" part
  1276.                     end
  1277.                     path = path:gsub( "%.vmt", "" )
  1278.                     modview:SetImage(path)
  1279.                 end
  1280.  
  1281.                 mdlabel:SetText(path)
  1282.                 selected = path
  1283.             end
  1284.            
  1285.             // set the default
  1286.             modlist.OnRowSelected(nil,nil,current)
  1287.             if (browse_type == "model") then
  1288.                 wep.modelbrowser_list = modlist
  1289.             elseif (browse_type == "material") then
  1290.                 wep.matbrowser_list = modlist
  1291.             end
  1292.  
  1293.             local choosebtn = vgui.Create("DButton", browser)
  1294.             choosebtn:SetPos( 120, browser:GetTall() - 40 )
  1295.             choosebtn:SetSize( browser:GetWide() - 125, 18 )
  1296.             if (browse_type == "model") then
  1297.                 choosebtn:SetText("DO WANT THIS MODEL")
  1298.             elseif (browse_type == "material") then
  1299.                 choosebtn:SetText("DO WANT THIS MATERIAL")
  1300.             end
  1301.            
  1302.             choosebtn.DoClick = function()
  1303.                 if (wep.browser_callback) then
  1304.                     pcall(wep.browser_callback, selected)
  1305.                 end
  1306.                 if (wep.Frame) then
  1307.                     wep.Frame:SetVisible(true)
  1308.                 end
  1309.                 browser:Close()
  1310.             end
  1311.            
  1312.             local cancelbtn = vgui.Create("DButton", browser)
  1313.             cancelbtn:SetPos( 120, browser:GetTall() - 20 )
  1314.             cancelbtn:SetSize( browser:GetWide() - 125, 16 )
  1315.             cancelbtn:SetText("cancel")
  1316.             cancelbtn.DoClick = function()
  1317.                 if (wep.Frame) then
  1318.                     wep.Frame:SetVisible(true)
  1319.                 end
  1320.                 browser:Close()
  1321.             end
  1322.            
  1323.             local LoadDirectories
  1324.             local AddNode = function( base, dir, tree_override )
  1325.                
  1326.                 local newpath = base.."/"..dir
  1327.                 local basenode = nodelist[base]
  1328.                
  1329.                 if (tree_override) then
  1330.                     newpath = dir
  1331.                     basenode = tree_override
  1332.                 end
  1333.                
  1334.                 if (!basenode) then
  1335.                     print("No base node for \""..tostring(base).."\", \""..tostring(dir).."\", "..tostring(tree_override))
  1336.                 end
  1337.                
  1338.                 nodelist[newpath] = basenode:AddNode( dir )
  1339.                 nodelist[newpath].DoClick = function()
  1340.                     LoadDirectories( newpath )
  1341.                     modlist:Clear()
  1342.                     modlist:SetVisible(true)
  1343.                    
  1344.                     if (filecache[newpath]) then
  1345.                         for k, f in pairs(filecache[newpath]) do
  1346.                             modlist:AddLine(f)
  1347.                         end
  1348.                     else
  1349.                         filecache[newpath] = {}
  1350.                         local files
  1351.                         if (newpath:sub(1,9) == "materials") then
  1352.                             files = file.Find(newpath.."/*.vmt",true)
  1353.                         else
  1354.                             files = file.Find(newpath.."/*.mdl",true)
  1355.                         end
  1356.                         table.sort(files)
  1357.                         for k, f in pairs(files) do
  1358.                             local newfilepath = newpath.."/"..f
  1359.                             modlist:AddLine(newfilepath)
  1360.                             table.insert(filecache[newpath], newfilepath)
  1361.                         end
  1362.                     end
  1363.                 end
  1364.                    
  1365.             end
  1366.            
  1367.             if (browse_type == "model") then
  1368.                 AddNode( "", "models", tree )
  1369.             elseif (browse_type == "material") then
  1370.                 AddNode( "", "materials", tree )
  1371.             end
  1372.            
  1373.             LoadDirectories = function( v )
  1374.                
  1375.                 if (table.HasValue(checked,v)) then return end
  1376.                 newdirs = file.FindDir(v.."/*",true)
  1377.                 table.insert(checked, v)
  1378.                
  1379.                 table.sort(newdirs)
  1380.                
  1381.                 for _, dir in pairs(newdirs) do
  1382.                     AddNode( v, dir )
  1383.                 end
  1384.  
  1385.             end
  1386.            
  1387.             if (browse_type == "model") then
  1388.                 LoadDirectories( "models" )
  1389.             elseif (browse_type == "material") then
  1390.                 LoadDirectories( "materials" )
  1391.             end
  1392.        
  1393.             browser:SetVisible( true )
  1394.             browser:MakePopup()
  1395.            
  1396.         end
  1397.        
  1398.         /****************************************/
  1399.        
  1400.         // Now for the actual menu:        
  1401.         local f = vgui.Create("DFrame")
  1402.         f:SetSize( 300, 640 )
  1403.         f:SetPos( ScrW()/4 - 150, ScrH()/2 - 320 )
  1404.         f:SetTitle( "SWEP Construction Kit" )
  1405.         f:SetDraggable( true )
  1406.         f:ShowCloseButton( true )
  1407.         f:SetSizable( false )
  1408.         f:SetDeleteOnClose( false )
  1409.  
  1410.         local tbtn = vgui.Create( "DButton", f )
  1411.         tbtn:SetPos( 155, 2 )
  1412.         tbtn:SetSize( 120, 18 )
  1413.         tbtn:SetText( "Toggle thirdperson" )
  1414.         tbtn.DoClick = function()
  1415.             RunConsoleCommand("swepck_togglethirdperson")
  1416.         end
  1417.        
  1418.         local tab = vgui.Create( "DPropertySheet", f )
  1419.         tab:SetPos( 5, 30 )
  1420.         tab:SetSize( f:GetWide() - 10, f:GetTall()-35 )
  1421.        
  1422.         local ptool = vgui.Create("DPanel", tab)
  1423.         ptool.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,ptool:GetWide(),ptool:GetTall()) end
  1424.         local pweapon = vgui.Create("DPanel", tab)
  1425.         pweapon.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pweapon:GetWide(),pweapon:GetTall()) end
  1426.         local pironsight = vgui.Create("DPanel", tab)
  1427.         pironsight.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pironsight:GetWide(),pironsight:GetTall()) end
  1428.         local pmodels = vgui.Create("DPanel", tab)
  1429.         pmodels.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pmodels:GetWide(),pmodels:GetTall()) end
  1430.         local pwmodels = vgui.Create("DPanel", tab)
  1431.         pwmodels.Paint = function() surface.SetDrawColor(50,50,50,255) surface.DrawRect(0,0,pwmodels:GetWide(),pwmodels:GetTall()) end
  1432.        
  1433.         tab:AddSheet( "Tool", ptool, "gui/silkicons/wrench", false, false, "Modify tool settings" )
  1434.         tab:AddSheet( "Weapon", pweapon, "gui/silkicons/bomb", false, false, "Modify weapon settings" )
  1435.         tab:AddSheet( "Ironsights", pironsight, "gui/silkicons/wrench", false, false, "Modify ironsights" )
  1436.         tab:AddSheet( "VModels", pmodels, "gui/silkicons/brick_add", false, false, "Modify view models" )
  1437.         tab:AddSheet( "WModels", pwmodels, "gui/silkicons/brick_add", false, false, "Modify world models" )
  1438.        
  1439.         /*****************
  1440.             Tool page
  1441.         *****************/
  1442.         local addy = 10
  1443.        
  1444.         // ***** Animations *****
  1445.        
  1446.         local alabel = vgui.Create( "DLabel", ptool )
  1447.         alabel:SetPos( 10, addy )
  1448.         alabel:SetSize( 240, 20 )
  1449.         alabel:SetText( "Play animation (buggy):" )
  1450.        
  1451.         addy = addy + 25
  1452.        
  1453.         local aabtn = vgui.Create( "DButton", ptool )
  1454.         aabtn:SetPos( 10, addy )
  1455.         aabtn:SetSize( 120, 18 )
  1456.         aabtn:SetText( "Primary Attack" )
  1457.         aabtn.DoClick = function()
  1458.             RunConsoleCommand("swepck_playanimation", ACT_VM_PRIMARYATTACK)
  1459.             wep:ResetSequenceInfo()
  1460.             wep:SendWeaponAnim(ACT_VM_PRIMARYATTACK)
  1461.             LocalPlayer():SetAnimation(PLAYER_ATTACK1)
  1462.         end
  1463.        
  1464.         local arbtn = vgui.Create( "DButton", ptool )
  1465.         arbtn:SetPos( 140, addy )
  1466.         arbtn:SetSize( 120, 18 )
  1467.         arbtn:SetText( "Reload" )
  1468.         arbtn.DoClick = function()
  1469.             RunConsoleCommand("swepck_playanimation", ACT_VM_RELOAD)
  1470.             wep:SendWeaponAnim(ACT_VM_RELOAD)
  1471.             LocalPlayer():SetAnimation(PLAYER_RELOAD)
  1472.         end
  1473.        
  1474.         addy = addy + 20
  1475.        
  1476.         local m1btn = vgui.Create( "DButton", ptool )
  1477.         m1btn:SetPos( 10, addy )
  1478.         m1btn:SetSize( 120, 18 )
  1479.         m1btn:SetText( "Melee 1" )
  1480.         m1btn.DoClick = function()
  1481.             RunConsoleCommand("swepck_playanimation", ACT_VM_MISSCENTER)
  1482.             wep:SendWeaponAnim(ACT_VM_MISSCENTER)
  1483.             LocalPlayer():SetAnimation(PLAYER_ATTACK1)
  1484.         end
  1485.        
  1486.         local m2btn = vgui.Create( "DButton", ptool )
  1487.         m2btn:SetPos( 140, addy )
  1488.         m2btn:SetSize( 120, 18 )
  1489.         m2btn:SetText( "Melee 2" )
  1490.         m2btn.DoClick = function()
  1491.             RunConsoleCommand("swepck_playanimation", ACT_VM_HITCENTER)
  1492.             wep:SendWeaponAnim(ACT_VM_HITCENTER)
  1493.             LocalPlayer():SetAnimation(PLAYER_ATTACK1)
  1494.         end
  1495.        
  1496.         addy = addy + 20
  1497.        
  1498.         local gcbtn = vgui.Create( "DButton", ptool )
  1499.         gcbtn:SetPos( 10, addy )
  1500.         gcbtn:SetSize( 120, 18 )
  1501.         gcbtn:SetText( "Grenade pull (CSS)" )
  1502.         gcbtn.DoClick = function()
  1503.             RunConsoleCommand("swepck_playanimation", ACT_VM_PULLPIN)
  1504.             wep:SendWeaponAnim(ACT_VM_PULLPIN)
  1505.         end
  1506.        
  1507.         local ghbtn = vgui.Create( "DButton", ptool )
  1508.         ghbtn:SetPos( 140, addy )
  1509.         ghbtn:SetSize( 120, 18 )
  1510.         ghbtn:SetText( "Grenade pull (HL2)" )
  1511.         ghbtn.DoClick = function()
  1512.             RunConsoleCommand("swepck_playanimation", ACT_VM_PULLBACK_HIGH)
  1513.             wep:SendWeaponAnim(ACT_VM_PULLBACK_HIGH)
  1514.         end
  1515.        
  1516.         addy = addy + 20
  1517.        
  1518.         local wdbtn = vgui.Create( "DButton", ptool )
  1519.         wdbtn:SetPos( 10, addy )
  1520.         wdbtn:SetSize( 120, 18 )
  1521.         wdbtn:SetText( "Draw" )
  1522.         wdbtn.DoClick = function()
  1523.             RunConsoleCommand("swepck_playanimation", ACT_VM_DRAW)
  1524.             wep:SendWeaponAnim(ACT_VM_DRAW)
  1525.         end
  1526.        
  1527.         local tgbtn = vgui.Create( "DButton", ptool )
  1528.         tgbtn:SetPos( 140, addy )
  1529.         tgbtn:SetSize( 120, 18 )
  1530.         tgbtn:SetText( "Throw grenade" )
  1531.         tgbtn.DoClick = function()
  1532.             RunConsoleCommand("swepck_playanimation", ACT_VM_THROW)
  1533.             wep:SendWeaponAnim(ACT_VM_THROW)
  1534.             LocalPlayer():SetAnimation(PLAYER_ATTACK1)
  1535.         end
  1536.        
  1537.         addy = addy + 20
  1538.        
  1539.         local idlbtn = vgui.Create( "DButton", ptool )
  1540.         idlbtn:SetPos( 10, addy )
  1541.         idlbtn:SetSize( 120, 18 )
  1542.         idlbtn:SetText( "Idle" )
  1543.         idlbtn.DoClick = function()
  1544.             RunConsoleCommand("swepck_playanimation", ACT_VM_IDLE)
  1545.             wep:SendWeaponAnim(ACT_VM_IDLE)
  1546.         end
  1547.        
  1548.         addy = addy + 45
  1549.        
  1550.         // ***** Settings saving / loading *****
  1551.         local note_x = 10
  1552.         local note_y = addy + 75
  1553.        
  1554.         local function CreateSettingsNote( text )
  1555.             local templabel = vgui.Create( "DLabel" )
  1556.             templabel:SetText( text )
  1557.             templabel:SetSize( 260, 20 )
  1558.  
  1559.             local notif = vgui.Create( "DNotify" , ptool )
  1560.             notif:SetPos( note_x, note_y )
  1561.             notif:SetSize( 260, 20 )
  1562.             notif:SetLife( 5 )
  1563.             notif:AddItem(templabel)
  1564.         end
  1565.        
  1566.         local selabel = vgui.Create( "DLabel", ptool )
  1567.         selabel:SetPos( 10, addy )
  1568.         selabel:SetSize( 200, 20 )
  1569.         selabel:SetText( "Configuration:" )
  1570.        
  1571.         addy = addy + 25
  1572.        
  1573.         local satext = vgui.Create( "DTextEntry", ptool)
  1574.         satext:SetPos( 95, addy )
  1575.         satext:SetSize( 170, 20 )
  1576.         satext:SetMultiline(false)
  1577.         satext:SetText( "save1" )
  1578.        
  1579.         local sabtn = vgui.Create( "DButton", ptool )
  1580.         sabtn:SetPos( 10, addy )
  1581.         sabtn:SetSize( 80, 20 )
  1582.         sabtn:SetText( "Save as:" )
  1583.         sabtn.DoClick = function()
  1584.        
  1585.         if !ValidEntity(wep) then return end
  1586.                
  1587.         local text = string.Trim(satext:GetValue())
  1588.         if (text == "") then return end
  1589.            
  1590.             local save_data = wep.save_data
  1591.            
  1592.             // collect all save data
  1593.             save_data.v_models = table.Copy(wep.v_models)
  1594.             save_data.w_models = table.Copy(wep.w_models)
  1595.             save_data.v_bonemods = table.Copy(wep.v_bonemods)
  1596.             // remove caches
  1597.             for k, v in pairs(save_data.v_models) do
  1598.                 v.createdModel = nil
  1599.                 v.createdSprite = nil
  1600.             end
  1601.             for k, v in pairs(save_data.w_models) do
  1602.                 v.createdModel = nil
  1603.                 v.createdSprite = nil
  1604.             end
  1605.             save_data.ViewModelFlip = wep.ViewModelFlip
  1606.             save_data.ViewModel = wep.ViewModel
  1607.             save_data.CurWorldModel = wep.CurWorldModel
  1608.             save_data.ViewModelFOV = wep.ViewModelFOV
  1609.             save_data.HoldType = wep.HoldType
  1610.             save_data.IronSightsEnabled = wep:GetIronSights()
  1611.             save_data.IronSightsPos, save_data.IronSightsAng = wep:GetIronSightCoordination()
  1612.             save_data.ShowViewModel = wep.ShowViewModel
  1613.             save_data.ShowWorldModel = wep.ShowWorldModel
  1614.            
  1615.             local filename = "swep_construction_kit/"..text..".txt"
  1616.            
  1617.             local succ, val = pcall(glon.encode, save_data)
  1618.             if (!succ) then LocalPlayer():ChatPrint("Failed to encode settings!") return end
  1619.            
  1620.             file.Write(filename, val)
  1621.             LocalPlayer():ChatPrint("Saved file \""..text.."\"!")
  1622.         end
  1623.        
  1624.         addy = addy + 25
  1625.        
  1626.         local lftext = vgui.Create( "DTextEntry", ptool)
  1627.         lftext:SetPos( 95, addy )
  1628.         lftext:SetSize( 170, 20 )
  1629.         lftext:SetMultiline(false)
  1630.         lftext:SetText( "save1" )
  1631.        
  1632.         local lfbtn = vgui.Create( "DButton", ptool )
  1633.         lfbtn:SetPos( 10, addy )
  1634.         lfbtn:SetSize( 80, 20 )
  1635.         lfbtn:SetText( "Load file:" )
  1636.         lfbtn.DoClick = function()
  1637.         local text = string.Trim(lftext:GetValue())
  1638.         if (text == "") then return end
  1639.            
  1640.             local filename = "swep_construction_kit/"..text..".txt"
  1641.            
  1642.             if (!file.Exists (filename)) then
  1643.                 CreateSettingsNote( "No such file exists!" )
  1644.                 return
  1645.             end
  1646.            
  1647.             local glondata = file.Read(filename)
  1648.             local succ, new_preset = pcall(glon.decode, glondata)
  1649.             if (!succ) then LocalPlayer():ChatPrint("Failed to load settings!") return end
  1650.            
  1651.             wep:CleanMenu()
  1652.             wep:OpenMenu( new_preset )
  1653.             LocalPlayer():ChatPrint("Loaded file \""..text.."\"!")
  1654.         end
  1655.        
  1656.         // link to FP thread
  1657.        
  1658.         addy = addy + 45
  1659.        
  1660.         local threadbtn = vgui.Create( "DButton", ptool )
  1661.         threadbtn:SetPos( 10, addy )
  1662.         threadbtn:SetSize( 240, 20 )
  1663.         threadbtn:SetText( "View Facepunch thread & tutorial" )
  1664.         threadbtn.DoClick = function()
  1665.             gui.OpenURL(tutorialURL)
  1666.         end
  1667.        
  1668.         /*local alabel = vgui.Create( "DLabel", ptool )
  1669.         alabel:SetPos( 10, addy )
  1670.         alabel:SetSize( 240, 20 )
  1671.         alabel:SetText( "Link to tool tutorial (copy-paste to browser):" )
  1672.        
  1673.         addy = addy + 25
  1674.        
  1675.         local tutltext = vgui.Create( "DTextEntry", ptool)
  1676.         tutltext:SetPos( 10, addy )
  1677.         tutltext:SetSize( 240, 20 )
  1678.         tutltext:SetMultiline(false)
  1679.         tutltext:SetEditable(true)
  1680.         tutltext:SetText( "http://tinyurl.com/swepkit" )
  1681.         */
  1682.        
  1683.         /*****************
  1684.             Weapon page
  1685.         *****************/
  1686.         local addy = 10
  1687.        
  1688.         local next_v_model = ""
  1689.        
  1690.         // Weapon model
  1691.         local vlabel = vgui.Create( "DLabel", pweapon )
  1692.         vlabel:SetPos( 10, addy )
  1693.         vlabel:SetSize( 80, 20 )
  1694.         vlabel:SetText( "View model:" )
  1695.        
  1696.         local vtext = vgui.Create( "DTextEntry", pweapon)
  1697.         vtext:SetPos( 85, addy )
  1698.         vtext:SetSize( 160, 20 )
  1699.         vtext:SetMultiline(false)
  1700.         vtext.OnTextChanged = function()
  1701.             local newmod = string.gsub(vtext:GetValue(), ".mdl", "")
  1702.             RunConsoleCommand("swepck_viewmodel", newmod)
  1703.            
  1704.             // clear view model additions
  1705.             if (newmod != next_v_model and file.Exists(newmod..".mdl",true)) then
  1706.                 next_v_model = newmod
  1707.                 ClearViewModels()
  1708.                 RefreshViewModelBoneMods()
  1709.             end
  1710.            
  1711.         end
  1712.         vtext:SetText( wep.save_data.ViewModel )
  1713.         vtext:OnTextChanged()
  1714.        
  1715.         local vtbtn = vgui.Create( "DButton", pweapon )
  1716.         vtbtn:SetPos( 245, addy )
  1717.         vtbtn:SetSize( 20, 20 )
  1718.         vtbtn:SetText("...")
  1719.         vtbtn.DoClick = function()
  1720.             OpenBrowser( wep.ViewModel, "model", function( val ) vtext:SetText(val) vtext:OnTextChanged() end )
  1721.         end
  1722.        
  1723.         addy = addy + 25
  1724.        
  1725.         local wlabel = vgui.Create( "DLabel", pweapon )
  1726.         wlabel:SetPos( 10, addy )
  1727.         wlabel:SetSize( 80, 20 )
  1728.         wlabel:SetText( "World model:" )
  1729.        
  1730.         local wtext = vgui.Create( "DTextEntry", pweapon)
  1731.         wtext:SetPos( 85, addy )
  1732.         wtext:SetSize( 160, 20 )
  1733.         wtext:SetMultiline(false)
  1734.         wtext.OnTextChanged = function()
  1735.             local newmod = string.gsub(wtext:GetValue(), ".mdl", "")
  1736.             RunConsoleCommand("swepck_worldmodel", newmod)
  1737.            
  1738.             // clear world model additions
  1739.             if (newmod != wep.cur_wmodel) then
  1740.                 ClearWorldModels()
  1741.             end
  1742.            
  1743.         end
  1744.         wtext:SetText( wep.save_data.CurWorldModel )
  1745.         wtext:OnTextChanged()
  1746.        
  1747.         local wtbtn = vgui.Create( "DButton", pweapon )
  1748.         wtbtn:SetPos( 245, addy )
  1749.         wtbtn:SetSize( 20, 20 )
  1750.         wtbtn:SetText("...")
  1751.         wtbtn.DoClick = function()
  1752.             OpenBrowser( wep.CurWorldModel, "model", function( val ) wtext:SetText(val) wtext:OnTextChanged() end )
  1753.         end
  1754.        
  1755.         addy = addy + 30
  1756.        
  1757.         // Weapon hold type
  1758.         local hlabel = vgui.Create( "DLabel", pweapon )
  1759.         hlabel:SetPos( 10, addy )
  1760.         hlabel:SetSize( 150, 20 )
  1761.         hlabel:SetText( "Hold type (3rd person):" )
  1762.        
  1763.         local hbox = vgui.Create( "DMultiChoice", pweapon )
  1764.         hbox:SetPos( 140, addy )
  1765.         hbox:SetSize( 125, 20 )
  1766.         hbox:SetEditable( false )
  1767.         for k, v in pairs( wep:GetHoldTypes() ) do
  1768.             hbox:AddChoice( v )
  1769.         end
  1770.         hbox.OnSelect = function(panel,index,value)
  1771.             if (!value) then return end
  1772.             wep:SetWeaponHoldType( value )
  1773.             wep.HoldType = value
  1774.             RunConsoleCommand("swepck_setholdtype", value)
  1775.         end
  1776.         hbox:SetText( wep.save_data.HoldType )
  1777.         hbox.OnSelect( nil, nil, wep.save_data.HoldType )
  1778.        
  1779.         addy = addy + 30
  1780.        
  1781.         // Show viewmodel
  1782.         local vhbox = vgui.Create( "DCheckBoxLabel", pweapon )
  1783.         vhbox:SetPos( 10, addy )
  1784.         vhbox:SetSize( 150, 20 )
  1785.         vhbox:SetText( "Show view model" )
  1786.         vhbox.OnChange = function()
  1787.             wep.ShowViewModel = vhbox:GetChecked()
  1788.             if (wep.ShowViewModel) then
  1789.                 LocalPlayer():GetViewModel():SetColor(255,255,255,255)
  1790.             else
  1791.                 LocalPlayer():GetViewModel():SetColor(255,255,255,1) // we set the alpha to 1 because else ViewModelDrawn stops being called
  1792.             end
  1793.         end
  1794.         if (wep.save_data.ShowViewModel) then vhbox:SetValue(1)
  1795.         else vhbox:SetValue(0) end
  1796.        
  1797.         addy = addy + 30
  1798.        
  1799.         // Show worldmodel
  1800.         local whbox = vgui.Create( "DCheckBoxLabel", pweapon )
  1801.         whbox:SetPos( 10, addy )
  1802.         whbox:SetSize( 150, 20 )
  1803.         whbox:SetText( "Show world model" )
  1804.         whbox.OnChange = function()
  1805.             wep.ShowWorldModel = whbox:GetChecked()
  1806.         end
  1807.         if (wep.save_data.ShowWorldModel) then whbox:SetValue(1)
  1808.         else whbox:SetValue(0) end
  1809.        
  1810.         addy = addy + 30
  1811.        
  1812.         // Flip viewmodel
  1813.         local fcbox = vgui.Create( "DCheckBoxLabel", pweapon )
  1814.         fcbox:SetPos( 10, addy )
  1815.         fcbox:SetSize( 150, 20 )
  1816.         fcbox:SetText( "Flip viewmodel" )
  1817.         fcbox.OnChange = function()
  1818.             wep.ViewModelFlip = fcbox:GetChecked()
  1819.         end
  1820.         if (wep.save_data.ViewModelFlip) then fcbox:SetValue(1)
  1821.         else fcbox:SetValue(0) end
  1822.        
  1823.         addy = addy + 30
  1824.        
  1825.         // View model FOV slider
  1826.         local fovslider = vgui.Create( "DNumSlider", pweapon )
  1827.         fovslider:SetPos( 10, addy )
  1828.         fovslider:SetWide( 260 )
  1829.         fovslider:SetText( "View model FOV" )
  1830.         fovslider:SetMin( 20 )
  1831.         fovslider:SetMax( 140 )
  1832.         fovslider:SetDecimals( 0 )
  1833.         fovslider.OnValueChanged = function( panel, value )
  1834.             wep.ViewModelFOV = tonumber(value)
  1835.             RunConsoleCommand("swepck_viewmodelfov", value)
  1836.         end
  1837.         fovslider:SetValue( wep.save_data.ViewModelFOV )
  1838.        
  1839.         addy = addy + 50
  1840.        
  1841.         // View model bone scaling
  1842.         local vsbonelabel = vgui.Create( "DLabel", pweapon )
  1843.         vsbonelabel:SetPos( 10, addy )
  1844.         vsbonelabel:SetSize( 250, 20 )
  1845.         vsbonelabel:SetText( "Viewmodel bone mods:" )
  1846.        
  1847.         if (!wep.save_data.v_bonemods) then
  1848.             wep.save_data.v_bonemods = {}
  1849.         end
  1850.                
  1851.         // backwards compatability with old bone scales
  1852.         if (wep.save_data.v_bonescales) then
  1853.             for k, v in pairs(wep.save_data.v_bonescales) do
  1854.                 if (v == Vector(1,1,1)) then continue end
  1855.                 wep.save_data.v_bonemods[k] = { scale = v, pos = Vector(0,0,0), angle = Angle(0,0,0) }
  1856.             end
  1857.         end
  1858.         wep.save_data.v_bonescales = nil
  1859.        
  1860.         local curbone = table.GetFirstKey(wep.save_data.v_bonemods)
  1861.         if (curbone) then
  1862.             wep.v_bonemods = table.Copy(wep.save_data.v_bonemods)
  1863.         else
  1864.             curbone = ""
  1865.             wep.v_bonemods = {}
  1866.         end
  1867.        
  1868.         local resbtn = vgui.Create( "DButton", pweapon )
  1869.         resbtn:SetPos( 180, addy )
  1870.         resbtn:SetSize( 90, 20 )
  1871.         resbtn:SetText("Reset all")
  1872.        
  1873.         addy = addy + 25
  1874.        
  1875.         local vsbonebox = vgui.Create( "DMultiChoice", pweapon )
  1876.         vsbonebox:SetPos( 10, addy )
  1877.         vsbonebox:SetSize( 140, 20 )
  1878.         vsbonebox:SetEditable( false )
  1879.        
  1880.         local resselbtn = vgui.Create( "DButton", pweapon )
  1881.         resselbtn:SetPos( 180, addy )
  1882.         resselbtn:SetSize( 90, 20 )
  1883.         resselbtn:SetText("Reset selected")
  1884.        
  1885.         addy = addy + 25
  1886.        
  1887.         local bonepanely = addy
  1888.        
  1889.         local function CreateBoneMod( selbone, x, y, preset_data )
  1890.            
  1891.             local data = wep.v_bonemods[selbone]
  1892.             if (!preset_data) then preset_data = {} end
  1893.            
  1894.             data.scale = preset_data.scale or Vector(1,1,1)
  1895.             data.pos = preset_data.pos or Vector(0,0,0)
  1896.             data.angle = preset_data.angle or Angle(0,0,0)
  1897.            
  1898.             local bonepanel = vgui.Create( "DPanel", pweapon )
  1899.             bonepanel:SetPos( x, y )
  1900.             bonepanel:SetSize( 260, 110 )
  1901.             bonepanel:SetVisible( true )
  1902.             bonepanel:SetPaintBackground( true )
  1903.             bonepanel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, bonepanel:GetWide(), bonepanel:GetTall() ) end
  1904.            
  1905.             local rely = 0
  1906.            
  1907.             local vslabel = vgui.Create( "DLabel", bonepanel )
  1908.             vslabel:SetPos( 5, 8 + rely )
  1909.             vslabel:SetText( "Scale" )
  1910.             vslabel:SizeToContents()
  1911.             vslabel:SetTall( 24 )
  1912.            
  1913.             local vsxwang = vgui.Create( "DNumberWang", bonepanel )
  1914.             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!
  1915.            local areavx = vsxwang:GetTextArea()
  1916.            areavx.OnTextChanged = function() vsxwang:SetValue(tonumber(areavx:GetValue())) end
  1917.            
  1918.            local vsywang = vgui.Create( "DNumberWang", bonepanel )
  1919.            vsywang:SetPos( 145, 10 + rely ) vsywang:SetSize( 50, 20 ) vsywang:SetMinMax( 0.01, 3 ) vsywang:SetDecimals( 3 )
  1920.            vsywang.OnValueChanged = function( p, value )
  1921.                if (selbone != "") then wep.v_bonemods[selbone].scale.y = tonumber(value) end
  1922.            end
  1923.            local areavy = vsywang:GetTextArea()
  1924.            areavy.OnTextChanged = function() vsywang:SetValue(tonumber(areavy:GetValue())) end
  1925.            
  1926.            local vszwang = vgui.Create( "DNumberWang", bonepanel )
  1927.            vszwang:SetPos( 200, 10 + rely ) vszwang:SetSize( 50, 20 ) vszwang:SetMinMax( 0.01, 3 ) vszwang:SetDecimals( 3 )
  1928.            vszwang.OnValueChanged = function( p, value )
  1929.                if (selbone != "") then wep.v_bonemods[selbone].scale.z = tonumber(value) end
  1930.            end
  1931.            local areavz = vszwang:GetTextArea()
  1932.            areavz.OnTextChanged = function() vszwang:SetValue(tonumber(areavz:GetValue())) end
  1933.  
  1934.            // make the x numberwang set the total size
  1935.            vsxwang.OnValueChanged = function( p, value )
  1936.                if (selbone == "") then return end
  1937.                vszwang:SetValue( value )
  1938.                vsywang:SetValue( value )
  1939.                wep.v_bonemods[selbone].scale.x = tonumber(value)
  1940.            end
  1941.            
  1942.            rely = rely + 30
  1943.            
  1944.            local vposlabel = vgui.Create( "DLabel", bonepanel )
  1945.            vposlabel:SetPos( 5, 8 + rely )
  1946.            vposlabel:SetText( "Pos" )
  1947.            vposlabel:SizeToContents()
  1948.            vposlabel:SetTall( 24 )
  1949.            
  1950.            local vposxwang = vgui.Create( "DNumberWang", bonepanel )
  1951.            vposxwang:SetPos( 90, 10 + rely ) vposxwang:SetSize( 52, 20 ) vposxwang:SetMinMax( -30, 30 ) vposxwang:SetDecimals( 3 ) // look at me ma, I'm saving space!
  1952.             vposxwang.OnValueChanged = function( p, value )
  1953.                 if (selbone != "") then wep.v_bonemods[selbone].pos.x = tonumber(value) end
  1954.             end
  1955.             local areaposvx = vposxwang:GetTextArea()
  1956.             areaposvx.OnTextChanged = function() vposxwang:SetValue(tonumber(areaposvx:GetValue())) end
  1957.            
  1958.             local vposywang = vgui.Create( "DNumberWang", bonepanel )
  1959.             vposywang:SetPos( 145, 10 + rely ) vposywang:SetSize( 50, 20 ) vposywang:SetMinMax( -30, 30 ) vposywang:SetDecimals( 3 )
  1960.             vposywang.OnValueChanged = function( p, value )
  1961.                 if (selbone != "") then wep.v_bonemods[selbone].pos.y = tonumber(value) end
  1962.             end
  1963.             local areaposvy = vposywang:GetTextArea()
  1964.             areaposvy.OnTextChanged = function() vposywang:SetValue(tonumber(areaposvy:GetValue())) end
  1965.            
  1966.             local vposzwang = vgui.Create( "DNumberWang", bonepanel )
  1967.             vposzwang:SetPos( 200, 10 + rely ) vposzwang:SetSize( 50, 20 ) vposzwang:SetMinMax( -30, 30 ) vposzwang:SetDecimals( 3 )
  1968.             vposzwang.OnValueChanged = function( p, value )
  1969.                 if (selbone != "") then wep.v_bonemods[selbone].pos.z = tonumber(value) end
  1970.             end
  1971.             local areaposvz = vposzwang:GetTextArea()
  1972.             areaposvz.OnTextChanged = function() vposzwang:SetValue(tonumber(areaposvz:GetValue())) end
  1973.  
  1974.             rely = rely + 30
  1975.            
  1976.             local vanglabel = vgui.Create( "DLabel", bonepanel )
  1977.             vanglabel:SetPos( 5, 8 + rely )
  1978.             vanglabel:SetText( "Angle" )
  1979.             vanglabel:SizeToContents()
  1980.             vanglabel:SetTall( 24 )
  1981.            
  1982.             local vangxwang = vgui.Create( "DNumberWang", bonepanel )
  1983.             vangxwang:SetPos( 90, 10 + rely ) vangxwang:SetSize( 52, 20 ) vangxwang:SetMinMax( -180, 180 ) vangxwang:SetDecimals( 3 ) // look at me ma, I'm saving space!
  1984.            vangxwang.OnValueChanged = function( p, value )
  1985.                if (selbone != "") then wep.v_bonemods[selbone].angle.p = tonumber(value) end
  1986.            end
  1987.            local areaangvx = vangxwang:GetTextArea()
  1988.            areaangvx.OnTextChanged = function() vangxwang:SetValue(tonumber(areaangvx:GetValue())) end
  1989.            
  1990.            local vangywang = vgui.Create( "DNumberWang", bonepanel )
  1991.            vangywang:SetPos( 145, 10 + rely ) vangywang:SetSize( 50, 20 ) vangywang:SetMinMax( -180, 180 ) vangywang:SetDecimals( 3 )
  1992.            vangywang.OnValueChanged = function( p, value )
  1993.                if (selbone != "") then wep.v_bonemods[selbone].angle.y = tonumber(value) end
  1994.            end
  1995.            local areaangvy = vangywang:GetTextArea()
  1996.            areaangvy.OnTextChanged = function() vangywang:SetValue(tonumber(areaangvy:GetValue())) end
  1997.            
  1998.            local vangzwang = vgui.Create( "DNumberWang", bonepanel )
  1999.            vangzwang:SetPos( 200, 10 + rely ) vangzwang:SetSize( 50, 20 ) vangzwang:SetMinMax( -180, 180 ) vangzwang:SetDecimals( 3 )
  2000.            vangzwang.OnValueChanged = function( p, value )
  2001.                if (selbone != "") then wep.v_bonemods[selbone].angle.r = tonumber(value) end
  2002.            end
  2003.            local areaangvz = vangzwang:GetTextArea()
  2004.            areaangvz.OnTextChanged = function() vangzwang:SetValue(tonumber(areaangvz:GetValue())) end
  2005.            
  2006.            vsxwang:SetValue( data.scale.x )
  2007.            vsywang:SetValue( data.scale.y )
  2008.            vszwang:SetValue( data.scale.z )
  2009.            
  2010.            vposxwang:SetValue( data.pos.x )
  2011.            vposywang:SetValue( data.pos.y )
  2012.            vposzwang:SetValue( data.pos.z )
  2013.            
  2014.            vangxwang:SetValue( data.angle.p )
  2015.            vangywang:SetValue( data.angle.y )
  2016.            vangzwang:SetValue( data.angle.r )
  2017.            
  2018.            return bonepanel
  2019.        end
  2020.        
  2021.        local cur_bonepanel
  2022.        
  2023.        vsbonebox.OnSelect = function( p, index, value )
  2024.            local selbone = value
  2025.            if (!selbone or selbone == "") then return end
  2026.            
  2027.            if (!wep.v_bonemods[selbone]) then
  2028.                wep.v_bonemods[selbone] = { scale = Vector(1,1,1), pos = Vector(0,0,0), angle = Angle(0,0,0) }
  2029.            end
  2030.            
  2031.            if (cur_bonepanel) then
  2032.                cur_bonepanel:Remove()
  2033.                cur_bonepanel = nil
  2034.            end
  2035.            
  2036.            cur_bonepanel = CreateBoneMod( selbone, 10, bonepanely, wep.v_bonemods[selbone])
  2037.            curbone = selbone
  2038.        end
  2039.        vsbonebox:SetText( curbone )
  2040.        vsbonebox.OnSelect( vsbonebox, 1, curbone )
  2041.            
  2042.        timer.Simple(2, function()
  2043.            local option = PopulateBoneList( vsbonebox, LocalPlayer():GetViewModel() )
  2044.            if (option and curbone == "") then
  2045.                vsbonebox:ChooseOptionID(1)
  2046.            end
  2047.        end)
  2048.            
  2049.        resbtn.DoClick = function()
  2050.            wep.v_bonemods = {}
  2051.            if (curbone == "") then return end
  2052.            
  2053.            wep.v_bonemods[curbone] = { scale = Vector(1,1,1), pos = Vector(0,0,0), angle = Angle(0,0,0) }
  2054.            
  2055.            if (cur_bonepanel) then
  2056.                cur_bonepanel:Remove()
  2057.                cur_bonepanel = nil
  2058.            end
  2059.            
  2060.            cur_bonepanel = CreateBoneMod( curbone, 10, bonepanely, wep.v_bonemods[curbone])
  2061.        end
  2062.        
  2063.        resselbtn.DoClick = function()
  2064.            
  2065.            if (curbone == "") then return end
  2066.            wep.v_bonemods[curbone] = { scale = Vector(1,1,1), pos = Vector(0,0,0), angle = Angle(0,0,0) }
  2067.            
  2068.            if (cur_bonepanel) then
  2069.                cur_bonepanel:Remove()
  2070.                cur_bonepanel = nil
  2071.            end
  2072.            
  2073.            cur_bonepanel = CreateBoneMod( curbone, 10, bonepanely, wep.v_bonemods[curbone])
  2074.        end
  2075.        
  2076.        wep.v_modelbonebox = vsbonebox
  2077.        
  2078.        addy = addy + 130
  2079.        
  2080.        local wpbtn = vgui.Create( "DButton", pweapon )
  2081.        wpbtn:SetPos( 10, addy )
  2082.        wpbtn:SetSize( 260, 30 )
  2083.        wpbtn:SetText( "Print weapon code to console" )
  2084.        wpbtn.DoClick = function()
  2085.            MsgN("*********************************************")
  2086.            for k, v in pairs(string.Explode("\n",GetWeaponPrintText(wep))) do
  2087.                MsgN(v)
  2088.            end
  2089.            MsgN("*********************************************")
  2090.            LocalPlayer():ChatPrint("Code printed to console!")
  2091.        end
  2092.        
  2093.        addy = addy + 35
  2094.        
  2095.        local wpcbtn = vgui.Create( "DButton", pweapon )
  2096.        wpcbtn:SetPos( 10, addy )
  2097.        wpcbtn:SetSize( 260, 30 )
  2098.        wpcbtn:SetText( "Copy weapon code to clipboard" )
  2099.        wpcbtn.DoClick = function()
  2100.            SetClipboardText(GetWeaponPrintText(wep))
  2101.            LocalPlayer():ChatPrint("Code copied to clipboard!")
  2102.        end
  2103.        
  2104.        addy = addy + 35
  2105.        
  2106.        local wpdbtn = vgui.Create( "DButton", pweapon )
  2107.        wpdbtn:SetPos( 10, addy )
  2108.        wpdbtn:SetSize( 260, 30 )
  2109.        wpdbtn:SetText( "Drop weapon (hold reload key to pick back up)" )
  2110.        wpdbtn.DoClick = function()
  2111.            RunConsoleCommand("swepck_dropwep")
  2112.        end
  2113.        
  2114.        /*********************
  2115.            Ironsights page
  2116.        *********************/
  2117.        addy = 10
  2118.        
  2119.        local icbox = vgui.Create( "DCheckBoxLabel", pironsight )
  2120.        icbox:SetPos( 10, addy )
  2121.        icbox:SetSize( 150, 20 )
  2122.        icbox:SetText( "Enable ironsights" )
  2123.        icbox.OnChange = function()
  2124.            if (wep:GetIronSights() != icbox:GetChecked()) then
  2125.                RunConsoleCommand("swepck_toggleironsights")
  2126.            end
  2127.        end
  2128.        if (wep.save_data.IronSightsEnabled) then icbox:SetValue(1)
  2129.        else icbox:SetValue(0) end
  2130.    
  2131.        local ribtn = vgui.Create( "DButton", pironsight )
  2132.        ribtn:SetPos( 140, addy )
  2133.        ribtn:SetSize( 125, 20 )
  2134.        ribtn:SetText( "Reset ironsights" )
  2135.        ribtn.DoClick = function()
  2136.            wep:ResetIronSights()
  2137.        end
  2138.  
  2139.        addy = addy + 30
  2140.        
  2141.        local modlabel = vgui.Create( "DLabel", pironsight )
  2142.        modlabel:SetPos( 10, addy )
  2143.        modlabel:SetSize( 100, 20 )
  2144.        modlabel:SetText( "Drag mode:" )
  2145.        
  2146.        local drbox = vgui.Create( "DMultiChoice", pironsight )
  2147.        drbox:SetPos( 140, addy )
  2148.        drbox:SetSize( 125, 20 )
  2149.        drbox:SetEditable( false )
  2150.        drbox:SetText( wep.cur_drag_mode )
  2151.        for k, v in pairs( drag_modes ) do
  2152.            drbox:AddChoice( k )
  2153.        end
  2154.        drbox.OnSelect = function(panel,index,value)
  2155.            local modes = drag_modes[value]
  2156.            wep.cur_drag_mode = value
  2157.            for k, v in pairs( wep.ir_drag ) do
  2158.                v[1] = table.HasValue( modes, k ) // set the drag modus
  2159.            end
  2160.        end
  2161.        
  2162.        addy = addy + 30
  2163.        
  2164.        local ixslider = vgui.Create( "DNumSlider", pironsight )
  2165.        ixslider:SetPos( 10, addy )
  2166.        ixslider:SetWide( 260 )
  2167.        ixslider:SetText( "Translate x" )
  2168.        ixslider:SetMin( -20 )
  2169.        ixslider:SetMax( 20 )
  2170.        ixslider:SetDecimals( 3 )
  2171.        ixslider:SetConVar( "_sp_ironsight_x" )
  2172.        ixslider:SetValue( wep.save_data.IronSightsPos.x )
  2173.        local areaix = ixslider:GetTextArea()
  2174.        areaix.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_x",areaix:GetValue()) end
  2175.            
  2176.        addy = addy + 45
  2177.        
  2178.        local iyslider = vgui.Create( "DNumSlider", pironsight )
  2179.        iyslider:SetPos( 10, addy )
  2180.        iyslider:SetWide( 260 )
  2181.        iyslider:SetText( "Translate y" )
  2182.        iyslider:SetMin( -20 )
  2183.        iyslider:SetMax( 20 )
  2184.        iyslider:SetDecimals( 3 )
  2185.        iyslider:SetConVar( "_sp_ironsight_y" )
  2186.        iyslider:SetValue( wep.save_data.IronSightsPos.y )
  2187.        local areaiy = iyslider:GetTextArea()
  2188.        areaiy.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_y",areaiy:GetValue()) end
  2189.        
  2190.        addy = addy + 45
  2191.        
  2192.        local izslider = vgui.Create( "DNumSlider", pironsight )
  2193.        izslider:SetPos( 10, addy )
  2194.        izslider:SetWide( 260 )
  2195.        izslider:SetText( "Translate z" )
  2196.        izslider:SetMin( -20 )
  2197.        izslider:SetMax( 20 )
  2198.        izslider:SetDecimals( 3 )
  2199.        izslider:SetConVar( "_sp_ironsight_z" )
  2200.        izslider:SetValue( wep.save_data.IronSightsPos.z )
  2201.        local areaiz = izslider:GetTextArea()
  2202.        areaiz.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_z",areaiz:GetValue()) end
  2203.        
  2204.        addy = addy + 45
  2205.        
  2206.        local ipslider = vgui.Create( "DNumSlider", pironsight )
  2207.        ipslider:SetPos( 10, addy )
  2208.        ipslider:SetWide( 260 )
  2209.        ipslider:SetText( "Rotate pitch" )
  2210.        ipslider:SetMin( -70 )
  2211.        ipslider:SetMax( 70 )
  2212.        ipslider:SetDecimals( 3 )
  2213.        ipslider:SetConVar( "_sp_ironsight_pitch" )
  2214.        ipslider:SetValue( wep.save_data.IronSightsAng.x )
  2215.        local areaip = ipslider:GetTextArea()
  2216.        areaip.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_pitch",areaip:GetValue()) end
  2217.        
  2218.        addy = addy + 45
  2219.        
  2220.        local iyaslider = vgui.Create( "DNumSlider", pironsight )
  2221.        iyaslider:SetPos( 10, addy )
  2222.        iyaslider:SetWide( 260 )
  2223.        iyaslider:SetText( "Rotate yaw" )
  2224.        iyaslider:SetMin( -70 )
  2225.        iyaslider:SetMax( 70 )
  2226.        iyaslider:SetDecimals( 3 )
  2227.        iyaslider:SetConVar( "_sp_ironsight_yaw" )
  2228.        iyaslider:SetValue( wep.save_data.IronSightsAng.y )
  2229.        local areaiya = iyaslider:GetTextArea()
  2230.        areaiya.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_yaw",areaiya:GetValue()) end
  2231.        
  2232.        addy = addy + 45
  2233.        
  2234.        local irslider = vgui.Create( "DNumSlider", pironsight )
  2235.        irslider:SetPos( 10, addy )
  2236.        irslider:SetWide( 260 )
  2237.        irslider:SetText( "Rotate roll" )
  2238.        irslider:SetMin( -70 )
  2239.        irslider:SetMax( 70 )
  2240.        irslider:SetDecimals( 3 )
  2241.        irslider:SetConVar( "_sp_ironsight_roll" )
  2242.        irslider:SetValue( wep.save_data.IronSightsAng.z )
  2243.        local areair = irslider:GetTextArea()
  2244.        areair.OnTextChanged = function() RunConsoleCommand("_sp_ironsight_roll",areair:GetValue()) end
  2245.        
  2246.        addy = addy + 45
  2247.        
  2248.        local prbtn = vgui.Create( "DButton", pironsight )
  2249.        prbtn:SetPos( 10, addy )
  2250.        prbtn:SetSize( 260, 30 )
  2251.        prbtn:SetText( "Print ironsights code to console" )
  2252.        prbtn.DoClick = function()
  2253.            local vec, ang = wep:GetIronSightCoordination()
  2254.            MsgN("*********************************************")
  2255.            MsgN(GetIronSightPrintText( vec, ang ))
  2256.            MsgN("*********************************************")
  2257.            LocalPlayer():ChatPrint("Code printed to console!")
  2258.        end
  2259.        
  2260.        addy = addy + 35
  2261.        
  2262.        local pcbtn = vgui.Create( "DButton", pironsight )
  2263.        pcbtn:SetPos( 10, addy )
  2264.        pcbtn:SetSize( 260, 30 )
  2265.        pcbtn:SetText( "Copy ironsights code to clipboard" )
  2266.        pcbtn.DoClick = function()
  2267.            local vec, ang = wep:GetIronSightCoordination()
  2268.            SetClipboardText(GetIronSightPrintText( vec, ang ))
  2269.            LocalPlayer():ChatPrint("Code copied to clipboard!")
  2270.        end
  2271.        
  2272.        /*********************
  2273.            Models page
  2274.        *********************/
  2275.        addy = 10
  2276.        
  2277.        local lastVisible = ""
  2278.        local mlist = vgui.Create( "DListView", pmodels)
  2279.        wep.v_modelListing = mlist
  2280.  
  2281.        local mlabel = vgui.Create( "DLabel", pmodels )
  2282.        mlabel:SetPos( 10, addy )
  2283.        mlabel:SetSize( 130, 20 )
  2284.        mlabel:SetText( "New viewmodel element:" )
  2285.        
  2286.        local function CreateNote( text )
  2287.            local templabel = vgui.Create( "DLabel" )
  2288.            templabel:SetText( text )
  2289.            templabel:SetSize( 120, 20 )
  2290.  
  2291.            local notif = vgui.Create( "DNotify" , pmodels )
  2292.            notif:SetPos( 140, 10 )
  2293.            notif:SetSize( 120, 20 )
  2294.            notif:SetLife( 5 )
  2295.            notif:AddItem(templabel)
  2296.            
  2297.        end
  2298.        
  2299.        addy = addy + 25
  2300.        
  2301.        local mntext = vgui.Create("DTextEntry", pmodels )
  2302.        mntext:SetPos( 10, addy )
  2303.        mntext:SetSize( 120, 20 )
  2304.        mntext:SetMultiline(false)
  2305.        mntext:SetText( "some_unique_name" )
  2306.        
  2307.        local tpbox = vgui.Create( "DMultiChoice", pmodels )
  2308.        tpbox:SetPos( 130, addy )
  2309.        tpbox:SetSize( 85, 20 )
  2310.        tpbox:SetEditable( false )
  2311.        tpbox:SetText( "Model" )
  2312.        tpbox:AddChoice( "Model" )
  2313.        tpbox:AddChoice( "Sprite" )
  2314.        tpbox:AddChoice( "Quad" )
  2315.        local boxselected = "Model"
  2316.        tpbox.OnSelect = function( p, index, value )
  2317.            boxselected = value
  2318.        end
  2319.        
  2320.        local mnbtn = vgui.Create( "DButton", pmodels )
  2321.        mnbtn:SetPos( 220, addy )
  2322.        mnbtn:SetSize( 45, 20 )
  2323.        mnbtn:SetText( "Add" )
  2324.  
  2325.        addy = addy + 30
  2326.        
  2327.        mlist:SetPos( 10, addy )
  2328.        mlist:SetSize( 260, 120 )
  2329.        mlist:SetMultiSelect(false)
  2330.        mlist:SetDrawBackground(true)
  2331.        mlist:AddColumn("Name")
  2332.        mlist:AddColumn("Type")
  2333.        // cache the created panels
  2334.        mlist.OnRowSelected = function( panel, line )
  2335.            local name = mlist:GetLine(line):GetValue(1)
  2336.            
  2337.            local posx, posy = wep.v_panelCache[name]:GetPos()
  2338.  
  2339.            if (wep.v_panelCache[lastVisible]) then
  2340.                wep.v_panelCache[lastVisible]:SetVisible(false)
  2341.            end
  2342.            wep.v_panelCache[name]:SetVisible(true)
  2343.            
  2344.            lastVisible = name
  2345.        end
  2346.        
  2347.        addy = addy + 125
  2348.        
  2349.        local rmbtn = vgui.Create( "DButton", pmodels )
  2350.        rmbtn:SetPos( 10, addy )
  2351.        rmbtn:SetSize( 130, 25 )
  2352.        rmbtn:SetText( "Remove selected" )
  2353.        
  2354.        local copybtn = vgui.Create( "DButton", pmodels )
  2355.        copybtn:SetPos( 145, addy )
  2356.        copybtn:SetSize( 125, 25 )
  2357.        copybtn:SetText( "Copy selected" )
  2358.        
  2359.        addy = addy + 30
  2360.        
  2361.        local function CreatePositionModifiers( data, addy, panel )
  2362.            
  2363.            local trlabel = vgui.Create( "DLabel", panel )
  2364.            trlabel:SetPos( 5, addy )
  2365.            trlabel:SetSize( 80, 20 )
  2366.            trlabel:SetText( "Pos x/y/z:" )
  2367.            
  2368.            local mxwang = vgui.Create( "DNumberWang", panel )
  2369.            mxwang:SetPos( 90, addy )
  2370.            mxwang:SetSize( 50, 20 )
  2371.            mxwang:SetMin( -30 )
  2372.            mxwang:SetMax( 30 )
  2373.            mxwang:SetDecimals( 3 )
  2374.            mxwang.OnValueChanged = function( p, value ) data.pos.x = tonumber(value) end
  2375.            mxwang:SetValue( data.pos.x )
  2376.            local areax = mxwang:GetTextArea()
  2377.            areax.OnTextChanged = function() mxwang:SetValue(tonumber(areax:GetValue())) end
  2378.            
  2379.            local mywang = vgui.Create( "DNumberWang", panel )
  2380.            mywang:SetPos( 145, addy )
  2381.            mywang:SetSize( 50, 20 )
  2382.            mywang:SetMin( -30 )
  2383.            mywang:SetMax( 30 )
  2384.            mywang:SetDecimals( 3 )
  2385.            mywang.OnValueChanged = function( p, value ) data.pos.y = tonumber(value) end
  2386.            mywang:SetValue( data.pos.y )
  2387.            local areay = mywang:GetTextArea()
  2388.            areay.OnTextChanged = function() mywang:SetValue(tonumber(areay:GetValue())) end
  2389.            
  2390.            local mzwang = vgui.Create( "DNumberWang", panel )
  2391.            mzwang:SetPos( 200, addy )
  2392.            mzwang:SetSize( 50, 20 )
  2393.            mzwang:SetMin( -30 )
  2394.            mzwang:SetMax( 30 )
  2395.            mzwang:SetDecimals( 3 )
  2396.            mzwang.OnValueChanged = function( p, value ) data.pos.z = tonumber(value) end
  2397.            mzwang:SetValue( data.pos.z )
  2398.            local areaz = mzwang:GetTextArea()
  2399.            areaz.OnTextChanged = function() mzwang:SetValue(tonumber(areaz:GetValue())) end
  2400.        
  2401.        end
  2402.        
  2403.        local function CreateAngleModifiers( data, addy, panel )
  2404.        
  2405.            local anlabel = vgui.Create( "DLabel", panel )
  2406.            anlabel:SetPos( 5, addy )
  2407.            anlabel:SetSize( 80, 20 )
  2408.            anlabel:SetText( "Angle p/y/r:" )
  2409.            
  2410.            local mpitchwang = vgui.Create( "DNumberWang", panel )
  2411.            mpitchwang:SetPos( 90, addy )
  2412.            mpitchwang:SetSize( 50, 20 )
  2413.            mpitchwang:SetMin( -180 )
  2414.            mpitchwang:SetMax( 180 )
  2415.            mpitchwang:SetDecimals( 3 )
  2416.            mpitchwang.OnValueChanged = function( p, value ) data.angle.p = tonumber(value) end
  2417.            mpitchwang:SetValue( data.angle.p )
  2418.            local areap = mpitchwang:GetTextArea()
  2419.            areap.OnTextChanged = function() mpitchwang:SetValue(tonumber(areap:GetValue())) end
  2420.            
  2421.            local myawwang = vgui.Create( "DNumberWang", panel )
  2422.            myawwang:SetPos( 145, addy )
  2423.            myawwang:SetSize( 50, 20 )
  2424.            myawwang:SetMin( -180 )
  2425.            myawwang:SetMax( 180 )
  2426.            myawwang:SetDecimals( 3 )
  2427.            myawwang.OnValueChanged = function( p, value ) data.angle.y = tonumber(value) end
  2428.            myawwang:SetValue( data.angle.y )
  2429.            local areay = myawwang:GetTextArea()
  2430.            areay.OnTextChanged = function() myawwang:SetValue(tonumber(areay:GetValue())) end
  2431.            
  2432.            local mrollwang = vgui.Create( "DNumberWang", panel )
  2433.            mrollwang:SetPos( 200, addy )
  2434.            mrollwang:SetSize( 50, 20 )
  2435.            mrollwang:SetMin( -180 )
  2436.            mrollwang:SetMax( 180 )
  2437.            mrollwang:SetDecimals( 3 )
  2438.            mrollwang.OnValueChanged = function( p, value ) data.angle.r = tonumber(value) end
  2439.            mrollwang:SetValue( data.angle.r )
  2440.            local arear = mrollwang:GetTextArea()
  2441.            arear.OnTextChanged = function() mrollwang:SetValue(tonumber(arear:GetValue())) end
  2442.            
  2443.        end
  2444.        
  2445.        local function CreateSizeModifiers( data, addy, panel, dimensions )
  2446.  
  2447.            local sizelabel = vgui.Create( "DLabel", panel )
  2448.            sizelabel:SetPos( 5, addy )
  2449.            sizelabel:SetSize( 80, 20 )
  2450.            
  2451.            if (dimensions == 2) then
  2452.                sizelabel:SetText( "Size (xy)/y:" )
  2453.            elseif ( dimensions == 3 ) then
  2454.                sizelabel:SetText( "Size (xyz)/y/z:" )
  2455.            else
  2456.                sizelabel:SetText( "Size:" )
  2457.            end
  2458.            
  2459.            local msxwang = vgui.Create( "DNumberWang", panel )
  2460.            msxwang:SetPos( 90, addy-2 )
  2461.            msxwang:SetSize( 52, 24 )
  2462.            msxwang:SetMin( 0.01 )
  2463.            msxwang:SetMax( 10 )
  2464.            msxwang:SetDecimals( 3 )
  2465.            local areasx = msxwang:GetTextArea()
  2466.            areasx.OnTextChanged = function() msxwang:SetValue(tonumber(areasx:GetValue())) end
  2467.            
  2468.            local msywang, mszwang
  2469.  
  2470.            if (dimensions > 1 ) then
  2471.            
  2472.                msywang = vgui.Create( "DNumberWang", panel )
  2473.                msywang:SetPos( 145, addy )
  2474.                msywang:SetSize( 50, 20 )
  2475.                msywang:SetMin( 0.01 )
  2476.                msywang:SetMax( 10 )
  2477.                msywang:SetDecimals( 3 )
  2478.                msywang.OnValueChanged = function( p, value ) data.size.y = tonumber(value) end
  2479.                local areasy = msywang:GetTextArea()
  2480.                areasy.OnTextChanged = function() msywang:SetValue(tonumber(areasy:GetValue())) end
  2481.  
  2482.                if (dimensions > 2) then
  2483.                    mszwang = vgui.Create( "DNumberWang", panel )
  2484.                    mszwang:SetPos( 200, addy )
  2485.                    mszwang:SetSize( 50, 20 )
  2486.                    mszwang:SetMin( 0.01 )
  2487.                    mszwang:SetMax( 10 )
  2488.                    mszwang:SetDecimals( 3 )
  2489.                    mszwang.OnValueChanged = function( p, value ) data.size.z = tonumber(value) end
  2490.                    local areasz = mszwang:GetTextArea()
  2491.                    areasz.OnTextChanged = function() mszwang:SetValue(tonumber(areasz:GetValue())) end
  2492.                end
  2493.            
  2494.            end
  2495.            
  2496.            // make the x numberwang set the total size
  2497.            msxwang.OnValueChanged = function( p, value )
  2498.                if (mszwang) then
  2499.                    mszwang:SetValue( value )
  2500.                end
  2501.                if (msywang) then
  2502.                    msywang:SetValue( value )
  2503.                end
  2504.                
  2505.                if (dimensions > 1) then
  2506.                    data.size.x = tonumber(value)
  2507.                else
  2508.                    data.size = tonumber(value)
  2509.                end
  2510.            end
  2511.            
  2512.            if (dimensions == 1) then
  2513.                
  2514.                msxwang:SetValue( data.size )
  2515.                
  2516.            else
  2517.            
  2518.                local new_y = data.size.y
  2519.                local new_z = data.size.z
  2520.                
  2521.                msxwang:SetValue( data.size.x )
  2522.                msywang:SetValue( new_y )
  2523.                if (mszwang) then
  2524.                    mszwang:SetValue( new_z )
  2525.                end
  2526.                
  2527.            end
  2528.            
  2529.        end
  2530.        
  2531.        local function CreateColorModifiers( data, addy, panel )
  2532.        
  2533.            local collabel = vgui.Create( "DLabel", panel )
  2534.            collabel:SetPos( 5, addy )
  2535.            collabel:SetSize( 80, 20 )
  2536.            collabel:SetText( "Color r/g/b/a:" )
  2537.            
  2538.            local colrwang = vgui.Create( "DNumberWang", panel )
  2539.            colrwang:SetPos( 90, addy )
  2540.            colrwang:SetSize( 38, 20 )
  2541.            colrwang:SetMin( 0 )
  2542.            colrwang:SetMax( 255 )
  2543.            colrwang:SetDecimals( 0 )
  2544.            colrwang.OnValueChanged = function( p, value ) data.color.r = tonumber(value) end
  2545.            colrwang:SetValue(data.color.r)
  2546.            local arear = colrwang:GetTextArea()
  2547.            arear.OnTextChanged = function() colrwang:SetValue(tonumber(arear:GetValue())) end
  2548.            
  2549.            local colgwang = vgui.Create( "DNumberWang", panel )
  2550.            colgwang:SetPos( 130, addy )
  2551.            colgwang:SetSize( 38, 20 )
  2552.            colgwang:SetMin( 0 )
  2553.            colgwang:SetMax( 255 )
  2554.            colgwang:SetDecimals( 0 )
  2555.            colgwang.OnValueChanged = function( p, value ) data.color.g = tonumber(value) end
  2556.            colgwang:SetValue(data.color.g)
  2557.            local areag = colgwang:GetTextArea()
  2558.            areag.OnTextChanged = function() colgwang:SetValue(tonumber(areag:GetValue())) end
  2559.            
  2560.            local colbwang = vgui.Create( "DNumberWang", panel )
  2561.            colbwang:SetPos( 170, addy )
  2562.            colbwang:SetSize( 38, 20 )
  2563.            colbwang:SetMin( 0 )
  2564.            colbwang:SetMax( 255 )
  2565.            colbwang:SetDecimals( 0 )
  2566.            colbwang.OnValueChanged = function( p, value ) data.color.b = tonumber(value) end
  2567.            colbwang:SetValue(data.color.b)
  2568.            local areab = colbwang:GetTextArea()
  2569.            areab.OnTextChanged = function() colbwang:SetValue(tonumber(areab:GetValue())) end
  2570.            
  2571.            local colawang = vgui.Create( "DNumberWang", panel )
  2572.            colawang:SetPos( 210, addy )
  2573.            colawang:SetSize( 40, 20 )
  2574.            colawang:SetMin( 0 )
  2575.            colawang:SetMax( 255 )
  2576.            colawang:SetDecimals( 0 )
  2577.            colawang.OnValueChanged = function( p, value ) data.color.a = tonumber(value) end
  2578.            colawang:SetValue(data.color.a)
  2579.            local areaa = colawang:GetTextArea()
  2580.            areaa.OnTextChanged = function() colawang:SetValue(tonumber(areaa:GetValue())) end
  2581.            
  2582.        end
  2583.        
  2584.        local function CreateModelModifier( data, addy, panel )
  2585.        
  2586.            local pmolabel = vgui.Create( "DLabel", panel )
  2587.            pmolabel:SetPos( 5, addy )
  2588.            pmolabel:SetSize( 80, 20 )
  2589.            pmolabel:SetText( "Model:" )
  2590.            
  2591.            local pmmtext = vgui.Create( "DTextEntry", panel )
  2592.            pmmtext:SetPos( 60, addy )
  2593.            pmmtext:SetSize( 170, 20 )
  2594.            pmmtext:SetMultiline(false)
  2595.            pmmtext:SetToolTip("Path to the model file")
  2596.            pmmtext.OnTextChanged = function()
  2597.                local newmod = pmmtext:GetValue()
  2598.                if file.Exists (newmod,true) then
  2599.                    util.PrecacheModel(newmod)
  2600.                    data.model = newmod
  2601.                end
  2602.            end
  2603.            pmmtext:SetText( data.model )
  2604.            pmmtext.OnTextChanged()
  2605.            
  2606.            local wtbtn = vgui.Create( "DButton", panel )
  2607.            wtbtn:SetPos( 230, addy )
  2608.            wtbtn:SetSize( 20, 20 )
  2609.            wtbtn:SetText("...")
  2610.            wtbtn.DoClick = function()
  2611.                OpenBrowser( data.model, "model", function( val ) pmmtext:SetText(val) pmmtext:OnTextChanged() end )
  2612.            end
  2613.            
  2614.        end
  2615.        
  2616.        local function CreateSpriteModifier( data, addy, panel )
  2617.        
  2618.            local pmolabel = vgui.Create( "DLabel", panel )
  2619.            pmolabel:SetPos( 5, addy )
  2620.            pmolabel:SetSize( 80, 20 )
  2621.            pmolabel:SetText( "Sprite:" )
  2622.            
  2623.            local pmmtext = vgui.Create( "DTextEntry", panel )
  2624.            pmmtext:SetPos( 60, addy )
  2625.            pmmtext:SetSize( 170, 20 )
  2626.            pmmtext:SetMultiline(false)
  2627.            pmmtext:SetToolTip("Path to the sprite material")
  2628.            pmmtext.OnTextChanged = function()
  2629.                local newsprite = pmmtext:GetValue()
  2630.                if file.Exists ("materials/"..newsprite..".vmt",true) then
  2631.                    data.sprite = newsprite
  2632.                end
  2633.            end
  2634.            pmmtext:SetText( data.sprite )
  2635.            pmmtext.OnTextChanged()
  2636.            
  2637.            local wtbtn = vgui.Create( "DButton", panel )
  2638.            wtbtn:SetPos( 230, addy )
  2639.            wtbtn:SetSize( 20, 20 )
  2640.            wtbtn:SetText("...")
  2641.            wtbtn.DoClick = function()
  2642.                OpenBrowser( data.sprite, "material", function( val ) pmmtext:SetText(val) pmmtext:OnTextChanged() end )
  2643.            end
  2644.            
  2645.            
  2646.        end
  2647.        
  2648.        local function CreateNameLabel( name, addy, panel )
  2649.            
  2650.            local pnmlabel = vgui.Create( "DLabel", panel )
  2651.            pnmlabel:SetPos( 5, addy )
  2652.            pnmlabel:SetSize( 80, 20 )
  2653.            pnmlabel:SetText( "Name:" )
  2654.            
  2655.            local pnmtext = vgui.Create( "DTextEntry", panel )
  2656.            pnmtext:SetPos( 60, addy )
  2657.            pnmtext:SetSize( 190, 20 )
  2658.            pnmtext:SetMultiline(false)
  2659.            pnmtext:SetText( name )
  2660.            pnmtext:SetEditable( false )
  2661.            
  2662.        end
  2663.        
  2664.        local function CreateParamModifiers( data, addy, panel )
  2665.        
  2666.            local ncchbox = vgui.Create( "DCheckBoxLabel", panel )
  2667.            ncchbox:SetPos( 5, addy )
  2668.            ncchbox:SetSize( 120, 20 )
  2669.            ncchbox:SetText("$nocull")
  2670.            ncchbox:SetValue( 0 )
  2671.            ncchbox.OnChange = function()
  2672.                data.nocull = ncchbox:GetChecked()
  2673.                data.spriteMaterial = nil // dump old material
  2674.            end
  2675.            if (data.nocull) then ncchbox:SetValue( 1 ) end
  2676.            
  2677.            local adchbox = vgui.Create( "DCheckBoxLabel", panel )
  2678.            adchbox:SetPos( 140, addy )
  2679.            adchbox:SetSize( 120, 20 )
  2680.            adchbox:SetText("$additive")
  2681.            adchbox:SetValue( 0 )
  2682.            adchbox.OnChange = function()
  2683.                data.additive = adchbox:GetChecked()
  2684.                data.spriteMaterial = nil // dump old material
  2685.            end
  2686.            if (data.additive) then adchbox:SetValue( 1 ) end
  2687.            
  2688.            addy = addy + 22
  2689.            
  2690.            local vtachbox = vgui.Create( "DCheckBoxLabel", panel )
  2691.            vtachbox:SetPos( 5, addy )
  2692.            vtachbox:SetSize( 120, 20 )
  2693.            vtachbox:SetText("$vertexalpha")
  2694.            vtachbox:SetValue( 0 )
  2695.            vtachbox.OnChange = function()
  2696.                data.vertexalpha = vtachbox:GetChecked()
  2697.                data.spriteMaterial = nil // dump old material
  2698.            end
  2699.            if (data.vertexalpha) then vtachbox:SetValue( 1 ) end
  2700.            
  2701.            local vtcchbox = vgui.Create( "DCheckBoxLabel", panel )
  2702.            vtcchbox:SetPos( 140, addy )
  2703.            vtcchbox:SetSize( 120, 20 )
  2704.            vtcchbox:SetText("$vertexcolor")
  2705.            vtcchbox:SetValue( 0 )
  2706.            vtcchbox.OnChange = function()
  2707.                data.vertexcolor = vtcchbox:GetChecked()
  2708.                data.spriteMaterial = nil // dump old material
  2709.            end
  2710.            if (data.vertexcolor) then vtcchbox:SetValue( 1 ) end
  2711.            
  2712.            addy = addy + 22
  2713.            
  2714.            local izchbox = vgui.Create( "DCheckBoxLabel", panel )
  2715.            izchbox:SetPos( 5, addy )
  2716.            izchbox:SetSize( 120, 20 )
  2717.            izchbox:SetText("$ignorez")
  2718.            izchbox:SetValue( 0 )
  2719.            izchbox.OnChange = function()
  2720.                data.ignorez = izchbox:GetChecked()
  2721.                data.spriteMaterial = nil // dump old material
  2722.            end
  2723.            if (data.ignorez) then izchbox:SetValue( 1 ) end
  2724.            
  2725.        end
  2726.        
  2727.        local function CreateMaterialModifier( data, addy, panel )
  2728.        
  2729.            local matlabel = vgui.Create( "DLabel", panel )
  2730.            matlabel:SetPos( 5, addy )
  2731.            matlabel:SetSize( 80, 20 )
  2732.            matlabel:SetText( "Material:" )
  2733.  
  2734.            local mattext = vgui.Create("DTextEntry", panel )
  2735.            mattext:SetPos( 90, addy )
  2736.            mattext:SetSize( 140, 20 )
  2737.            mattext:SetMultiline(false)
  2738.            mattext:SetToolTip("Path to the material file")
  2739.            mattext.OnTextChanged = function()
  2740.                local newmat = mattext:GetValue()
  2741.                if file.Exists ("materials/"..newmat..".vmt",true) then
  2742.                    data.material = newmat
  2743.                else
  2744.                    data.material = ""
  2745.                end
  2746.            end
  2747.            mattext:SetText( data.material )
  2748.            
  2749.            local wtbtn = vgui.Create( "DButton", panel )
  2750.            wtbtn:SetPos( 230, addy )
  2751.            wtbtn:SetSize( 20, 20 )
  2752.            wtbtn:SetText("...")
  2753.            wtbtn.DoClick = function()
  2754.                OpenBrowser( data.material, "material", function( val ) mattext:SetText(val) mattext:OnTextChanged() end )
  2755.            end
  2756.            
  2757.        end
  2758.        
  2759.        local function CreateSLightningModifier( data, addy, panel )
  2760.        
  2761.            local lschbox = vgui.Create( "DCheckBoxLabel", panel )
  2762.            lschbox:SetPos( 5, addy )
  2763.            lschbox:SetSize( 200, 20 )
  2764.            lschbox:SetText("Surpress engine lightning")
  2765.            lschbox.OnChange = function()
  2766.                data.surpresslightning = lschbox:GetChecked()
  2767.            end
  2768.            if (data.surpresslightning) then
  2769.                lschbox:SetValue( 1 )
  2770.            else
  2771.                lschbox:SetValue( 0 )
  2772.            end
  2773.            
  2774.        end
  2775.        
  2776.        local function CreateBoneModifier( data, addy, panel, ent )
  2777.            
  2778.            local pbonelabel = vgui.Create( "DLabel", panel )
  2779.            pbonelabel:SetPos( 5, addy )
  2780.            pbonelabel:SetSize( 80, 20 )
  2781.            pbonelabel:SetText( "Bone:" )
  2782.            
  2783.            local bonebox = vgui.Create( "DMultiChoice", panel )
  2784.            bonebox:SetPos( 60, addy )
  2785.            bonebox:SetSize( 190, 20 )
  2786.            bonebox:SetEditable( false )
  2787.            bonebox:SetToolTip("Bone to parent the selected element to. Is ignored if the 'Relative' field is not empty")
  2788.            bonebox.OnSelect = function( p, index, value )
  2789.                data.bone = value
  2790.            end
  2791.            bonebox:SetText( data.bone )
  2792.            
  2793.            local delay = 0
  2794.            // we have to call it later when loading settings because the viewmodel needs to be changed first
  2795.            if (data.bone != "") then delay = 2 end
  2796.            
  2797.            timer.Simple(delay, function()
  2798.                local option = PopulateBoneList( bonebox, ent )
  2799.                if (option and data.bone == "") then
  2800.                    bonebox:ChooseOptionID(1)
  2801.                end
  2802.            end)
  2803.            
  2804.        end
  2805.        
  2806.        local function CreateRelativeModifier( data, addy, panel )
  2807.            
  2808.            local prellabel = vgui.Create( "DLabel", panel )
  2809.            prellabel:SetPos( 5, addy )
  2810.            prellabel:SetSize( 80, 20 )
  2811.            prellabel:SetText( "Relative:" )
  2812.            
  2813.            local reltext = vgui.Create( "DTextEntry", panel )
  2814.            reltext:SetPos( 60, addy )
  2815.            reltext:SetSize( 190, 20 )
  2816.            reltext:SetMultiline(false)
  2817.            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")
  2818.            reltext.OnTextChanged = function()
  2819.                data.rel = reltext:GetValue()
  2820.            end
  2821.            reltext:SetText( data.rel )
  2822.            
  2823.        end
  2824.        
  2825.        local function CreateBodygroupSkinModifier( data, addy, panel )
  2826.        
  2827.            local addx = 5
  2828.        
  2829.            local bdlabel = vgui.Create( "DLabel", panel )
  2830.            bdlabel:SetPos( addx, addy )
  2831.            bdlabel:SetSize( 80, 20 )
  2832.            bdlabel:SetText( "Bodygroup:" )
  2833.            
  2834.            addx = addx + 85
  2835.            
  2836.            local bdwang = vgui.Create( "DNumberWang", panel )
  2837.            bdwang:SetPos( addx, addy )
  2838.            bdwang:SetSize( 30, 20 )
  2839.            bdwang:SetMin( 1 )
  2840.            bdwang:SetMax( 9 )
  2841.            bdwang:SetDecimals( 0 )
  2842.            bdwang:SetToolTip("Bodygroup number")
  2843.            local areabd = bdwang:GetTextArea()
  2844.            areabd.OnTextChanged = function() bdwang:SetValue(tonumber(areabd:GetValue())) end
  2845.            
  2846.            addx = addx + 30
  2847.            
  2848.            local islabel = vgui.Create( "DLabel", panel )
  2849.            islabel:SetPos( addx+2, addy )
  2850.            islabel:SetSize( 10, 20 )
  2851.            islabel:SetText( "=" )
  2852.            
  2853.            addx = addx + 10
  2854.            
  2855.            local bdvwang = vgui.Create( "DNumberWang", panel )
  2856.            bdvwang:SetPos( addx, addy )
  2857.            bdvwang:SetSize( 30, 20 )
  2858.            bdvwang:SetMin( 0 )
  2859.            bdvwang:SetMax( 9 )
  2860.            bdvwang:SetDecimals( 0 )
  2861.            bdvwang:SetToolTip("State number")
  2862.            local areabdv = bdvwang:GetTextArea()
  2863.            areabdv.OnTextChanged = function() bdvwang:SetValue(tonumber(areabdv:GetValue())) end
  2864.            
  2865.            bdvwang.OnValueChanged = function( p, value )
  2866.                local group = tonumber(bdwang:GetValue())
  2867.                local val = tonumber(value)
  2868.                data.bodygroup[group] = val
  2869.            end
  2870.            bdvwang:SetValue(0)
  2871.  
  2872.            bdwang.OnValueChanged = function( p, value )
  2873.                local group = tonumber(value)
  2874.                if (group < 1) then return end
  2875.                local setval = data.bodygroup[group] or 0
  2876.                bdvwang:SetValue(setval)
  2877.            end
  2878.            bdwang:SetValue(1)
  2879.  
  2880.            addx = addx + 50
  2881.            
  2882.            local sklabel = vgui.Create( "DLabel", panel )
  2883.            sklabel:SetPos( addx, addy )
  2884.            sklabel:SetSize( 40, 20 )
  2885.            sklabel:SetText( "Skin:" )
  2886.            
  2887.            addx = addx + 40
  2888.            
  2889.            local skwang = vgui.Create( "DNumberWang", panel )
  2890.            skwang:SetPos( addx, addy )
  2891.            skwang:SetSize( 30, 20 )
  2892.            skwang:SetMin( 0 )
  2893.            skwang:SetMax( 9 )
  2894.            skwang:SetDecimals( 0 )
  2895.            skwang.OnValueChanged = function( p, value ) data.skin = tonumber(value) end
  2896.            skwang:SetValue(data.skin)
  2897.            local areask = skwang:GetTextArea()
  2898.            areask.OnTextChanged = function() skwang:SetValue(tonumber(areask:GetValue())) end
  2899.            
  2900.        end
  2901.        
  2902.        
  2903.        local panely = addy
  2904.        local panelh = 580 - panely - 60
  2905.        /*** Model panel for adjusting models ***
  2906.        Name:
  2907.        Model:
  2908.        Bone name:
  2909.        Translation x / y / z
  2910.        Rotation pitch / yaw / role
  2911.        Model size x / y / z
  2912.        Material
  2913.        Color modulation
  2914.        */
  2915.        local function CreateModelPanel( name, x, y, preset_data )
  2916.            
  2917.            local data = wep.v_models[name]
  2918.            if (!preset_data) then preset_data = {} end
  2919.            
  2920.            // default data
  2921.            data.type = preset_data.type or "Model"
  2922.            data.model = preset_data.model or ""
  2923.            data.bone = preset_data.bone or ""
  2924.            data.rel = preset_data.rel or ""
  2925.            data.pos = preset_data.pos or Vector(0,0,0)
  2926.            data.angle = preset_data.angle or Angle(0,0,0)
  2927.            data.size = preset_data.size or Vector(0.5,0.5,0.5)
  2928.            data.color = preset_data.color or Color(255,255,255,255)
  2929.            data.surpresslightning = preset_data.surpresslightning or false
  2930.            data.material = preset_data.material or ""
  2931.            data.bodygroup = preset_data.bodygroup or {}
  2932.            data.skin = preset_data.skin or 0
  2933.            
  2934.            wep.vRenderOrder = nil // force viewmodel render order to recache
  2935.            
  2936.            local panel = vgui.Create( "DPanel", pmodels )
  2937.            panel:SetPos( x, y )
  2938.            panel:SetSize( 260, panelh )
  2939.            panel:SetPaintBackground( true )
  2940.            panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
  2941.            
  2942.            local addy = 5
  2943.            
  2944.            CreateNameLabel( name, addy, panel )
  2945.            
  2946.            addy = addy + 25
  2947.            
  2948.            CreateModelModifier( data, addy, panel )
  2949.            
  2950.            addy = addy + 25
  2951.            
  2952.            CreateBoneModifier( data, addy, panel, LocalPlayer():GetViewModel() )
  2953.            
  2954.            addy = addy + 25
  2955.            
  2956.            CreateRelativeModifier( data, addy, panel )
  2957.            
  2958.            addy = addy + 25
  2959.            
  2960.            CreatePositionModifiers( data, addy, panel )
  2961.            
  2962.            addy = addy + 25
  2963.  
  2964.            CreateAngleModifiers( data, addy, panel )
  2965.            
  2966.            addy = addy + 25
  2967.  
  2968.            CreateSizeModifiers( data, addy, panel, 3 )
  2969.            
  2970.            addy = addy + 25
  2971.            
  2972.            CreateColorModifiers( data, addy, panel )
  2973.            
  2974.            addy = addy + 25
  2975.            
  2976.            CreateSLightningModifier( data, addy, panel )
  2977.            
  2978.            addy = addy + 22
  2979.            
  2980.            CreateMaterialModifier( data, addy, panel )
  2981.            
  2982.            addy = addy + 25
  2983.            
  2984.            CreateBodygroupSkinModifier( data, addy, panel )
  2985.            
  2986.            return panel
  2987.            
  2988.        end
  2989.        
  2990.        /*** Sprite panel for adjusting sprites ***
  2991.        Name:
  2992.        Sprite:
  2993.        Bone name:
  2994.        Translation x / y / z
  2995.        Sprite x / y size
  2996.        Color
  2997.        */
  2998.        local function CreateSpritePanel( name, x, y, preset_data )
  2999.            
  3000.            local data = wep.v_models[name]
  3001.            if (!preset_data) then preset_data = {} end
  3002.            
  3003.            // default data
  3004.            data.type = preset_data.type or "Sprite"
  3005.            data.sprite = preset_data.sprite or ""
  3006.            data.bone = preset_data.bone or ""
  3007.            data.rel = preset_data.rel or ""
  3008.            data.pos = preset_data.pos or Vector(0,0,0)
  3009.            data.size = preset_data.size or { x = 1, y = 1 }
  3010.            data.color = preset_data.color or Color(255,255,255,255)
  3011.            data.nocull = preset_data.nocull or true
  3012.            data.additive = preset_data.additive or true
  3013.            data.vertexalpha = preset_data.vertexalpha or true
  3014.            data.vertexcolor = preset_data.vertexcolor or true
  3015.            data.ignorez = preset_data.ignorez or false
  3016.            
  3017.            wep.vRenderOrder = nil
  3018.            
  3019.            local panel = vgui.Create( "DPanel", pmodels )
  3020.            panel:SetPos( x, y )
  3021.            panel:SetSize( 260, panelh )
  3022.            panel:SetPaintBackground( true )
  3023.            panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
  3024.            
  3025.            local addy = 5
  3026.            
  3027.            CreateNameLabel( name, addy, panel )
  3028.            
  3029.            addy = addy + 25
  3030.            
  3031.            CreateSpriteModifier( data, addy, panel )
  3032.            
  3033.            addy = addy + 25
  3034.            
  3035.            CreateBoneModifier( data, addy, panel, LocalPlayer():GetViewModel() )
  3036.            
  3037.            addy = addy + 25
  3038.            
  3039.            CreateRelativeModifier( data, addy, panel )
  3040.            
  3041.            addy = addy + 25
  3042.  
  3043.            CreatePositionModifiers( data, addy, panel )
  3044.            
  3045.            addy = addy + 25
  3046.  
  3047.            CreateSizeModifiers( data, addy, panel, 2 )
  3048.  
  3049.            addy = addy + 25
  3050.            
  3051.            CreateColorModifiers( data, addy, panel )
  3052.            
  3053.            addy = addy + 25
  3054.            
  3055.            CreateParamModifiers( data, addy, panel )
  3056.            
  3057.            return panel
  3058.            
  3059.        end
  3060.        
  3061.        /*** Model panel for adjusting models ***
  3062.        Name:
  3063.        Model:
  3064.        Bone name:
  3065.        Translation x / y / z
  3066.        Rotation pitch / yaw / role
  3067.        Size
  3068.        */
  3069.        local function CreateQuadPanel( name, x, y, preset_data )
  3070.            
  3071.            local data = wep.v_models[name]
  3072.            if (!preset_data) then preset_data = {} end
  3073.            
  3074.            // default data
  3075.            data.type = preset_data.type or "Quad"
  3076.            data.model = preset_data.model or ""
  3077.            data.bone = preset_data.bone or ""
  3078.            data.rel = preset_data.rel or ""
  3079.            data.pos = preset_data.pos or Vector(0,0,0)
  3080.            data.angle = preset_data.angle or Angle(0,0,0)
  3081.            data.size = preset_data.size or 0.05
  3082.  
  3083.            wep.vRenderOrder = nil // force viewmodel render order to recache
  3084.            
  3085.            local panel = vgui.Create( "DPanel", pmodels )
  3086.            panel:SetPos( x, y )
  3087.            panel:SetSize( 260, panelh )
  3088.            panel:SetPaintBackground( true )
  3089.            panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
  3090.            
  3091.            local addy = 5
  3092.            
  3093.            CreateNameLabel( name, addy, panel )
  3094.            
  3095.            addy = addy + 25
  3096.            
  3097.            CreateBoneModifier( data, addy, panel, LocalPlayer():GetViewModel() )
  3098.            
  3099.            addy = addy + 25
  3100.            
  3101.            CreateRelativeModifier( data, addy, panel )
  3102.            
  3103.            addy = addy + 25
  3104.            
  3105.            CreatePositionModifiers( data, addy, panel )
  3106.            
  3107.            addy = addy + 25
  3108.  
  3109.            CreateAngleModifiers( data, addy, panel )
  3110.            
  3111.            addy = addy + 25
  3112.  
  3113.            CreateSizeModifiers( data, addy, panel, 1 )
  3114.            
  3115.            return panel
  3116.            
  3117.        end
  3118.        
  3119.        // adding button DoClick
  3120.        mnbtn.DoClick = function()
  3121.            local new = string.Trim( mntext:GetValue() )
  3122.            if (new) then
  3123.                if (new == "") then CreateNote("Empty name field!") return end
  3124.                if (wep.v_models[new] != nil) then CreateNote("Name already exists!") return end
  3125.                wep.v_models[new] = {}
  3126.                
  3127.                if (!wep.v_panelCache[new]) then
  3128.                    if (boxselected == "Model") then
  3129.                        wep.v_panelCache[new] = CreateModelPanel( new, 10, panely )
  3130.                    elseif (boxselected == "Sprite") then
  3131.                        wep.v_panelCache[new] = CreateSpritePanel( new, 10, panely )
  3132.                    elseif (boxselected == "Quad") then
  3133.                        wep.v_panelCache[new] = CreateQuadPanel( new, 10, panely )
  3134.                    else
  3135.                        Error("wtf are u doing")
  3136.                    end
  3137.                end
  3138.                
  3139.                wep.v_panelCache[new]:SetVisible(false)
  3140.                
  3141.                mlist:AddLine(new,boxselected)
  3142.            end
  3143.        end
  3144.        
  3145.        for k, v in pairs( wep.save_data.v_models ) do
  3146.            wep.v_models[k] = {}
  3147.            if (v.type == "Model") then
  3148.                wep.v_panelCache[k] = CreateModelPanel( k, 10, panely, v )
  3149.            elseif (v.type == "Sprite") then
  3150.                wep.v_panelCache[k] = CreateSpritePanel( k, 10, panely, v )
  3151.            elseif (v.type == "Quad") then
  3152.                wep.v_panelCache[k] = CreateQuadPanel( k, 10, panely, v )
  3153.            end
  3154.            wep.v_panelCache[k]:SetVisible(false)
  3155.            mlist:AddLine(k,v.type)
  3156.        
  3157.        end
  3158.  
  3159.        local prtbtn = vgui.Create( "DButton", pmodels)
  3160.        prtbtn:SetPos( 10, 525 )
  3161.        prtbtn:SetSize( 260, 20 )
  3162.        prtbtn:SetText("Print view model table to console")
  3163.        prtbtn.DoClick = function()
  3164.            MsgN("*********************************************")
  3165.            for k, v in pairs(string.Explode("\n",GetVModelsText())) do
  3166.                MsgN(v)
  3167.            end
  3168.            MsgN("*********************************************")
  3169.            LocalPlayer():ChatPrint("Code printed to console!")
  3170.        end
  3171.        
  3172.        local pctbtn = vgui.Create( "DButton", pmodels)
  3173.        pctbtn:SetPos( 10, 550 )
  3174.        pctbtn:SetSize( 260, 20 )
  3175.        pctbtn:SetText("Copy view model table to clipboard")
  3176.        pctbtn.DoClick = function()
  3177.            SetClipboardText(GetVModelsText())
  3178.            LocalPlayer():ChatPrint("Code copied to clipboard!")
  3179.        end
  3180.        
  3181.        // remove a line
  3182.        rmbtn.DoClick = function()
  3183.            local line = mlist:GetSelectedLine()
  3184.            if (line) then
  3185.                local name = mlist:GetLine(line):GetValue(1)
  3186.                wep.v_models[name] = nil
  3187.                // clear from panel cache
  3188.                if (wep.v_panelCache[name]) then
  3189.                    wep.v_panelCache[name]:Remove()
  3190.                    wep.v_panelCache[name] = nil
  3191.                end
  3192.                mlist:RemoveLine(line)
  3193.            end
  3194.        end
  3195.        
  3196.        // duplicate line
  3197.        copybtn.DoClick = function()
  3198.            local line = mlist:GetSelectedLine()
  3199.            if (line) then
  3200.                local name = mlist:GetLine(line):GetValue(1)
  3201.                local to_copy = wep.v_models[name]
  3202.                local new_preset = table.Copy(to_copy)
  3203.                
  3204.                // quickly generate a new unique name
  3205.                while(wep.v_models[name]) do
  3206.                    name = name.."+"
  3207.                end
  3208.                
  3209.                // have to fix every sub-table as well because table.Copy copies references
  3210.                new_preset.pos = Vector(to_copy.pos.x, to_copy.pos.y, to_copy.pos.z)
  3211.                if (to_copy.angle) then
  3212.                    new_preset.angle = Angle(to_copy.angle.p, to_copy.angle.y, to_copy.angle.r)
  3213.                end
  3214.                if (to_copy.color) then
  3215.                    new_preset.color = Color(to_copy.color.r,to_copy.color.g,to_copy.color.b,to_copy.color.a)
  3216.                end
  3217.                if (type(to_copy.size) == "table") then
  3218.                    new_preset.size = table.Copy(to_copy.size)
  3219.                elseif (type(to_copy.size) == "Vector") then
  3220.                    new_preset.size = Vector(to_copy.size.x, to_copy.size.y, to_copy.size.z)
  3221.                end
  3222.                if (to_copy.bodygroup) then
  3223.                    new_preset.bodygroup = table.Copy(to_copy.bodygroup)
  3224.                end
  3225.                
  3226.                wep.v_models[name] = {}
  3227.                
  3228.                if (new_preset.type == "Model") then
  3229.                    wep.v_panelCache[name] = CreateModelPanel( name, 10, panely, new_preset )
  3230.                elseif (new_preset.type == "Sprite") then
  3231.                    wep.v_panelCache[name] = CreateSpritePanel( name, 10, panely, new_preset )
  3232.                elseif (new_preset.type == "Quad") then
  3233.                    wep.v_panelCache[name] = CreateQuadPanel( name, 10, panely, new_preset )
  3234.                end
  3235.                
  3236.                wep.v_panelCache[name]:SetVisible(false)
  3237.                mlist:AddLine(name,new_preset.type)
  3238.            end
  3239.        end
  3240.        
  3241.        /*********************
  3242.            World models page
  3243.        *********************/
  3244.        addy = 10
  3245.        
  3246.        local lastVisible = ""
  3247.        local mwlist = vgui.Create( "DListView", pwmodels)
  3248.        wep.w_modelListing = mwlist
  3249.        
  3250.        local mlabel = vgui.Create( "DLabel", pwmodels )
  3251.        mlabel:SetPos( 10, addy )
  3252.        mlabel:SetSize( 130, 20 )
  3253.        mlabel:SetText( "New worldmodel element:" )
  3254.        
  3255.        local function CreateWNote( text )
  3256.            local templabel = vgui.Create( "DLabel" )
  3257.            templabel:SetText( text )
  3258.            templabel:SetSize( 120, 20 )
  3259.  
  3260.            local notif = vgui.Create( "DNotify" , pwmodels )
  3261.            notif:SetPos( 140, 10 )
  3262.            notif:SetSize( 120, 20 )
  3263.            notif:SetLife( 5 )
  3264.            notif:AddItem(templabel)
  3265.        end
  3266.        
  3267.        addy = addy + 25
  3268.        
  3269.        local mnwtext = vgui.Create("DTextEntry", pwmodels )
  3270.        mnwtext:SetPos( 10, addy )
  3271.        mnwtext:SetSize( 120, 20 )
  3272.        mnwtext:SetMultiline(false)
  3273.        mnwtext:SetText( "some_unique_name" )
  3274.        
  3275.        local tpbox = vgui.Create( "DMultiChoice", pwmodels )
  3276.        tpbox:SetPos( 130, addy )
  3277.        tpbox:SetSize( 85, 20 )
  3278.        tpbox:SetEditable( false )
  3279.        tpbox:SetText( "Model" )
  3280.        tpbox:AddChoice( "Model" )
  3281.        tpbox:AddChoice( "Sprite" )
  3282.        tpbox:AddChoice( "Quad" )
  3283.        local wboxselected = "Model"
  3284.        tpbox.OnSelect = function( p, index, value )
  3285.            wboxselected = value
  3286.        end
  3287.        
  3288.        local mnwbtn = vgui.Create( "DButton", pwmodels )
  3289.        mnwbtn:SetPos( 220, addy )
  3290.        mnwbtn:SetSize( 45, 20 )
  3291.        mnwbtn:SetText( "Add" )
  3292.        
  3293.        addy = addy + 30
  3294.        
  3295.        mwlist:SetPos( 10, addy )
  3296.        mwlist:SetSize( 260, 125 )
  3297.        mwlist:SetMultiSelect(false)
  3298.        mwlist:SetDrawBackground(true)
  3299.        mwlist:AddColumn("Name")
  3300.        mwlist:AddColumn("Type")
  3301.        // cache the created panels
  3302.        mwlist.OnRowSelected = function( panel, line )
  3303.            local name = mwlist:GetLine(line):GetValue(1)
  3304.            
  3305.            if (wep.w_panelCache[lastVisible]) then
  3306.                wep.w_panelCache[lastVisible]:SetVisible(false)
  3307.            end
  3308.            wep.w_panelCache[name]:SetVisible(true)
  3309.            
  3310.            lastVisible = name
  3311.        end
  3312.        
  3313.        addy = addy + 130
  3314.        
  3315.        local importbtn = vgui.Create( "DButton", pwmodels )
  3316.        importbtn:SetPos( 10, addy )
  3317.        importbtn:SetSize( 260, 20 )
  3318.        importbtn:SetText( "Import viewmodels" )
  3319.        
  3320.        addy = addy + 25
  3321.        
  3322.        local rmbtn = vgui.Create( "DButton", pwmodels )
  3323.        rmbtn:SetPos( 10, addy )
  3324.        rmbtn:SetSize( 130, 20 )
  3325.        rmbtn:SetText( "Remove selected" )
  3326.        
  3327.        local copybtn = vgui.Create( "DButton", pwmodels )
  3328.        copybtn:SetPos( 145, addy )
  3329.        copybtn:SetSize( 125, 20 )
  3330.        copybtn:SetText( "Copy selected" )
  3331.        
  3332.        addy = addy + 25
  3333.        
  3334.        local panely = addy
  3335.        local panelh = 580 - panely - 60
  3336.        
  3337.        /*** Model panel for adjusting models ***
  3338.        Name:
  3339.        Model:
  3340.        Translation x / y / z
  3341.        Rotation pitch / yaw / role
  3342.        Model size x / y / z
  3343.        Material
  3344.        Color modulation
  3345.        */
  3346.        local function CreateWorldModelPanel( name, x, y, preset_data )
  3347.            
  3348.            local data = wep.w_models[name]
  3349.            if (!preset_data) then preset_data = {} end
  3350.            
  3351.            // default data
  3352.            data.type = preset_data.type or "Model"
  3353.            data.model = preset_data.model or ""
  3354.            data.bone = preset_data.bone or "ValveBiped.Bip01_R_Hand"
  3355.            data.rel = preset_data.rel or ""
  3356.            data.pos = preset_data.pos or Vector(0,0,0)
  3357.            data.angle = preset_data.angle or Angle(0,0,0)
  3358.            data.size = preset_data.size or Vector(0.5,0.5,0.5)
  3359.            data.color = preset_data.color or Color(255,255,255,255)
  3360.            data.surpresslightning = preset_data.surpresslightning or false
  3361.            data.material = preset_data.material or ""
  3362.            data.bodygroup = preset_data.bodygroup or {}
  3363.            data.skin = preset_data.skin or 0
  3364.            
  3365.            wep.wRenderOrder = nil
  3366.            
  3367.            local panel = vgui.Create( "DPanel", pwmodels )
  3368.            panel:SetPos( x, y )
  3369.            panel:SetSize( 260, panelh )
  3370.            panel:SetPaintBackground( true )
  3371.            panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
  3372.            
  3373.            local addy = 5
  3374.            
  3375.            CreateNameLabel( name, addy, panel )
  3376.            
  3377.            addy = addy + 25
  3378.            
  3379.            CreateModelModifier( data, addy, panel )
  3380.            
  3381.            addy = addy + 25
  3382.  
  3383.            CreateBoneModifier( data, addy, panel, LocalPlayer() )
  3384.            
  3385.            addy = addy + 25
  3386.            
  3387.            CreateRelativeModifier( data, addy, panel )
  3388.            
  3389.            addy = addy + 25
  3390.            
  3391.            CreatePositionModifiers( data, addy, panel )
  3392.            
  3393.            addy = addy + 25
  3394.  
  3395.            CreateAngleModifiers( data, addy, panel )
  3396.            
  3397.            addy = addy + 25
  3398.  
  3399.            CreateSizeModifiers( data, addy, panel, 3 )
  3400.            
  3401.            addy = addy + 25
  3402.            
  3403.            CreateColorModifiers( data, addy, panel )
  3404.            
  3405.            addy = addy + 25
  3406.            
  3407.            CreateSLightningModifier( data, addy, panel )
  3408.            
  3409.            addy = addy + 22
  3410.            
  3411.            CreateMaterialModifier( data, addy, panel )
  3412.            
  3413.            addy = addy + 25
  3414.            
  3415.            CreateBodygroupSkinModifier( data, addy, panel )
  3416.            
  3417.            return panel
  3418.            
  3419.        end
  3420.        
  3421.        /*** Sprite panel for adjusting sprites ***
  3422.        Name:
  3423.        Sprite:
  3424.        Translation x / y / z
  3425.        Sprite x / y size
  3426.        Color
  3427.        */
  3428.        local function CreateWorldSpritePanel( name, x, y, preset_data )
  3429.            
  3430.            local data = wep.w_models[name]
  3431.            if (!preset_data) then preset_data = {} end
  3432.            
  3433.            // default data
  3434.            data.type = preset_data.type or "Sprite"
  3435.            data.sprite = preset_data.sprite or ""
  3436.            data.bone = preset_data.bone or "ValveBiped.Bip01_R_Hand"
  3437.            data.rel = preset_data.rel or ""
  3438.            data.pos = preset_data.pos or Vector(0,0,0)
  3439.            data.size = preset_data.size or { x = 1, y = 1 }
  3440.            data.color = preset_data.color or Color(255,255,255,255)
  3441.            data.nocull = preset_data.nocull or true
  3442.            data.additive = preset_data.additive or true
  3443.            data.vertexalpha = preset_data.vertexalpha or true
  3444.            data.vertexcolor = preset_data.vertexcolor or true
  3445.            data.ignorez = preset_data.ignorez or false
  3446.            
  3447.            wep.wRenderOrder = nil
  3448.            
  3449.            local panel = vgui.Create( "DPanel", pwmodels )
  3450.            panel:SetPos( x, y )
  3451.            panel:SetSize( 260, panelh )
  3452.            panel:SetPaintBackground( true )
  3453.            panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
  3454.            
  3455.            local addy = 5
  3456.            
  3457.            CreateNameLabel( name, addy, panel )
  3458.            
  3459.            addy = addy + 25
  3460.            
  3461.            CreateSpriteModifier( data, addy, panel )
  3462.            
  3463.            addy = addy + 25
  3464.            
  3465.            CreateBoneModifier( data, addy, panel, LocalPlayer() )
  3466.            
  3467.            addy = addy + 25
  3468.            
  3469.            CreateRelativeModifier( data, addy, panel )
  3470.            
  3471.            addy = addy + 25
  3472.            
  3473.            CreatePositionModifiers( data, addy, panel )
  3474.            
  3475.            addy = addy + 25
  3476.  
  3477.            CreateSizeModifiers( data, addy, panel, 2 )
  3478.  
  3479.            addy = addy + 25
  3480.            
  3481.            CreateColorModifiers( data, addy, panel )
  3482.            
  3483.            addy = addy + 25
  3484.            
  3485.            CreateParamModifiers( data, addy, panel )
  3486.            
  3487.            return panel
  3488.            
  3489.        end
  3490.        
  3491.        /*** Model panel for adjusting models ***
  3492.        Name:
  3493.        Model:
  3494.        Bone name:
  3495.        Translation x / y / z
  3496.        Rotation pitch / yaw / role
  3497.        Size
  3498.        */
  3499.        local function CreateWorldQuadPanel( name, x, y, preset_data )
  3500.            
  3501.            local data = wep.w_models[name]
  3502.            if (!preset_data) then preset_data = {} end
  3503.            
  3504.            // default data
  3505.            data.type = preset_data.type or "Quad"
  3506.            data.model = preset_data.model or ""
  3507.            data.bone = preset_data.bone or "ValveBiped.Bip01_R_Hand"
  3508.            data.rel = preset_data.rel or ""
  3509.            data.pos = preset_data.pos or Vector(0,0,0)
  3510.            data.angle = preset_data.angle or Angle(0,0,0)
  3511.            data.size = preset_data.size or 0.05
  3512.  
  3513.            wep.vRenderOrder = nil // force viewmodel render order to recache
  3514.            
  3515.            local panel = vgui.Create( "DPanel", pwmodels )
  3516.            panel:SetPos( x, y )
  3517.            panel:SetSize( 260, panelh )
  3518.            panel:SetPaintBackground( true )
  3519.            panel.Paint = function() surface.SetDrawColor( 70, 70, 70, 255 ) surface.DrawRect( 0, 0, panel:GetWide(), panel:GetTall() ) end
  3520.            
  3521.            local addy = 5
  3522.            
  3523.            CreateNameLabel( name, addy, panel )
  3524.            
  3525.            addy = addy + 25
  3526.            
  3527.            CreateBoneModifier( data, addy, panel, LocalPlayer() )
  3528.            
  3529.            addy = addy + 25
  3530.            
  3531.            CreateRelativeModifier( data, addy, panel )
  3532.            
  3533.            addy = addy + 25
  3534.            
  3535.            CreatePositionModifiers( data, addy, panel )
  3536.            
  3537.            addy = addy + 25
  3538.  
  3539.            CreateAngleModifiers( data, addy, panel )
  3540.            
  3541.            addy = addy + 25
  3542.  
  3543.            CreateSizeModifiers( data, addy, panel, 1 )
  3544.            
  3545.            return panel
  3546.            
  3547.        end
  3548.        
  3549.        // adding button DoClick
  3550.        mnwbtn.DoClick = function()
  3551.            local new = string.Trim( mnwtext:GetValue() )
  3552.            if (new) then
  3553.                if (new == "") then CreateWNote("Empty name field!") return end
  3554.                if (wep.w_models[new] != nil) then CreateWNote("Name already exists!") return end
  3555.                wep.w_models[new] = {}
  3556.                
  3557.                if (!wep.w_panelCache[new]) then
  3558.                    if (wboxselected == "Model") then
  3559.                        wep.w_panelCache[new] = CreateWorldModelPanel( new, 10, panely )
  3560.                    elseif (wboxselected == "Sprite") then
  3561.                        wep.w_panelCache[new] = CreateWorldSpritePanel( new, 10, panely )
  3562.                    elseif (wboxselected == "Quad") then
  3563.                        wep.w_panelCache[new] = CreateWorldQuadPanel( new, 10, panely )
  3564.                    else
  3565.                        Error("wtf are u doing")
  3566.                    end
  3567.                end
  3568.                
  3569.                wep.w_panelCache[new]:SetVisible(false)
  3570.                
  3571.                mwlist:AddLine(new,wboxselected)
  3572.            end
  3573.        end
  3574.        
  3575.        for k, v in pairs( wep.save_data.w_models ) do
  3576.            wep.w_models[k] = {}
  3577.            
  3578.            // backwards compatability
  3579.            if (!v.bone or v.bone == "") then
  3580.                v.bone = "ValveBiped.Bip01_R_Hand"
  3581.            end
  3582.            
  3583.            if (v.type == "Model") then
  3584.                wep.w_panelCache[k] = CreateWorldModelPanel( k, 10, panely, v )
  3585.            elseif (v.type == "Sprite") then
  3586.                wep.w_panelCache[k] = CreateWorldSpritePanel( k, 10, panely, v )
  3587.            elseif (v.type == "Quad") then
  3588.                wep.w_panelCache[k] = CreateWorldQuadPanel( k, 10, panely, v )
  3589.            end            
  3590.            wep.w_panelCache[k]:SetVisible(false)
  3591.            mwlist:AddLine(k,v.type)
  3592.        
  3593.        end
  3594.        
  3595.        local prtbtn = vgui.Create( "DButton", pwmodels)
  3596.        prtbtn:SetPos( 10, 525 )
  3597.        prtbtn:SetSize( 260, 20 )
  3598.        prtbtn:SetText("Print world model table to console")
  3599.        prtbtn.DoClick = function()
  3600.            MsgN("*********************************************")
  3601.            for k, v in pairs(string.Explode("\n",GetWModelsText())) do
  3602.                MsgN(v)
  3603.            end
  3604.            MsgN("*********************************************")
  3605.            LocalPlayer():ChatPrint("Code printed to console!")
  3606.        end
  3607.        
  3608.        local pctbtn = vgui.Create( "DButton", pwmodels)
  3609.        pctbtn:SetPos( 10, 550 )
  3610.        pctbtn:SetSize( 260, 20 )
  3611.        pctbtn:SetText("Copy world model table to clipboard")
  3612.        pctbtn.DoClick = function()
  3613.            SetClipboardText(GetWModelsText())
  3614.            LocalPlayer():ChatPrint("Code copied to clipboard!")
  3615.        end
  3616.        
  3617.        // import viewmodels
  3618.        importbtn.DoClick = function()
  3619.            local num = 0
  3620.            for k, v in pairs( wep.v_models ) do
  3621.                local name = k
  3622.                local i = 1
  3623.                while(wep.w_models[name] != nil) do
  3624.                    name = k..""..i
  3625.                    i = i + 1
  3626.                    
  3627.                    // changing names might mess up the relative transitions of some stuff
  3628.                    // but whatever.
  3629.                end
  3630.                
  3631.                local new_preset = table.Copy(v)
  3632.                new_preset.bone = "ValveBiped.Bip01_R_Hand" // switch to hand bone by default
  3633.                
  3634.                if (new_preset.rel and new_preset.rel != "") then
  3635.                    new_preset.pos = Vector(v.pos.x, v.pos.y, v.pos.z)
  3636.                    if (v.angle) then
  3637.                        new_preset.angle = Angle(v.angle.p, v.angle.y, v.angle.r)
  3638.                    end
  3639.                else
  3640.                    new_preset.pos = Vector(num*5,0,-10)
  3641.                    if (v.angle) then
  3642.                        new_preset.angle = Angle(0,0,0)
  3643.                    end
  3644.                end
  3645.                
  3646.                if (v.color) then
  3647.                    new_preset.color = Color(v.color.r,v.color.g,v.color.b,v.color.a)
  3648.                end
  3649.                if (type(v.size) == "table") then
  3650.                    new_preset.size = table.Copy(v.size)
  3651.                elseif (type(v.size) == "Vector") then
  3652.                    new_preset.size = Vector(v.size.x, v.size.y, v.size.z)
  3653.                end
  3654.                if (v.bodygroup) then
  3655.                    new_preset.bodygroup = table.Copy(v.bodygroup)
  3656.                end
  3657.                
  3658.                wep.w_models[name] = {}
  3659.                if (v.type == "Model") then
  3660.                    wep.w_panelCache[name] = CreateWorldModelPanel( name, 10, panely, new_preset )
  3661.                elseif (v.type == "Sprite") then
  3662.                    wep.w_panelCache[name] = CreateWorldSpritePanel( name, 10, panely, new_preset )
  3663.                elseif (v.type == "Quad") then
  3664.                    wep.w_panelCache[name] = CreateWorldQuadPanel( name, 10, panely, new_preset )
  3665.                end                
  3666.                wep.w_panelCache[name]:SetVisible(false)
  3667.                mwlist:AddLine(name,v.type)
  3668.                
  3669.                num = num + 1
  3670.            end
  3671.        end
  3672.        
  3673.        // remove a line
  3674.        rmbtn.DoClick = function()
  3675.            local line = mwlist:GetSelectedLine()
  3676.            if (line) then
  3677.                local name = mwlist:GetLine(line):GetValue(1)
  3678.                wep.w_models[name] = nil
  3679.                // clear from panel cache
  3680.                if (wep.w_panelCache[name]) then
  3681.                    wep.w_panelCache[name]:Remove()
  3682.                    wep.w_panelCache[name] = nil
  3683.                end
  3684.                mwlist:RemoveLine(line)
  3685.            end
  3686.        end
  3687.        
  3688.        // duplicate line
  3689.        copybtn.DoClick = function()
  3690.            local line = mwlist:GetSelectedLine()
  3691.            if (line) then
  3692.                local name = mwlist:GetLine(line):GetValue(1)
  3693.                local to_copy = wep.w_models[name]
  3694.                local new_preset = table.Copy(to_copy)
  3695.                
  3696.                // quickly generate a new unique name
  3697.                while(wep.w_models[name]) do
  3698.                    name = name.."+"
  3699.                end
  3700.                
  3701.                // have to fix every sub-table as well because table.Copy copies references
  3702.                new_preset.pos = Vector(to_copy.pos.x, to_copy.pos.y, to_copy.pos.z)
  3703.                if (to_copy.angle) then
  3704.                    new_preset.angle = Angle(to_copy.angle.p, to_copy.angle.y, to_copy.angle.r)
  3705.                end
  3706.                if (to_copy.color) then
  3707.                    new_preset.color = Color(to_copy.color.r,to_copy.color.g,to_copy.color.b,to_copy.color.a)
  3708.                end
  3709.                if (type(to_copy.size) == "table") then
  3710.                    new_preset.size = table.Copy(to_copy.size)
  3711.                elseif (type(to_copy.size) == "Vector") then
  3712.                    new_preset.size = Vector(to_copy.size.x, to_copy.size.y, to_copy.size.z)
  3713.                end
  3714.                if (to_copy.bodygroup) then
  3715.                    new_preset.bodygroup = table.Copy(to_copy.bodygroup)
  3716.                end
  3717.                
  3718.                wep.w_models[name] = {}
  3719.                
  3720.                if (new_preset.type == "Model") then
  3721.                    wep.w_panelCache[name] = CreateWorldModelPanel( name, 10, panely, new_preset )
  3722.                elseif (new_preset.type == "Sprite") then
  3723.                    wep.w_panelCache[name] = CreateWorldSpritePanel( name, 10, panely, new_preset )
  3724.                elseif (new_preset.type == "Quad") then
  3725.                    wep.w_panelCache[name] = CreateWorldQuadPanel( name, 10, panely, new_preset )
  3726.                end
  3727.                
  3728.                wep.w_panelCache[name]:SetVisible(false)
  3729.                mwlist:AddLine(name,new_preset.type)
  3730.            end
  3731.        end
  3732.        
  3733.        // finally, return the frame!
  3734.        return f
  3735.  
  3736.    end
  3737.  
  3738.    function SWEP:OpenMenu( preset )
  3739.        if (!self.Frame) then
  3740.            self.Frame = CreateMenu( preset )
  3741.        end
  3742.        
  3743.        if (ValidEntity(self.Frame)) then
  3744.            self.Frame:SetVisible(true)
  3745.            self.Frame:MakePopup()
  3746.        else
  3747.            self.Frame = nil
  3748.        end
  3749.        
  3750.    end
  3751.    
  3752.    function SWEP:OnRemove()
  3753.        self:CleanMenu()
  3754.    end
  3755.    
  3756.    function SWEP:OnDropWeapon()
  3757.        self.LastOwner = nil
  3758.        if (!self.Frame) then return end
  3759.        self.Frame:Close()
  3760.    end
  3761.  
  3762.    function SWEP:CleanMenu()
  3763.        self:RemoveModels()
  3764.        if (!self.Frame) then return end
  3765.        
  3766.        self.v_modelListing = nil
  3767.        self.w_modelListing = nil
  3768.        self.v_panelCache = {}
  3769.        self.w_panelCache = {}
  3770.        self.Frame:Remove()
  3771.        self.Frame = nil
  3772.    end
  3773.    
  3774.    function SWEP:HUDShouldDraw( el )
  3775.        return el != "CHudAmmo" and el != "CHudSecondaryAmmo"
  3776.    end
  3777.    
  3778.    /***************************
  3779.        Third person view
  3780.    ***************************/
  3781.    function TPCalcView(pl, pos, angles, fov)
  3782.    
  3783.        local wep = pl:GetActiveWeapon()
  3784.        if (!ValidEntity(wep) or !wep.IsSCK or !wep.useThirdPerson) then
  3785.            wep.useThirdPerson = false
  3786.            return
  3787.        end
  3788.        
  3789.        local look_pos = pos
  3790.        local rhand_bone = pl:LookupBone("ValveBiped.Bip01_R_Hand")
  3791.        if (rhand_bone) then
  3792.            look_pos = pl:GetBonePosition( rhand_bone )
  3793.        end
  3794.        
  3795.        local view = {}
  3796.        view.origin = look_pos + ((pl:GetAngles()+wep.thirdPersonAngle):Forward()*wep.thirdPersonDis)
  3797.        view.angles = (look_pos - view.origin):Angle()
  3798.        view.fov = fov
  3799.    
  3800.        return view
  3801.    end
  3802.    
  3803.    oldCVHooks = {}
  3804.    hooksCleared = false
  3805.    local function CVHookReset()
  3806.        
  3807.        //print("Hook reset")
  3808.        hook.Remove( "CalcView", "TPCalcView" )
  3809.        for k, v in pairs( oldCVHooks ) do
  3810.            hook.Add("CalcView", k, v)
  3811.        end
  3812.        oldCVHooks = {}
  3813.        hooksCleared = false
  3814.            
  3815.    end    
  3816.    
  3817.    function SWEP:CalcViewHookManagement()
  3818.        
  3819.        if (!hooksCleared) then
  3820.            
  3821.            local CVHooks = hook.GetTable()["CalcView"]
  3822.            if CVHooks then
  3823.            
  3824.                for k, v in pairs( CVHooks ) do
  3825.                    oldCVHooks[k] = v
  3826.                    hook.Remove( "CalcView", k )
  3827.                end
  3828.            
  3829.            end
  3830.            
  3831.            hook.Add("CalcView", "TPCalcView", TPCalcView)
  3832.            hooksCleared = true
  3833.        else
  3834.            timer.Create("CVHookReset", 2, 1, CVHookReset)
  3835.        end
  3836.        
  3837.    end    
  3838.    
  3839.    hook.Add("ShouldDrawLocalPlayer", "ThirdPerson23", function(pl)
  3840.        local wep = pl:GetActiveWeapon()
  3841.        if (ValidEntity(wep) and wep.useThirdPerson) then
  3842.            return true
  3843.        end
  3844.    end)
  3845.  
  3846. end
  3847.  
clone this paste RAW Paste Data