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