diff --git a/lua/autorun/!drc_shared.lua b/lua/autorun/!drc_shared.lua index 506a524..18c3433 100644 --- a/lua/autorun/!drc_shared.lua +++ b/lua/autorun/!drc_shared.lua @@ -15,9 +15,16 @@ list.Set( "DesktopWindows", "Draconic Menu", { icon = "icon64/draconic_base.png", init = function( icon, window ) DRCMenu(LocalPlayer()) + RunConsoleCommand("-menu_context") end } ) +-- Defining useful globals for content developers +SNDLVL_TALKING = 80 +SNDLVL_VEHICLE = 105 +SNDLVL_ENERGYFIRESILENCED = 90 +SNDLVL_ENERGYFIRE = 100 +SNDLVL_GUNFIRESILENCED = 115 SNDLVL_GUNFIRE = 140 -- Any code beyond this point is considered legacy and should NOT be used as reference, or at all. @@ -57,67 +64,4 @@ function GetSF2LightLevel(limiter) return SF2Scalar end else return 1 end -end - ---[[ -function GetDRCColours(ent) - local tbl = {} - tbl.Player = ent:GetNWVector("PlayerColour_DRC") - tbl.Weapon = ent:GetNWVector("WeaponColour_DRC") - tbl.Eye = ent:GetNWVector("EyeTintVec") - tbl.Energy = ent:GetNWVector("EnergyTintVec") - tbl.Tint1 = ent:GetNWVector("ColourTintVec1") - tbl.Tint2 = ent:GetNWVector("ColourTintVec2") - - return tbl -end - -function DRCNotify(source, type, severity, msg, enum, time, sound) - DRC:Notify(source, type, severity, msg, enum, time, sound) -end - -function DRCSound(source, near, far, distance, listener) - if CLIENT then return end - if !IsValid(source) then return end - - DRC:EmitSound(source, near, far, distance, listener) -end ---]] - ---[[ -hook.Add( "PopulateToolMenu", "DraconicSWEPSettings", function() - spawnmenu.AddToolMenuOption( "Options", "Draconic", "SWEP Base", "SWEP Base", "", "", function( panel ) - panel:ClearControls() - local button = panel:Button("Open Menu") - function button:OnMousePressed() - drc_settings() - end - -- panel:ControlHelp( "" ) - -- panel:ControlHelp( "Server / Admin-only Settings" ) - -- panel:CheckBox( "Enable Draconic Movement", "sv_drc_movement") - -- panel:CheckBox( "Enable Draconic Movement Sounds", "sv_drc_movesounds") - -- panel:CheckBox( "Allow Call of Duty Spread", "sv_drc_callofdutyspread") - -- panel:NumSlider( "NPC Accuracy Handicap", "sv_drc_npc_accuracy", 0, 10, 1 ) - -- panel:Help( "0 = Seal Team Six" ) - -- panel:Help( "2 = HL2 Accuracy" ) - -- panel:Help( "10 = Can't hit shit." ) - -- panel:ControlHelp( "" ) - -- panel:ControlHelp( "Client Settings" ) - -- panel:NumSlider( "Viewmodel sway", "cl_drc_sway", 0, 2, 1 ) - -- panel:CheckBox( "Enable Debug HUD", "cl_drc_debugmode") - -- panel:CheckBox( "Sell your soul to Vuthakral", "cl_drc_sell_soul") - end ) - - spawnmenu.AddToolMenuOption( "Options", "Draconic", "Playermodel Extensions", "Playermodel Extensions", "", "", function( panel ) - local button2 = panel:Button("Open Menu") - function button2:OnMousePressed() - PEXMenu( LocalPlayer() ) - end - end ) -end ) - - -function drc_GetPlayerColours(ply) - DRC:GetColours(ply) -end ---]] \ No newline at end of file +end \ No newline at end of file diff --git a/lua/autorun/drc_sounds.lua b/lua/autorun/drc_sounds.lua index ef35c50..eade665 100644 --- a/lua/autorun/drc_sounds.lua +++ b/lua/autorun/drc_sounds.lua @@ -65,13 +65,13 @@ sound.Add( { volume = 0.32, level = 80, pitch = { 95, 105 }, - sound = { "weapons/bat_draw.wav", - "player/taunt_surgeons_squeezebox_draw_clothes.wav", - "weapons/melee_inspect_movement3.wav", - "weapons/melee_inspect_movement4.wav", - "weapons/movement1.wav", - "weapons/movement2.wav", - "weapons/movement3.wav" } + sound = { "draconic/foley/generic7.wav ", + "draconic/foley/generic6.wav", + "draconic/foley/generic4.wav", + "draconic/foley/generic5.wav", + "draconic/foley/generic0.wav", + "draconic/foley/generic1.wav", + "draconic/foley/generic2.wav" } } ) sound.Add( { @@ -80,102 +80,59 @@ sound.Add( { volume = 0.32, level = 80, pitch = { 95, 105 }, - sound = { "weapons/bat_draw_swoosh1.wav", - "weapons/melee_inspect_movement2.wav", - "weapons/melee_inspect_movement2.wav", - "weapons/movement1.wav", - "weapons/movement2.wav", - "weapons/movement3.wav" } + sound = { "draconic/foley/generic9.wav", + "draconic/foley/generic3.wav", + "draconic/foley/generic3.wav", + "draconic/foley/generic0.wav", + "draconic/foley/generic1.wav", + "draconic/foley/generic2.wav", + "draconic/foley/generic8.wav" } } ) sound.Add( { - name = "draconic.BladeSwingSmall", - channel = CHAN_WEAPON, - volume = 0.96, - level = 60, - pitch = { 95, 105 }, - sound = { "physics/flesh/fist_swing_01.wav", - "physics/flesh/fist_swing_02.wav", - "physics/flesh/fist_swing_03.wav", - "physics/flesh/fist_swing_04.wav", - "physics/flesh/fist_swing_05.wav", - "physics/flesh/fist_swing_06.wav" } -} ) - -sound.Add( { - name = "draconic.BladeStabSmall", - channel = CHAN_WEAPON, - volume = 0.92, - level = 80, - pitch = { 95, 105 }, - sound = { "weapons/boxing_gloves_swing1.wav", - "weapons/melee_inspect_movement2.wav", - "weapons/movement1.wav", - "weapons/movement2.wav", - "weapons/movement3.wav" } -} ) - -sound.Add( { - name = "draconic.BladeSmallHitWorld", + name = "draconic.BatteryDepleted", channel = CHAN_AUTO, - volume = 0.62, + volume = 0.47, level = 80, pitch = { 95, 105 }, - sound = { "weapons/knife/knife_hitwall1.wav", - "weapons/knife/knife_hitwall4.wav", - "weapons/knife/knife_hit_05.wav", - "weapons/knife/knife_hit_02.wav", - "weapons/knife/knife_hit_01.wav", - "weapons/knife/knife_hit_03.wav", - "weapons/knife/knife_hitwall2.wav", - "weapons/knife/knife_hitwall3.wav", - "weapons/knife/knife_hit_04.wav" } + sound = { "draconic/weapons/dry_battery.wav" } } ) sound.Add( { - name = "draconic.BladeSmallHitFlesh", + name = "draconic.EmptyGeneric", channel = CHAN_AUTO, - volume = 0.62, - level = 80, - pitch = { 95, 105 }, - sound = { "weapons/knife/knife_hit1.wav", - "weapons/knife/knife_hit2.wav", - "weapons/knife/knife_hit3.wav", - "weapons/knife/knife_hit4.wav", - "weapons/spy_assassin_knife_impact_02.wav", - "weapons/spy_assassin_knife_impact_01.wav" } + volume = 0.69, + level = 90, + pitch = { 99, 102 }, + sound = { "weapons/clipempty_pistol.wav", + "weapons/clipempty_rifle.wav" } } ) sound.Add( { - name = "draconic.BladeSmallStabFlesh", + name = "draconic.dryfire_pistol", channel = CHAN_AUTO, - volume = 0.62, + volume = 0.47, level = 80, pitch = { 95, 105 }, - sound = { "weapons/knife/knife_hit1.wav", - "weapons/knife/knife_hit2.wav", - "weapons/knife/knife_hit3.wav", - "weapons/knife/knife_hit4.wav", - "weapons/axe_hit_flesh1.wav" } + sound = { "draconic/weapons/dry_pistol.wav" } } ) sound.Add( { - name = "draconic.BatteryDepleted", + name = "draconic.dryfire_rifle", channel = CHAN_AUTO, volume = 0.47, level = 80, - pitch = { 95, 105 }, - sound = { "weapons/sniper_railgun_dry_fire.wav", - "weapons/widow_maker_dry_fire.wav" } + pitch = { 100, 105 }, + sound = { "draconic/weapons/dry_rifle.wav" } } ) sound.Add( { - name = "draconic.PewPew", - channel = CHAN_WEAPON, + name = "draconic.dryfire_heavy", + channel = CHAN_AUTO, volume = 0.47, level = 80, pitch = { 95, 105 }, - sound = { "weapons/capper_shoot.wav" } + sound = { "draconic/weapons/dry_heavy.wav" } } ) sound.Add( { @@ -238,16 +195,6 @@ sound.Add( { sound = { "weapons/barret_arm_zap.wav" } } ) -sound.Add( { - name = "draconic.EmptyGeneric", - channel = CHAN_AUTO, - volume = 0.69, - level = 90, - pitch = { 99, 102 }, - sound = { "weapons/clipempty_pistol.wav", - "weapons/clipempty_rifle.wav" } -} ) - sound.Add( { name = "draconic.vFireStopGeneric", channel = CHAN_AUTO, diff --git a/lua/draconic/cl/experimental_fp.lua b/lua/draconic/cl/experimental_fp.lua index efc7dcb..344c525 100644 --- a/lua/draconic/cl/experimental_fp.lua +++ b/lua/draconic/cl/experimental_fp.lua @@ -1,11 +1,14 @@ local function EFPChecks() - if DRC:SightsDown(LocalPlayer():GetActiveWeapon()) then return true end +-- if DRC:SightsDown(LocalPlayer():GetActiveWeapon()) then return true end if !DRC:ThirdPersonEnabled(LocalPlayer()) == true then return false else return true end end local bobang = Angle() local offsetmul = 1 +local desiredpos = Vector() +local efplerppow +local offsetlerp hook.Add( "CalcView", "DRC_EFP_CalcView", function(ply, origin, ang, fov, zn, zf) if GetConVar("cl_drc_experimental_fp"):GetFloat() == 1 then if EFPChecks() == true then return end @@ -16,17 +19,27 @@ hook.Add( "CalcView", "DRC_EFP_CalcView", function(ply, origin, ang, fov, zn, zf local pos = eyes.Pos local curswep = ply:GetActiveWeapon() + local wpn = curswep local holdtype = "default" if IsValid(curswep) then holdtype = curswep:GetHoldType() end + local insightslerp if DRC:SightsDown(curswep) == true then pos = ply:EyePos() offsetmul = 0 + efplerppow = 1 + insightslerp = 100 else pos = eyes.Pos offsetmul = 1 + efplerppow = 0.33 + insightslerp = 1 end + offsetlerp = Lerp(0.1, offsetlerp or efplerppow, efplerppow) + desiredpos = Lerp(RealFrameTime()*20*insightslerp, desiredpos or pos, pos) + pos = desiredpos + DRC.CalcView.EFP_ISPow = Lerp(RealFrameTime() * 10, DRC.CalcView.EFP_ISPow or offsetmul, offsetmul) if curswep.Draconic then @@ -57,7 +70,7 @@ hook.Add( "CalcView", "DRC_EFP_CalcView", function(ply, origin, ang, fov, zn, zf if wpn.Loading == false && wpn.Inspecting == false then drc_vm_lerpang = Angle(oang.x, oang.y, Lerp(RealFrameTime() * drc_vm_angmedian, drc_vm_lerpang.z or 0, 0)) else - drc_vm_lerpang = LerpAngle(FrameTime(), oang or Angle(0, 0, 0), oang) + drc_vm_lerpang = LerpAngle(RealFrameTime(), oang or Angle(0, 0, 0), oang) end drc_vm_lerppos = Vector(Lerp(RealFrameTime() * 25, 0 or pos.x, 0), Lerp(RealFrameTime() * 25, 0 or pos.y, 0), Lerp(RealFrameTime() * 25, 0 or pos.z, 0)) @@ -71,7 +84,7 @@ hook.Add( "CalcView", "DRC_EFP_CalcView", function(ply, origin, ang, fov, zn, zf end if sights == true or (wpn.Loading == false && wpn.Inspecting == false && wpn.Idle == 1) then - local fr = math.Round(1 / FrameTime()) + local fr = math.Round(1 / RealFrameTime()) if fr > 15 then if ply:KeyDown(IN_SPEED) or sights == true then @@ -158,6 +171,53 @@ hook.Add( "CalcView", "DRC_EFP_CalcView", function(ply, origin, ang, fov, zn, zf angadd:RotateAroundAxis(angadd:Forward(), angdiff.z) end + if wpn.Draconic then + local swepmul = 50 + local loading, inspecting, idle, melee, firing = wpn.PlayingLoadAnimation, wpn:GetNWBool("InspectCamLerp"), (wpn.OwnerActivity == "standidle" or wpn.OwnerActivity == "crouchidle"), wpn:GetNWBool("IsDoingMelee"), wpn.PlayingShootAnimation + local swepmuls = { + ["idle"] = math.Clamp(wpn.CameraStabilityIdle, 0.1, 5), + ["move"] = math.Clamp(wpn.CameraStabilityMove, 0.1, 5), + ["reload"] = math.Clamp(wpn.CameraStabilityReload, 0.1, 5), + ["inspect"] = math.Clamp(wpn.CameraStabilityInspect, 0.1, 5), + ["melee"] = math.Clamp(wpn.CameraStabilityMelee, 0.1, 5), + } + local angmuls = { + ["idle"] = wpn.CameraAngleMulIdle, + ["move"] = wpn.CameraAngleMulMove, + ["reload"] = wpn.CameraAngleMulReload, + ["inspect"] = wpn.CameraAngleMulInspect, + ["melee"] = wpn.CameraAngleMulMelee, + ["firing"] = wpn.CameraAngleMulFiring or wpn.CameraAngleMulIdle + } + + drc_vm_lerppos = Vector(Lerp(FrameTime() * 25, 0 or pos.x, 0), Lerp(FrameTime() * 25, 0 or pos.y, 0), Lerp(FrameTime() * 25, 0 or pos.z, 0)) + if loading == true && !firing then + local val = swepmul * swepmuls.reload + drc_vm_angmul = angmuls.reload + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif firing && !loading then + local val = swepmul * swepmuls.idle + drc_vm_angmul = angmuls.firing + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif melee == true then + local val = swepmul * swepmuls.melee + drc_vm_angmul = angmuls.melee + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif inspecting == true then + local val = swepmul * swepmuls.inspect + drc_vm_angmul = angmuls.inspect + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif !loading && !inspecting && idle then + local val = swepmul * swepmuls.idle + drc_vm_angmul = angmuls.idle + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif !loading && !inspecting && !idle then + local val = swepmul * swepmuls.move + drc_vm_angmul = angmuls.move + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + end + end + if !DRC.CalcView.Ang then DRC.CalcView.Ang = ply:EyeAngles() end if !DRC.CrosshairAngMod then DRC.CrosshairAngMod = Angle() end if DRC.CalcView.Ang && DRC.CrosshairAngMod then @@ -174,9 +234,8 @@ hook.Add( "CalcView", "DRC_EFP_CalcView", function(ply, origin, ang, fov, zn, zf zfar = zfar, } - if base == "mwb" then - wep:CalcView(ply, DRC.CalcView.WorldPos, DRC.CalcView.AimCorrectAngle, ply:GetFOV()) - end + if base == "mwb" then wep:CalcView(ply, DRC.CalcView.WorldPos, DRC.CalcView.AimCorrectAngle, ply:GetFOV()) end + if base == "drc" then view.angles = DRC.CalcView.AimCorrectAngle - drc_vm_lerpang_final / drc_vm_lerpdiv end local shake, shakevert, shakeroll = DRC:GetCalcViewShake() view.origin = view.origin + (view.angles:Right() * shake) @@ -188,6 +247,11 @@ hook.Add( "CalcView", "DRC_EFP_CalcView", function(ply, origin, ang, fov, zn, zf end end) +local desiredviewpos +local specialweapons = { + ["mwb"] = "cawadoody", + ["drc"] = "dragons" +} hook.Add( "CalcViewModelView", "DRC_EFP_CalcViewModelView", function(wpn, vm, oldpos, oldang, eyepos, eyeang) if GetConVar("cl_drc_experimental_fp"):GetFloat() == 1 then if EFPChecks() == true then return end @@ -198,9 +262,12 @@ hook.Add( "CalcViewModelView", "DRC_EFP_CalcViewModelView", function(wpn, vm, ol local pos = eyes.Pos local diff = ply:EyePos() - pos local newpos = eyes.Pos - local hands = ply:GetHands() local et = DRC.CalcView.Trace + local sd = DRC:SightsDown(wpn) if !DRC.CalcView.EFP_ISPow then return end + + desiredviewpos = Lerp(offsetlerp, desiredviewpos or pos, pos) + pos = desiredviewpos newpos = pos + Vector(diff.x * .1, diff.y * .1, diff.z * .1) local holdtype = wpn:GetHoldType() @@ -215,15 +282,12 @@ hook.Add( "CalcViewModelView", "DRC_EFP_CalcViewModelView", function(wpn, vm, ol ply.drcfp_walllerpval = Lerp(RealFrameTime() * 100, ply.drcfp_walllerpval or hiv, hiv) local fuck = diff * ply:GetModelScale() - diff = diff - fuck / 3 - - if wpn.Draconic == true then newpos = newpos - (diff/6) + DRC.CalcView.wallpos else pos = pos + DRC.CalcView.wallpos end - if !wpn:IsScripted() or wpn.Draconic == nil then newpos = pos - diff * .1 end + diff = diff - fuck * 0.333 if wpn.Draconic == true && GetConVar("cl_drc_lowered_crosshair"):GetFloat() == 1 then DRC.CrosshairAngMod = Angle(-10, 0, 0) - if DRC:SightsDown(wpn) then - DRC.CalcView.LoweredAng = Angle(5, 0, 0) + if sd then + DRC.CalcView.LoweredAng = Angle(6.66, 0, 0) else DRC.CalcView.LoweredAng = Angle(5, 0, 0) end @@ -231,48 +295,53 @@ hook.Add( "CalcViewModelView", "DRC_EFP_CalcViewModelView", function(wpn, vm, ol DRC.CrosshairAngMod = Angle(0, 0, 0) DRC.CalcView.LoweredAng = Angle(0, 0, 0) end - + local calcvpos, calcvang = Vector(), Angle() + local addpos = newpos - pos if IsValid(wpn) then - local special = { - ["mwb"] = "cawadoody", - ["drc"] = "dragons" - } - if base != nil && !special[base] then + if base != nil && !specialweapons[base] then calcvpos, calcvang = wpn:GetViewModelPosition(eyepos, eyeang) eyeang = (DRC.CrosshairAngMod/1.5) + calcvang + DRC.CalcView.LoweredAng - newpos = (newpos * DRC.CalcView.EFP_ISPow) + calcvpos - (ply:EyePos() * DRC.CalcView.EFP_ISPow) + newpos = (desiredpos * DRC.CalcView.EFP_ISPow) + calcvpos - (ply:EyePos() * DRC.CalcView.EFP_ISPow) + DRC.CalcView.wallpos elseif base == "drc" then DRCSwepSway(wpn, vm, oldpos, oldang, eyepos, eyeang) + DRCSwepOffset(wpn, vm) + calcvpos, calcvang = wpn:GetViewModelPosition(eyepos, eyeang) + eyeang = (DRC.CrosshairAngMod/1.5) + calcvang + DRC.CalcView.LoweredAng + newpos = (desiredpos * DRC.CalcView.EFP_ISPow) + calcvpos - (ply:EyePos() * DRC.CalcView.EFP_ISPow) + DRC.CalcView.wallpos + elseif base == "mwb" then calcvpos, calcvang = wpn:GetViewModelPosition(eyepos, eyeang) eyeang = (DRC.CrosshairAngMod/1.5) + calcvang + DRC.CalcView.LoweredAng - newpos = (newpos * DRC.CalcView.EFP_ISPow) + calcvpos - (ply:EyePos() * DRC.CalcView.EFP_ISPow) + newpos = (desiredpos * DRC.CalcView.EFP_ISPow) + DRC.CalcView.wallpos + if sd then newpos = desiredpos else newpos = desiredpos end -- This fixes ADS transitioning, do NOT ask me why I do NOT KNOW. + else + newpos = desiredpos * DRC.CalcView.EFP_ISPow + DRC.CalcView.wallpos end + newpos = Lerp(0.4, newpos or newpos, newpos) end return newpos, eyeang end end) +local CSPos +local lerppos hook.Add("Think", "DRC_ExpFP_Body", function() if GetConVar("cl_drc_experimental_fp"):GetFloat() == 0 then return end if EFPChecks() == true then return end local ply = LocalPlayer() if !IsValid(ply) then return end if !ply:Alive() then return end + local pos = ply:GetPos() + + lerppos = Lerp(RealFrameTime()*20, lerppos or pos, pos) - local CSPos = ply:GetPos() if !IsValid(ply:GetVehicle()) then - CSPos = Vector(ply:GetPos().x + DRC.CalcView.wallpos.x, ply:GetPos().y + DRC.CalcView.wallpos.y, ply:GetPos().z) + CSPos = Vector(lerppos.x + DRC.CalcView.wallpos.x, lerppos.y + DRC.CalcView.wallpos.y, lerppos.z) else CSPos = Vector(ply:GetPos()) end - local curswep = ply:GetActiveWeapon() - if curswep.Draconic && curswep.SightsDown == true then - CSPos = Vector(0,0,0) - end - if !IsValid(DRC.CSPlayerModel) then DRC.CSPlayerModel = ents.CreateClientside("drc_csplayermodel") DRC.CSPlayerModel:SetModel(LocalPlayer():GetModel()) @@ -312,7 +381,11 @@ hook.Add("Think", "DRC_ExpFP_Body", function() local spine0 = ply:LookupBone(DRC.Skel.Spine.Name) local spine1 = ply:LookupBone(DRC.Skel.Spine1.Name) local spine2 = ply:LookupBone(DRC.Skel.Spine2.Name) - local spine4 = ply:LookupBone(DRC.Skel.Spine4.Name) + local spine4 = ply:LookupBone(DRC.Skel.Spine4.Name) + + local head = ply:GetAttachment(ply:LookupAttachment("eyes")).Bone + local headbones + if head != nil then headbones = ply:GetChildBones(head) end for k,ent in pairs(parents) do ent:SetNoDraw(false) @@ -382,6 +455,47 @@ hook.Add("Think", "DRC_ExpFP_Body", function() end ent:ManipulateBoneScale(spine4, s4scale) end + else + local head = ent:GetAttachment(ply:LookupAttachment("eyes")).Bone + local head1 = ply:GetChildBones(head) + local head2 = {} + for k,v in pairs(head1) do + ent:ManipulateBoneScale(v, Vector()) + head2[k] = ply:GetChildBones(v) + end + + local lh = ply:LookupAttachment("lefthand") + if lh == 0 then lh = ply:LookupAttachment("anim_attachment_LH") end + local rh = ply:LookupAttachment("righthand") + if rh == 0 then rh = ply:LookupAttachment("anim_attachment_RH") end + lh, rh = ent:GetAttachment(lh).Bone, ent:GetAttachment(rh).Bone + local lfore, rfore = ply:GetBoneParent(lh), ply:GetBoneParent(rh) + local lupper, rupper = ply:GetBoneParent(lfore), ply:GetBoneParent(rfore) + + local lp = ply:GetBonePosition(lupper) + local movebones = {lh, rh, lfore, rfore, lupper, rupper} + for k,v in pairs(movebones) do + ent:ManipulateBoneScale(v, Vector()) + local pdiff = ent:GetBonePosition(v) - lp + ent:ManipulateBonePosition(v, pdiff) + end + + ent:ManipulateBoneScale(head, Vector(0, 0, 0)) + for k,v in pairs(head1) do head2[k] = ply:GetChildBones(v) end + for k,v in pairs(head2) do + for k2,v2 in pairs(v) do + ent:ManipulateBoneScale(v2, Vector()) + local pdiff = ent:GetBonePosition(v2) - ply:GetBonePosition(head) + ent:ManipulateBonePosition(v2, pdiff) + end + + end + end + + if headbones != nil then + for k,v in pairs(headbones) do + ent:ManipulateBoneScale(v, DRC.Skel.Neck.Scale) + end end end end) \ No newline at end of file diff --git a/lua/draconic/cl/hud.lua b/lua/draconic/cl/hud.lua index f6248bb..21cd538 100644 --- a/lua/draconic/cl/hud.lua +++ b/lua/draconic/cl/hud.lua @@ -67,7 +67,7 @@ hook.Add("HUDShouldDraw", "DRC_HideBaseCrosshairThirdperson", function(str) if IsValid(ply) then if IsValid(ply:GetActiveWeapon()) then local wpn = string.lower(ply:GetActiveWeapon():GetClass()) - if DRC.HoldTypes.HardcodedWeapons[wpn] && !IsValid(ply:GetVehicle()) && ShouldDrawHLCrosshair() then + if !IsValid(ply:GetVehicle()) && ShouldDrawHLCrosshair() then if str == "CHudCrosshair" then return false end end end @@ -75,19 +75,33 @@ hook.Add("HUDShouldDraw", "DRC_HideBaseCrosshairThirdperson", function(str) end) -local function drc_Crosshair() - if GetConVar("cl_drawhud"):GetFloat() == 0 then return end - if GetConVar("cl_drc_disable_crosshairs"):GetFloat() == 1 then return end - if DRC.SV.drc_disable_crosshairs == 1 then return end +local function CrosshairLerp(fraction, from, to) + return Lerp(math.ease.OutQuart(fraction), from, to) +end + +local function ShouldDrawCrosshair(ply) + if GetConVar("cl_drawhud"):GetFloat() == 0 then return false end + if GetConVar("crosshair"):GetFloat() == 0 then return false end + if GetConVar("cl_drc_disable_crosshairs"):GetFloat() == 1 then return false end +-- if ply:GetActiveWeapon().CrosshairStatic == nil && ply:GetActiveWeapon().CrosshairDynamic == nil then return false end + if DRC.SV.drc_disable_crosshairs == 1 then return false end + local vehicle = ply:GetVehicle() + if IsValid(vehicle) then return false end + + return true +end + +local function drc_Crosshair() local ply = LocalPlayer() if !IsValid(ply) or !ply:Alive() then return end local curswep = ply:GetActiveWeapon() if !IsValid(curswep) then return end + if !ShouldDrawCrosshair(ply) then return end -- Replace base game crosshair with a duplicate that uses the actual hitpos, for compatibility with mods that offset the view (thirdperson, first person offsets, etc). local pos = DRC.CalcView.ToScreen - if DRC.HoldTypes.HardcodedWeapons[string.lower(curswep:GetClass())] && !IsValid(ply:GetVehicle()) && pos.x && pos.y then +--[[ if DRC.HoldTypes.HardcodedWeapons[string.lower(curswep:GetClass())] && !IsValid(ply:GetVehicle()) && pos.x && pos.y then local centered = (pos.x <= ScrW()/2 + 5 && pos.x >= ScrW()/2 - 5) && (pos.y <= ScrH()/2 + 5 && pos.y >= ScrH()/2 - 5) if centered then pos.x = ScrW()/2 pos.y = ScrH()/2 end if DRC.CalcView.ToScreen && GetConVar("crosshair"):GetInt() > 0 && ShouldDrawHLCrosshair() then @@ -96,7 +110,7 @@ local function drc_Crosshair() surface.SetTextColor( 255, 211, 64, 255 ) surface.DrawText("Q") end - end + end ]] -- Actual crosshair code. if !curswep.Draconic then return end @@ -114,7 +128,7 @@ local function drc_Crosshair() Xalpha = 0 end - surface.SetFont( "DermaLarge" ) + surface.SetFont("DermaLarge") surface.SetTextColor(255, 0, 0, Xalpha) surface.SetTextPos(math.Round(pos.x), math.Round(pos.y)) surface.DrawText("X", true) @@ -180,6 +194,8 @@ local function drc_Crosshair() if curswep.Base == "draconic_melee_base" then return end if curswep.PrimaryStats == nil then return end + + local spread = (curswep.PrimaryStats.Spread * modspread) local spreaddiv = (curswep.PrimaryStats.SpreadDiv * modspreaddiv) local cx = curswep.CrosshairCorrectX @@ -188,9 +204,11 @@ local function drc_Crosshair() local smathoffset = smath * 150 local b = math.Clamp(curswep.BloomValue * 100 or 0, 0, 100) * smath * 10 + b = math.Clamp(b, 0, 100) - LerpC = Lerp(FrameTime() * 20, DRCCrosshairLerp or b, b) + LerpC = CrosshairLerp(FrameTime() * 20, DRCCrosshairLerp or b, b) DRCCrosshairLerp = Lerp(FrameTime() * 10, DRCCrosshairLerp or LerpC, LerpC) + DRCCrosshairLerp = math.Clamp(DRCCrosshairLerp, 0 , 512 * smath) if DRC:DebugModeEnabled() then if chmode == 1 or chmode == 3 then @@ -203,14 +221,14 @@ local function drc_Crosshair() surface.DrawCircle((pos.x), (pos.y), 64 * smath * 10, 255, 255, 255, 255) surface.DrawCircle((pos.x), (pos.y), 64 * smath * 13.37, 255, 0, 0, 255) - surface.DrawCircle((pos.x), (pos.y), 64 * smath * 1, 0, 255, 0, 255) + surface.DrawCircle((pos.x), (pos.y), 64 * smath, 0, 255, 0, 255) surface.DrawCircle((pos.x), (pos.y), 64 * smath * 3, 120, 255, 120, 50) surface.DrawCircle((pos.x), (pos.y), 64 * DRCCrosshairLerp / 50.75, 0, 100, 255, 255) surface.DrawCircle((pos.x), (pos.y), 64 * DRCCrosshairLerp / 52, 0, 175, 255, 255) if curswep.Primary.AimAssist == true then - surface.DrawCircle((pos.x), (pos.y), 13 * curswep.SpreadCone * curswep.Primary.AimAssist_Mul, 0, 255, 255, 255) + surface.DrawCircle((pos.x), (pos.y), 13 * curswep.SpreadCone * curswep.Primary.AimAssist_Mul * DRC:GetFOVScale(), 0, 255, 255, 255) end end end @@ -225,6 +243,7 @@ local function drc_Crosshair() else surface.SetDrawColor( ccol.r, ccol.g, ccol.b, 255 ) end + if !ShouldDrawCrosshair(ply) then surface.SetDrawColor(ccol.r, ccol.g, ccol.b, 0) end surface.SetMaterial( Material("vgui/circle") ) surface.DrawTexturedRectRotated(pos.x, pos.y, 3, 3, 0) end @@ -453,41 +472,6 @@ local function drc_Scope() end hook.Add("HUDPaint", "drc_scope", drc_Scope) -hook.Add( "GetMotionBlurValues", "drc_scopeblur", function( horizontal, vertical, forward, rotational ) - local ply = LocalPlayer() - local wpn = ply:GetActiveWeapon() - if wpn.Draconic == nil then return end - - if wpn:CanUseSights() == false then forward = 0 return forward end - - local w = ScrW() - local h = ScrH() - - local ratio = w/h - - local ss = 4 * wpn.Secondary.ScopeScale - local sw = wpn.Secondary.ScopeWidth - local sh = wpn.Secondary.ScopeHeight - - local wi = w / 10 * ss - local hi = h / 10 * ss - - if wpn.Secondary.Scoped == true && wpn.Secondary.ScopeBlur == true && wpn.SightsDown == true then - if sw != 1 then - forward = forward + (ss * 0.015 / sw) * (wpn.Secondary.IronFOV * ratio * 0.05) - else - forward = forward + (ss * 0.0175) / (wpn.Secondary.IronFOV * ratio * 0.01) - end - -- rotational = rotational + 0.05 * math.sin( CurTime() * 3 ) - end - - if wpn.SightsDown == false or wpn.IsOverheated == true then - forward = 0 - if forward > 0 then forward = 0 end - end - return horizontal, vertical, forward, rotational -end ) - @@ -558,8 +542,8 @@ DRC.Inspection.DefaultTheme = { ["Enter"] = "garrysmod/ui_return.wav", ["Exit"] = "garrysmod/ui_return.wav", ["Select"] = "weapons/smg1/switch_single.wav", - ["Deny"] = "hl1/fvox/buzz.wav", - ["Dropdown"] = "npc/headcrab_poison/ph_step4.wav" + ["Deny"] = "draconic/ui/deny0.wav", + ["Dropdown"] = "draconic/ui/click0.wav" } } DRC.Inspection.Theme = DRC.Inspection.DefaultTheme @@ -576,8 +560,8 @@ local function drc_Inspect() local ply = LocalPlayer() local wpn = ply:GetActiveWeapon() if wpn.Draconic == nil then return end - if wpn.MulIns == nil then return end local bool = wpn:GetNWBool("Inspecting", false) + local b2 = wpn.Customizing local w = ScrW() local h = ScrH() @@ -599,20 +583,21 @@ local function drc_Inspect() attalphalerp = Lerp(0.25, attalphalerp or attalpha, attalpha) if bool == true then - alpha = Lerp(wpn.MulIns, 0, 1) - YOffset = Lerp(wpn.MulIns, h/2, 0) - XOffset = Lerp(wpn.MulIns, w/2, 0) + alpha = Lerp(1, 0, 1) + YOffset = Lerp(1, h/2, 0) + XOffset = Lerp(1, w/2, 0) drc_ins_offsetlerp_x = Lerp(0.025 * 10, drc_ins_offsetlerp_x or XOffset, XOffset) drc_ins_offsetlerp_y = Lerp(0.025 * 10, drc_ins_offsetlerp_y or YOffset, YOffset) else - alpha = Lerp(wpn.MulIns, 1, 0) - YOffset = Lerp(wpn.MulIns, 0, h ) - XOffset = Lerp(wpn.MulIns, 0, w ) + alpha = Lerp(0, 1, 0) + YOffset = Lerp(1, 0, h ) + XOffset = Lerp(1, 0, w ) drc_ins_offsetlerp_x = Lerp(0.025 * 2.5, drc_ins_offsetlerp_x or w/w2/2, w/2) drc_ins_offsetlerp_y = Lerp(0.025 * 2.5, drc_ins_offsetlerp_y or h/h2/2, h/2) end + if bool == false then return end DRC.Inspection.ThemeColours = {} for k,v in pairs(themecolours) do @@ -951,6 +936,7 @@ function DRC:ToggleAttachmentMenu(wpn, b) m.Sections = {} local function MakeSection(relevancy) + if #wpn.AttachmentTable[relevancy] < 2 then return end m[relevancy] = vgui.Create("DPanel", m) m[relevancy]:SetBackgroundColor(DRC.Inspection.ThemeColours_Attachments.Background) m[relevancy]:Dock(TOP) @@ -1075,6 +1061,132 @@ function DRC:ToggleAttachmentMenu(wpn, b) if k != "BaseClass" then MakeSection(k) end end + local function MakeSkinSelection() + local relevancy = "WeaponSkin" + m[relevancy] = vgui.Create("DPanel", m) + m[relevancy]:SetBackgroundColor(DRC.Inspection.ThemeColours_Attachments.Background) + m[relevancy]:Dock(TOP) + + table.insert(m.Sections, m[relevancy]) + + local label = " | None" + m[relevancy].Title = vgui.Create("DLabel", m[relevancy]) + local title = m[relevancy].Title + title:SetSize(500, m[relevancy]:GetTall()) + title:SetText(" Camo") + title:SetFont(DRC.Inspection.Theme.Fonts.Header) + title:Dock(TOP) + + m[relevancy].Selected = vgui.Create("DLabel", m[relevancy]) + local selected = m[relevancy].Selected + selected:SetSize(400, m[relevancy]:GetTall()) + selected:SetText(label) + selected:SetFont(DRC.Inspection.Theme.Fonts.Header) + selected:SetPos(125, 0) + + m[relevancy].Collapser = vgui.Create("DButton", m[relevancy]) + local cbutton = m[relevancy].Collapser + cbutton:SetPos(0, 0) + cbutton:SetSize(m[relevancy]:GetTall(), m[relevancy]:GetTall()) + cbutton:SetFont(DRC.Inspection.Theme.Fonts.Header) + cbutton:SetTextColor(DRC.Inspection.ThemeColours_Attachments.Text) + cbutton:SetText("+") + function cbutton:Paint(w,h) + draw.RoundedBox(0, 0, 0, w, h, DRC.Inspection.ThemeColours_Attachments.Background) + end + + m[relevancy].Section = vgui.Create("DPanelSelect", m) + local selection = m[relevancy].Section + selection.Panels = {} + selection:SetPos(0, m[relevancy].Title:GetTall()) + selection:SetSize(500, 0) + selection:SetBackgroundColor(DRC.Inspection.ThemeColours_Attachments.Background) + selection:Dock(TOP) + selection:SetVisible(false) + + cbutton.DoClick = function() + if selection:IsVisible() == true then + m[relevancy].Section:SetVisible(false) + m[relevancy].Section:SetTall(0) + cbutton:SetText("+") + else + m[relevancy].Section:SetVisible(true) + m[relevancy].Section:SetTall(400) + cbutton:SetText("-") + end + for k,v in pairs(m.Sections) do + v:Dock(TOP) + end + surface.PlaySound(DRC.Inspection.Theme.Sounds.Dropdown) + end + + function selection:OnActivePanelChanged( old, new ) + if ( old != new ) then + selected:SetText(" | ".. selection[new][1] .."") + if !new[3] then + net.Start("DRC_WeaponCamoSwitch") + net.WriteEntity(wpn) + net.WriteEntity(LocalPlayer()) + net.WriteString(selection[new][3]) + net.SendToServer() + end + -- surface.PlaySound(DRC.Inspection.Theme.Sounds.Select) + end + end + + local rbutton = vgui.Create("DImageButton", m[relevancy].Section) + rbutton:SetSize(64, 64) + rbutton:SetImage("gui/cross.png") + rbutton:SetTooltip("Remove applied weapon skin/camo.") + rbutton:SetColor(Color(255, 0, 0, 127)) + selection[rbutton] = {"None", "Remove applied weapon skin/camo.", ""} + + selection:AddPanel(rbutton) + + if wpn.WeaponSkinSpecialMats != nil then + for k,v in pairs(wpn.WeaponSkinSpecialMats) do + local name, desc = v.name, v.desc + if name && desc then + m[relevancy].Section[k] = vgui.Create("DImageButton", m[relevancy].Section) + local icon = m[relevancy].Section[k] + local img = k + icon:SetMaterial(img) + icon:SetSize(64, 64) + icon:SetTooltip("".. name .."\n\n".. desc .."") + + selection.Panels[k] = {icon, name, desc} + selection[icon] = {name, desc, k} + selection:AddPanel( icon ) + end + end + end + + for k,v in SortedPairs(DRC.WeaponSkins) do + local name, desc = v.name, v.desc + if name && desc && wpn.WeaponSkinDisallowUniversals != true then + m[relevancy].Section[k] = vgui.Create("DImageButton", m[relevancy].Section) + local icon = m[relevancy].Section[k] + local img = k + if v.icon then img = v.icon end + icon:SetMaterial(img) + icon:SetSize(64, 64) + icon:SetTooltip("".. name .."\n\n".. desc .."") + + selection.Panels[k] = {icon, name, desc} + selection[icon] = {name, desc, k} + selection:AddPanel( icon ) + end + end + + if (!table.IsEmpty(DRC.WeaponSkins) or (wpn.WeaponSkinSpecialMats && !table.IsEmpty(wpn.WeaponSkinSpecialMats))) && wpn.WeaponSkinApplied != nil then + if !table.IsEmpty(selection.Panels) then + selection:SelectPanel(selection.Panels[wpn.WeaponSkinApplied][1]) + end + end + end + + if wpn.WeaponSkinSubMaterials != nil && wpn.WeaponSkinDefaultMat != nil then MakeSkinSelection() end + m.cb = vgui.Create("DButton", m) m.cb:SetText("Commit Changes") m.cb:SetPos(m:GetWide()/3.5, m:GetTall()-36) @@ -1536,7 +1648,6 @@ hook.Add("PreDrawViewModel", "DrcLerp_Debug", function( vm, ply, wpn ) for k, v in pairs(vm:GetAttachments()) do DrawVMAttachments(v.name, vm) end - local attachment = vm:LookupAttachment("muzzle") local muz = vm:GetAttachment(attachment) @@ -1547,13 +1658,15 @@ hook.Add("PreDrawViewModel", "DrcLerp_Debug", function( vm, ply, wpn ) drc_vm_offangle = Angle(0, 0, 0) + ply:EyeAngles() local offs = pos - vm:GetPos() - drc_vmapos = Lerp(FrameTime() * 25, drc_vmapos or offs, offs) + drc_vmapos = Lerp(RealFrameTime() * 25, drc_vmapos or offs, offs) local offsb = ang - vm:GetAngles() - drc_vmoffset_angle_x = math.ApproachAngle(offsb.x, drc_vm_offangle.x, FrameTime() * drc_vm_angdiff_median) - drc_vmoffset_angle_y = math.ApproachAngle(offsb.y, drc_vm_offangle.y, FrameTime() * drc_vm_angdiff_median) - drc_vmoffset_angle_z = math.ApproachAngle(offsb.z, drc_vm_offangle.z, FrameTime() * drc_vm_angdiff_median) +-- ply:ChatPrint(tostring(offsb)) + + drc_vmoffset_angle_x = math.ApproachAngle(offsb.x, drc_vm_offangle.x, 0.1 * drc_vm_angdiff_median) + drc_vmoffset_angle_y = math.ApproachAngle(offsb.y, drc_vm_offangle.y, 0.1 * drc_vm_angdiff_median) + drc_vmoffset_angle_z = math.ApproachAngle(offsb.z, drc_vm_offangle.z, 0.1 * drc_vm_angdiff_median) drc_vm_angdiff_x = math.AngleDifference(drc_vmoffset_angle_x, drc_vm_offangle.x) drc_vm_angdiff_y = math.AngleDifference(drc_vmoffset_angle_y, drc_vm_offangle.y) @@ -1563,9 +1676,14 @@ hook.Add("PreDrawViewModel", "DrcLerp_Debug", function( vm, ply, wpn ) drc_vm_angdiff_median = math.Clamp(math.abs((drc_vm_angdiff_x + drc_vm_angdiff_y + drc_vm_angdiff_z) / 3), 16, 60) - drc_vm_angmedian = Lerp(FrameTime() * 5, drc_vm_angdiff_median / (drc_vm_lerpdivval / 6) or 0, drc_vm_angdiff_median / (drc_vm_lerpdivval / 6)) + drc_vm_angmedian = Lerp(RealFrameTime() * 5, drc_vm_angdiff_median / (drc_vm_lerpdivval / 6) or 0, drc_vm_angdiff_median / (drc_vm_lerpdivval / 6)) - drc_vmaangle = (drc_vm_offangle + drc_vm_angdiff) +-- drc_vmaangle = (drc_vm_offangle + drc_vm_angdiff) +-- drc_vmaangle = drc_vmaangle * drc_vm_angmul + offsb.x = offsb.x * drc_vm_angmul.x + offsb.y = offsb.y * drc_vm_angmul.y + offsb.z = offsb.z * drc_vm_angmul.z + drc_vmaangle = offsb end) hook.Add("Tick", "DRC_PreventBrokenHUD", function() diff --git a/lua/draconic/cl/library.lua b/lua/draconic/cl/library.lua index 6d70603..03668c7 100644 --- a/lua/draconic/cl/library.lua +++ b/lua/draconic/cl/library.lua @@ -13,6 +13,9 @@ DRC.Menu = {} DRC.CurrentRPModelOptions = {} DRC.CurrentSpecialModelOptions = {} +DRC.VolumeLights = {} + +language.Add( "SniperRound_ammo", "Sniper Ammo" ) -- give a string to base-game sniper ammo since it has none if game.SinglePlayer() then if GetConVar("cl_drc_debug_alwaysshowshields") == nil then @@ -23,7 +26,10 @@ end function DRC:PlayGesture(ply, slot, gesture, b) if ply:IsValid() && ply:IsPlayer() then timer.Simple(engine.TickInterval(), function() - if IsValid(ply) then ply:AnimRestartGesture(slot, gesture, b) end + if IsValid(ply) then + ply:AnimRestartGesture(slot, gesture, b) + ply.PSXCycle = 0 + end end) end end @@ -54,25 +60,14 @@ function DRC:GetCustomizationAllowed() local gamemode = tostring(engine.ActiveGamemode()) local svtoggle = DRC.SV.drc_playerrep_disallow local svtweaktoggle = DRC.SV.drc_playerrep_tweakonly + if svtweaktoggle == "" or !svtweaktoggle then svtweaktoggle = 0 end + + if !table.IsEmpty(DRC.CurrentRPModelOptions) then return true, svtweaktoggle end - if !table.IsEmpty(DRC.CurrentRPModelOptions) then return true end - - if svtoggle == 1 then return false end - if svtweaktoggle >= 1 then return nil, svtweaktoggle end - ---[[ local allowedGMs = { - ["sandbox"] = "E", - } - local tweakGMs = { - ["darkrp"] = "E", - ["helix"] = "E", - ["cwrp"] = "E", - } + if svtoggle == 1 then return false, svtweaktoggle end + if svtweaktoggle >= 1 then return true, svtweaktoggle end - if allowedGMs[gamemode] then return true, svtweaktoggle end - if tweakGMs[gamemode] then return nil, svtweaktoggle end - if !allowedGMs[gamemode] && !tweakGMs[gamemode] then return true end ]] - return true + return true, svtweaktoggle end function DRC:DistFromLocalPlayer(pos, sqr) @@ -248,6 +243,12 @@ surface.CreateFont("ApercuStatsTitle", { outline = true }) +surface.CreateFont("DraconicSpawnMenuCategory", { + font = "Verdana", + size = 46, + weight = 0, +}) + surface.CreateFont("DripIcons_Menu", { font = "dripicons-v2", size = 16, @@ -390,6 +391,16 @@ end) hook.Add("PlayerStartVoice", "DRC_SpeakingPoseParam_MarkTrue", function(ply) if game.SinglePlayer() then return end ply.IsUsingVoice = true end) hook.Add("PlayerEndVoice", "DRC_SpeakingPoseParam_MarkFalse", function(ply) if game.SinglePlayer() then return end ply.IsUsingVoice = false end) +hook.Add("CreateClientsideRagdoll", "Draconic_FunnyPlayerCorpses_Client", function(ply, rag) + if GetConVar("sv_drc_funnyplayercorpses"):GetInt() == 1 && ply:IsPlayer() then + local rag2 = ply:GetRagdollEntity() + timer.Simple(0, function() + rag2:SetColor(Color(255, 255, 255, 0)) + rag2:SetRenderMode(RENDERMODE_TRANSCOLOR) + end) + end +end) + @@ -422,9 +433,256 @@ DRC.ThirdPerson.DefaultOffsets = { ["revolver"] = Vector(50, -25, 0), } +DRC.ThirdPerson.Presets = {} + +function DRC:ThirdPersonResetToDefault() + table.CopyFromTo(DRC.ThirdPerson.DefaultSettings, DRC.ThirdPerson.EditorSettings) + table.CopyFromTo(DRC.ThirdPerson.DefaultSettings, DRC.ThirdPerson.LoadedSettings) + RunConsoleCommand("cl_drc_thirdperson_preset", "") + + DRC:UpdateThirdPersonEditorMenu() +end + +function DRC:GetThirdPersonPresets() + local presets = file.Find("draconic/thirdperson/*.json", "DATA") + if table.IsEmpty(presets) then + file.CreateDir("draconic/thirdperson/") + file.Write("draconic/thirdperson/dummyfile.json", "This file exists solely for the Draconic Base to register this directory.") + return {"dummyfile.json"} + else + return presets + end +end + +function DRC:UpdateThirdPersonEditorMenu() + if DRC.ThirdPerson.EditorMenu != nil then + local Derma = DRC.ThirdPerson.EditorMenu + Derma.offsets:SetValue(DRC.ThirdPerson.EditorSettings.UseBaseOffsets) + Derma.freelook:SetValue(DRC.ThirdPerson.EditorSettings.AllowFreeLook) + Derma.cameraz:SetValue(DRC.ThirdPerson.EditorSettings.Height) + Derma.cameray:SetValue(DRC.ThirdPerson.EditorSettings.Length) + Derma.sliderx:SetValue(DRC.ThirdPerson.EditorSettings.Offset.X) + Derma.slidery:SetValue(-DRC.ThirdPerson.EditorSettings.Offset.Y) + Derma.sliderz:SetValue(DRC.ThirdPerson.EditorSettings.Offset.Z) + Derma.sliderfov:SetValue(DRC.ThirdPerson.EditorSettings.BaseFOV) + Derma.sliderlerppos:SetValue(DRC.ThirdPerson.EditorSettings.LerpPos) + Derma.sliderlerpang:SetValue(DRC.ThirdPerson.EditorSettings.LerpAngle) + Derma.ddorigin:SetValue(DRC.ThirdPerson.EditorSettings.BasePoint) + Derma.ddfocal:SetValue(DRC.ThirdPerson.EditorSettings.FocalPoint) + end +end + +function DRC:CreateThirdPersonPresetMenu(parent, iseditor) + if !file.Exists("draconic", "DATA") then file.CreateDir("draconic") end + if !file.Exists("draconic/thirdperson", "DATA") then file.CreateDir("draconic/thirdperson") end + + local panel = vgui.Create("DScrollPanel", parent) + panel:SetSize(parent:GetWide(), parent:GetTall()) + panel.Paint = function(self, w, h) + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end + + local SelectedPreset, SelectedPresetName + + local loadbutton = vgui.Create("DButton", panel) + loadbutton:SetSize(panel:GetWide(), 30) + loadbutton:SetPos(0, 0) + loadbutton:Dock(TOP) + loadbutton:SetText("Load selected preset") + loadbutton:SetEnabled(false) + loadbutton.DoClick = function() + table.CopyFromTo(SelectedPreset, DRC.ThirdPerson.LoadedSettings) + if iseditor == true then table.CopyFromTo(SelectedPreset, DRC.ThirdPerson.EditorSettings) DRC:UpdateThirdPersonEditorMenu() end + RunConsoleCommand("cl_drc_thirdperson_preset", SelectedPresetName) + end + + local function RefreshPresets() + local panel2 = vgui.Create("DPanel", panel) + panel2:SetSize(panel:GetWide(), panel:GetTall()) + panel2:Dock(FILL) + panel2.Paint = function(self, w, h) + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end + for k,v in pairs(DRC:GetThirdPersonPresets()) do + if v != "dummyfile.json" then + local container = vgui.Create("DPanel", panel2) + container:SetSize(panel:GetWide(), 24) + container:SetPos(0, 0) + container:Dock(TOP) + container:DockMargin(0, 0, 0, 1) + container:SetBackgroundColor(Color(0, 0, 0, 0)) + + local loadedpreset = file.Read("draconic/thirdperson/".. v .."", "DATA") + local tbl = util.JSONToTable(loadedpreset) + + local label = vgui.Create("DButton", container) + label:SetText(tbl.Name) + label:SetSize(container:GetWide(), container:GetTall()) + label:Dock(FILL) + if tbl.Name == SelectedPresetName then + label:SetEnabled(false) + end + label.DoClick = function() + SelectedPreset = tbl + SelectedPresetName = tbl.Name + label:SetEnabled(false) + loadbutton:SetEnabled(true) + panel2:Remove() + RefreshPresets() + end + + local delete = vgui.Create("DButton", container) + delete:SetSize(container:GetTall(), container:GetTall()) + delete:SetText("9") + delete:Dock(RIGHT) + delete:SetTooltip("Click to delete this preset.") + delete:SetFont("DripIcons_Menu") + function delete:Paint( w, h ) + draw.RoundedBox( 4, 0, 0, w, h, Color( 200, 50, 50 ) ) + end + + local function DeletePopup() + local Frame = vgui.Create("DFrame") + Frame:SetPos(ScrW() / 3, ScrH() / 2) + Frame:SetTitle("CONFIRMATION") + Frame:SetSize(300, 80) + Frame:MakePopup() + + local label = vgui.Create("DLabel", Frame) + label:Dock(TOP) + label:SetText("Are you sure you want to delete this thirdperson preset?") + label:SetContentAlignment(5) + + local cont = vgui.Create("DPanel", Frame) + cont:Dock(TOP) + cont:SetBackgroundColor(Color(255, 255, 255, 0)) + + local DELET = vgui.Create("DButton", cont) + DELET:Dock(LEFT) + DELET:SetText("Delete") + DELET.DoClick = function() + file.Delete("draconic/thirdperson/".. tbl.Name ..".json") + Frame:Remove() + loadbutton:SetEnabled(false) + + timer.Simple(0.1, function() + RefreshPresets() + end) + end + + local CancelCulture = vgui.Create("DButton", cont) + CancelCulture:Dock(RIGHT) + CancelCulture:SetText("Cancel") + CancelCulture.DoClick = function() + Frame:Remove() + end + end + + delete.DoClick = function() + DeletePopup() + end + + if iseditor == true then + local save = vgui.Create("DButton", container) + save:SetSize(container:GetTall(), container:GetTall()) + save:SetText(":") + save:Dock(LEFT) + save:SetTooltip("Click to overwrite this preset.") + save.name = string.gsub(v, ".json", "") + save:SetFont("DripIcons_Menu") + save:SetPaintBackground(false) + function save:Paint( w, h ) + draw.RoundedBox( 4, 0, 0, w, h, Color( 50, 200, 50 ) ) + end + + save.DoClick = function() + DRC:SaveThirdPersonPrompt(false, save.name) + RunConsoleCommand("cl_drc_thirdperson_preset", save.name) + end + end + end + end + end + RefreshPresets() +end + +function DRC:SaveThirdPersonPreset(tbl, name) + tbl.Name = name + local json = util.TableToJSON(tbl, true) + file.Write("Draconic/Thirdperson/".. name ..".json", json) +end + +function DRC:SaveThirdPersonPrompt(isnew, old) + local Frame = vgui.Create("DFrame") + Frame:SetPos(ScrW() / 2 - 300, ScrH() / 2 - 150) + Frame:SetSize(300, 80) + + if !old then + Frame:SetTitle("Enter a name for your save.") + + local SaveButton, TextBot + SaveButton = vgui.Create("DButton", Frame) + SaveButton:Dock(RIGHT) + SaveButton:SetEnabled(false) + SaveButton:SetText("[ Save ]") + SaveButton.DoClick = function() + DRC:SaveThirdPersonPreset(DRC.ThirdPerson.EditorSettings, TextBox:GetValue()) + Frame:Remove() + table.CopyFromTo(DRC.ThirdPerson.EditorSettings, DRC.ThirdPerson.LoadedSettings) + LocalPlayer():ChatPrint("Preset saved & applied.") + end + + TextBox = vgui.Create("DTextEntry", Frame) + TextBox:Dock(FILL) + TextBox:SetTabbingDisabled(true) + TextBox:SetUpdateOnType(true) + TextBox.OnValueChange = function() + local val = TextBox:GetValue() + + if val == nil then + SaveButton:SetEnabled(false) + elseif file.Exists("Draconic/Thirdperson/".. val ..".json", "DATA") then + Frame:SetTitle("Save name already in use, will override!") + else + SaveButton:SetEnabled(true) + Frame:SetTitle("Enter a name for your preset.") + end + end + else + Frame:SetTitle("OVERWRITING EXISTING PRESET.") + local label = vgui.Create("DLabel", Frame) + label:Dock(TOP) + label:SetText("Are you sure you want to overwrite this thirdperson preset?") + label:SetContentAlignment(5) + + local cont = vgui.Create("DPanel", Frame) + cont:Dock(TOP) + cont:SetBackgroundColor(Color(255, 255, 255, 0)) + + local SAVE = vgui.Create("DButton", cont) + SAVE:Dock(LEFT) + SAVE:SetText("Overwrite") + SAVE.DoClick = function() + DRC:SaveThirdPersonPreset(DRC.ThirdPerson.EditorSettings, old) + Frame:Remove() + table.CopyFromTo(DRC.ThirdPerson.EditorSettings, DRC.ThirdPerson.LoadedSettings) + LocalPlayer():ChatPrint("Preset saved & applied.") + end + + local CancelCulture = vgui.Create("DButton", cont) + CancelCulture:Dock(RIGHT) + CancelCulture:SetText("Cancel") + CancelCulture.DoClick = function() + Frame:Remove() + end + end + + Frame:MakePopup() +end + function ThirdPersonModEnabled(ply) local veh, drctpcheck5 = ply:GetVehicle(), false - if IsValid(veh) then + if IsValid(veh) && veh:GetClass() != "prop_vehicle_choreo_generic" then drctpcheck5 = veh:GetThirdPersonMode() end @@ -465,6 +723,7 @@ function DRC:ThirdPersonEnabled(ply) end function DRC:ShouldDoDRCThirdPerson(ply) + if DRC.CalcView.ThirdPerson.EditorOpen == true && DRC.SV.drc_disable_thirdperson != 1 then return true end if !IsValid(ply) then return end if pac then if pace.IsActive() == true then return false end end local curswep = ply:GetActiveWeapon() @@ -474,6 +733,7 @@ function DRC:ShouldDoDRCThirdPerson(ply) end function DRC:IsDraconicThirdPersonEnabled(ply) + if DRC.CalcView.ThirdPerson.EditorOpen == true && DRC.SV.drc_disable_thirdperson != 1 then return true end if !IsValid(ply) then return end local curswep = ply:GetActiveWeapon() if !IsValid(curswep) then @@ -535,6 +795,15 @@ net.Receive("DRC_WeaponAttachSyncInventory", function() LocalPlayer().DRCAttachmentInventory = net.ReadTable() end) +net.Receive("DRC_WeaponCamoSwitch_Sync", function() + local wpn = net.ReadEntity() + local mat = net:ReadString() + + wpn:SetCamo(mat) + +-- surface.PlaySound(DRC.Inspection.Theme.Sounds.Select) +end) + @@ -548,124 +817,165 @@ hook.Add("PlayerBindPress", "DRC_ClientsideHotkeys", function(ply, bind, pressed return true end end) -hook.Add("CalcView", "!DrcLerp", function(ply, origin, ang, fov, zn, zf) - if !IsValid(ply) then return end - if ThirdPersonModEnabled(ply) then return end - if not !game.IsDedicated() then return end - if DRC.SV.drc_viewdrag != 1 then return end - if ply:GetViewEntity() ~= ply then return end - if ply:InVehicle() then return end - +local function CalcViewChecks(ply) + if !IsValid(ply) then return false end + if ThirdPersonModEnabled(ply) then return false end +-- if game.IsDedicated() then return false end + if DRC.SV.drc_viewdrag != 1 then return false end + if ply:GetViewEntity() ~= ply then return false end + if ply:InVehicle() then return false end + local wpn = ply:GetActiveWeapon() if !IsValid(wpn) then return end - if wpn:GetClass() == "drc_camera" then return end - if wpn.Draconic == nil then return end - if wpn.IsMelee == true then return end - local vm = ply:GetViewModel() - local sights = wpn.SightsDown - - local attachment = vm:LookupAttachment("muzzle") - local pos = Vector(0, drc_vmapos.y, drc_vmapos.z) - local oang = drc_vmaangle - - if GetConVar("cl_drc_lowered_crosshair"):GetFloat() == 1 then - DRC.CrosshairAngMod = Angle(-8, 0, 0) - else - DRC.CrosshairAngMod = Angle(0, 0, 0) - end + if wpn:GetClass() == "drc_camera" then return false end + if wpn.Draconic == nil then return false end + if wpn.IsMelee == true then return false end - if sights == true or (ply:GetCanZoom() == true && ply:KeyDown(IN_ZOOM)) then - drc_vm_sightpow = Lerp(FrameTime() * 25, drc_vm_sightpow or 1, 0) - else - drc_vm_sightpow = Lerp(FrameTime() * 25, drc_vm_sightpow or 0, 1) - end - - if sights == true then - drc_vm_sightpow_inv = Lerp(FrameTime() * 25, drc_vm_sightpow_inv or 0, 1) - else - drc_vm_sightpow_inv = Lerp(FrameTime() * 25, drc_vm_sightpow_inv or 1, 0) - end - - drc_crosshair_pitchmod = Angle(wpn.Secondary.ScopePitch, 0, 0) * drc_vm_sightpow_inv - - if wpn.Loading == false && wpn.Inspecting == false then - drc_vm_lerpang = Angle(oang.x, oang.y, Lerp(FrameTime() * drc_vm_angmedian, drc_vm_lerpang.z or 0, 0)) - else - drc_vm_lerpang = LerpAngle(FrameTime(), oang or Angle(0, 0, 0), oang) - end - - drc_vm_lerppos = Vector(Lerp(FrameTime() * 25, 0 or pos.x, 0), Lerp(FrameTime() * 25, 0 or pos.y, 0), Lerp(FrameTime() * 25, 0 or pos.z, 0)) - if wpn:GetNWBool("Loading") == true then - drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or 30, 30) - elseif wpn:GetNWBool("InspectCamLerp") == true then - drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or 16, 16) - else - drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or 50, 50) - end - - if wpn.SightsDown == true or (wpn.Loading == false && wpn.Inspecting == false && wpn.Idle == 1) then - local fr = math.Round(1 / FrameTime()) + return true +end + +drc_vm_angmul = Vector() +hook.Add("CalcView", "!DrcLerp", function(ply, origin, ang, fov, zn, zf) + if CalcViewChecks(ply) == true then + local vm = ply:GetViewModel() + local wpn = ply:GetActiveWeapon() + local sights = wpn.SightsDown + + local attachment = vm:LookupAttachment("muzzle") + local pos = Vector(0, drc_vmapos.y, drc_vmapos.z) + local oang = drc_vmaangle + + if GetConVar("cl_drc_lowered_crosshair"):GetFloat() == 1 then + DRC.CrosshairAngMod = Angle(-8, 0, 0) + else + DRC.CrosshairAngMod = Angle(0, 0, 0) + end + + if sights == true or (ply:GetCanZoom() == true && ply:KeyDown(IN_ZOOM)) then + drc_vm_sightpow = Lerp(FrameTime() * 25, drc_vm_sightpow or 1, 0) + else + drc_vm_sightpow = Lerp(FrameTime() * 25, drc_vm_sightpow or 0, 1) + end + + if sights == true then + drc_vm_sightpow_inv = Lerp(FrameTime() * 25, drc_vm_sightpow_inv or 0, 1) + else + drc_vm_sightpow_inv = Lerp(FrameTime() * 25, drc_vm_sightpow_inv or 1, 0) + end - if fr > 15 then + drc_crosshair_pitchmod = Angle(wpn.Secondary.ScopePitch, 0, 0) * drc_vm_sightpow_inv + + if wpn.Loading == false && wpn.Inspecting == false then + drc_vm_lerpang = Angle(oang.x, oang.y, Lerp(FrameTime() * drc_vm_angmedian, drc_vm_lerpang.z or 0, 0)) + else + drc_vm_lerpang = LerpAngle(FrameTime(), oang or Angle(0, 0, 0), oang) + end + + local swepmul = 50 + local loading, inspecting, idle, melee, firing = wpn.PlayingLoadAnimation, wpn:GetNWBool("InspectCamLerp"), (wpn.OwnerActivity == "standidle" or wpn.OwnerActivity == "crouchidle"), wpn:GetNWBool("IsDoingMelee"), wpn.PlayingShootAnimation + local swepmuls = { + ["idle"] = math.Clamp(wpn.CameraStabilityIdle, 0.1, 5), + ["move"] = math.Clamp(wpn.CameraStabilityMove, 0.1, 5), + ["reload"] = math.Clamp(wpn.CameraStabilityReload, 0.1, 5), + ["inspect"] = math.Clamp(wpn.CameraStabilityInspect, 0.1, 5), + ["melee"] = math.Clamp(wpn.CameraStabilityMelee, 0.1, 5), + } + local angmuls = { + ["idle"] = wpn.CameraAngleMulIdle, + ["move"] = wpn.CameraAngleMulMove, + ["reload"] = wpn.CameraAngleMulReload, + ["inspect"] = wpn.CameraAngleMulInspect, + ["melee"] = wpn.CameraAngleMulMelee, + ["firing"] = wpn.CameraAngleMulFiring or wpn.CameraAngleMulIdle + } + + drc_vm_lerppos = Vector(Lerp(FrameTime() * 25, 0 or pos.x, 0), Lerp(FrameTime() * 25, 0 or pos.y, 0), Lerp(FrameTime() * 25, 0 or pos.z, 0)) + if loading == true && !firing then + local val = swepmul * swepmuls.reload + drc_vm_angmul = angmuls.reload + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif firing && !loading then + local val = swepmul * swepmuls.idle + drc_vm_angmul = angmuls.firing + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif melee == true then + local val = swepmul * swepmuls.melee + drc_vm_angmul = angmuls.melee + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif inspecting == true then + local val = swepmul * swepmuls.inspect + drc_vm_angmul = angmuls.inspect + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif !loading && !inspecting && idle then + local val = swepmul * swepmuls.idle + drc_vm_angmul = angmuls.idle + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + elseif !loading && !inspecting && !idle then + local val = swepmul * swepmuls.move + drc_vm_angmul = angmuls.move + drc_vm_lerpdivval = Lerp(FrameTime() * 5, drc_vm_lerpdivval or val, val) + end + + if wpn.SightsDown == true or (wpn.Loading == false && wpn.Inspecting == false && wpn.Idle == 1) then + local fr = math.Round(1 / FrameTime()) + if ply:KeyDown(IN_SPEED) or wpn.SightsDown == true then drc_vm_lerpang_final = Angle(0, 0, 0) else drc_vm_lerpang_final = LerpAngle(FrameTime() * drc_vm_angmedian, drc_vm_lerpang_final or Angle(0, 0, 0), drc_vm_lerpang) end else - drc_vm_lerpang_final = Angle(0, 0, 0) + drc_vm_lerpang_final = LerpAngle(FrameTime() * drc_vm_angmedian, drc_vm_lerpang_final or drc_vm_lerpang, drc_vm_lerpang) * 1 end - else - drc_vm_lerpang_final = LerpAngle(FrameTime() * drc_vm_angmedian, drc_vm_lerpang_final or drc_vm_lerpang, drc_vm_lerpang) - end - - drc_vm_lerpdiv = Lerp(FrameTime() * 5, drc_vm_lerpdivval or drc_vm_lerpdiv, drc_vm_lerpdivval) - - if wpn.IsMelee == false && !attachment then return end - - if ply:GetNW2Int("TFALean", 1337) != 1337 then - local tfaleanang = LeanCalcView(ply, origin, ang, fov) - for k, v in pairs(tfaleanang) do - if k == "origin" then - drc_calcview_tfapos = v - elseif k == "angles" then - drc_calcview_tfaang = v + + drc_vm_lerpdiv = Lerp(FrameTime() * 5, drc_vm_lerpdiv or drc_vm_lerpdivval, drc_vm_lerpdivval) + + if wpn.IsMelee == false && !attachment then return end + + if ply:GetNW2Int("TFALean", 1337) != 1337 then + local tfaleanang = LeanCalcView(ply, origin, ang, fov) + for k, v in pairs(tfaleanang) do + if k == "origin" then + drc_calcview_tfapos = v + elseif k == "angles" then + drc_calcview_tfaang = v + end end + else + drc_calcview_tfapos = ply:EyePos() + drc_calcview_tfaang = ply:EyeAngles() + end + + if ply:GetNW2Int("TFALean", 1337) != 1337 then + DRC.CalcView.Pos = drc_vm_lerppos / drc_vm_lerpdiv - ( origin - drc_calcview_tfapos) + DRC.CalcView.Ang = drc_vm_lerpang_final / drc_vm_lerpdiv - ( ang - drc_calcview_tfaang) + DRC.CrosshairAngMod * drc_vm_sightpow + -- if GetConVar("cl_drc_sway"):GetFloat() != 1 then DRC.CalcView.Ang = Angle() end + local view = { + origin = origin - drc_vm_lerppos / drc_vm_lerpdiv - ( origin - drc_calcview_tfapos), + angles = ang - DRC.CalcView.Ang, + fov = fov + } + return view + else + DRC.CalcView.Pos = drc_vm_lerppos / drc_vm_lerpdiv + DRC.CalcView.Ang = drc_crosshair_pitchmod - drc_vm_lerpang_final / drc_vm_lerpdiv + DRC.CrosshairAngMod * drc_vm_sightpow + -- if GetConVar("cl_drc_sway"):GetFloat() != 1 then DRC.CalcView.Ang = Angle() end + local view = { + origin = origin - drc_vm_lerppos / drc_vm_lerpdiv, + angles = ang + DRC.CalcView.Ang, + fov = fov + } + return view end - else - drc_calcview_tfapos = ply:EyePos() - drc_calcview_tfaang = ply:EyeAngles() - end - - if ply:GetNW2Int("TFALean", 1337) != 1337 then - DRC.CalcView.Pos = drc_vm_lerppos / drc_vm_lerpdiv - ( origin - drc_calcview_tfapos) - DRC.CalcView.Ang = drc_vm_lerpang_final / drc_vm_lerpdiv - ( ang - drc_calcview_tfaang) + DRC.CrosshairAngMod * drc_vm_sightpow - -- if GetConVar("cl_drc_sway"):GetFloat() != 1 then DRC.CalcView.Ang = Angle() end - local view = { - origin = origin - drc_vm_lerppos / drc_vm_lerpdiv - ( origin - drc_calcview_tfapos), - angles = ang - DRC.CalcView.Ang, - fov = fov - } - return view - else - DRC.CalcView.Pos = drc_vm_lerppos / drc_vm_lerpdiv - DRC.CalcView.Ang = drc_crosshair_pitchmod - drc_vm_lerpang_final / drc_vm_lerpdiv + DRC.CrosshairAngMod * drc_vm_sightpow - -- if GetConVar("cl_drc_sway"):GetFloat() != 1 then DRC.CalcView.Ang = Angle() end - local view = { - origin = origin - drc_vm_lerppos / drc_vm_lerpdiv, - angles = ang + DRC.CalcView.Ang, - fov = fov - } - return view end end) function DRCSwepSway(wpn, vm, ogpos, ogang, pos, ang) - if wpn.Draconic then + if IsValid(wpn) && wpn.Draconic then local ply = wpn:GetOwner() if IsValid(ply) then - if ply:Alive() then + if ply:Alive() && ogpos != nil && ogang != nil then local calcpos, calcang = wpn:GetViewModelPosition(ogpos, ogang) local newpos, newang = calcpos, calcang if calcpos && calcang && newpos && newang then @@ -717,12 +1027,13 @@ function DRCSwepSway(wpn, vm, ogpos, ogang, pos, ang) end end - rollval_lerp = Lerp(0.06, rollval_lerp or rollval, rollval) - drc_xval_lerp = Lerp(0.1, drc_xval_lerp or xval, xval) - drc_yval_lerp = Lerp(0.1, drc_yval_lerp or yval, yval) + local rft = RealFrameTime() + rollval_lerp = Lerp(rft*5, rollval_lerp or rollval, rollval) + drc_xval_lerp = Lerp(rft*10, drc_xval_lerp or xval, xval) + drc_yval_lerp = Lerp(rft*10, drc_yval_lerp or yval, yval) rollval_lerp = rollval_lerp * sightkill local vel = math.Clamp(ply:GetVelocity():LengthSqr()*0.00005, 0, 4) - drc_vel_lerp = Lerp(0.1, drc_vel_lerp or vel, vel) + drc_vel_lerp = Lerp(rft*10, drc_vel_lerp or vel, vel) if wpn.ShouldWalkBlend == false then drc_xval_lerp = Lerp(0.5, drc_xval_lerp or 0, 0) @@ -738,7 +1049,7 @@ function DRCSwepSway(wpn, vm, ogpos, ogang, pos, ang) local holdang = LocalPlayer():EyeAngles() wpn.dang = LerpAngle((wpn.SS/15), wpn.dang, holdang - wpn.oang) - if RealTime() > wpn.LLTime + (RealFrameTime() * 0.001) then + if RealTime() > wpn.LLTime + (FrameTime() * 0.001) then wpn.LLTime = RealTime() wpn.oang = LocalPlayer():EyeAngles() wpn.dang = wpn.dang * sightkill @@ -748,10 +1059,7 @@ function DRCSwepSway(wpn, vm, ogpos, ogang, pos, ang) -- if GetConVar("cl_drc_sway"):GetInt() < 1 then wpn.dang = Angle(0, 0, 0) end local dynang = Angle(wpn.dang.x * -wpn.SS/1.25, wpn.dang.y * wpn.SS/2, wpn.dang.z + rollval_lerp)*2 - - newang:RotateAroundAxis(ang:Right(), dynang.x) - newang:RotateAroundAxis(ang:Up(), dynang.y) - newang:RotateAroundAxis(ang:Forward(), dynang.z) + newpos:Add(ang:Right() * dynang.y*wpn.SS/6) -- newpos:Add(ang:Forward() * dynang.y) newpos:Add(ang:Up() * -dynang.x*wpn.SS/6) @@ -763,8 +1071,192 @@ function DRCSwepSway(wpn, vm, ogpos, ogang, pos, ang) end end +local sprpos, sprang, sprposlerp, spranglerp = Vector(), Vector(), Vector(), Vector() +local passpos, passang, passposlerp, passanglerp = Vector(), Vector(), Vector(), Vector() +local inspos, insang, insposlerp, insanglerp = Vector(), Vector(), Vector(), Vector() +local crpos, crang, crposlerp, cranglerp = Vector(), Vector(), Vector(), Vector() +local irpos, irang, irposlerp, iranglerp = Vector(), Vector(), Vector(), Vector() +local lerppower = 7 +local bump, bumpang = Vector(), Vector() + +local function Bump(pos, ang, thyme) + bump = pos + bumpang = ang + timer.Simple(thyme * 0.05, function() bump = pos*0.8 bumpang = ang*0.8 end) + timer.Simple(thyme * 0.075, function() bump = pos*0.6 bumpang = ang*0.6 end) + timer.Simple(thyme * 0.1, function() bump = pos*0.4 bumpang = ang*0.4 end) + timer.Simple(thyme * 0.125, function() bump = pos*0.2 bumpang = ang*0.2 end) + timer.Simple(thyme * 0.15, function() bump = Vector() bumpang = Vector() end) -- I'm lazy and it works, I'll rewrite it into a proper queue later. +end + +local osd = false +local oins = false +local opas = false +local onehand = { "pistol", "slam", "magic" } +local twohand = { "smg", "ar2", "shotgun", "crossbow", "camera", "revolver" } +local dualtypes = { "duel" } +local lowtypes = { "physgun" } +local hightypes = { "rpg" } +local meleetypes = { "melee", "knife", "grenade", "slam" } +local meleetwohand = { "melee2" } +local handguns = { "pistol", "revolver" } + +function DRCSwepOffset(wpn, vm) + if !wpn.Draconic then return end + local ply = LocalPlayer() + local DrcGlobalVMOffset = Vector(GetConVar("cl_drc_vmoffset_x"):GetFloat(), GetConVar("cl_drc_vmoffset_y"):GetFloat(), GetConVar("cl_drc_vmoffset_z"):GetFloat()) + + local offs = { + ["null"] = {Vector(), Vector()}, + ["base"] = {wpn.VMPos, wpn.VMAng}, + ["crouch"] = {wpn.VMPosCrouch or wpn.VMPos, wpn.VMAngCrouch or wpn.VMAng}, + ["iron"] = {wpn.VARSightPos, wpn.VARSightAng}, + ["sprint"] = {wpn.SprintPos or wpn.PassivePos, wpn.SprintAng or wpn.PassiveAng}, + ["passive"] = {wpn.PassivePos, wpn.PassiveAng}, + ["inspect"] = {wpn.InspectPos, wpn.InspectAng}, + } + + local cv = ply:Crouching() + local ea = ply:EyeAngles() + local sd = wpn.SightsDown + local sk = ply:KeyDown(IN_SPEED) + local mk = (ply:KeyDown(IN_MOVELEFT) or ply:KeyDown(IN_MOVERIGHT) or ply:KeyDown(IN_FORWARD) or ply:KeyDown(IN_BACK)) + local sprint = sk && mk && (wpn.DoesPassiveSprint == true or DRC.SV.drc_force_sprint == 1) + local passive = wpn:GetNWBool("Passive", false) && DRC.SV.drc_passives >= 1 + local inspect = wpn:GetNWBool("Inspecting") && DRC.SV.drc_inspections >= 1 + lerppower = FrameTime() * 7 + if DRC.SV.drc_force_sprint == 2 then sprint = false end + + if sprint then passive = false end + + local mul2 = 1 + if cv && !sd then offs.base = offs.crouch mul2=0.25 end + + if sprint then sprpos = offs.sprint[1] + offs.base[1] sprang = offs.sprint[2] + offs.base[2] + else sprpos = offs.base[1] sprang = offs.base[2] end + if !sprpos or !sprang then return end + sprposlerp = LerpVector(lerppower*mul2, sprposlerp or sprpos, sprpos) + spranglerp = LerpVector(lerppower*0.75*mul2, spranglerp or sprang, sprang) + + if opas != passive then + opas = passive + if passive == true then Bump(Vector(0, 0, 0.5), Vector(-2, 0, 2), 2) end + if passive == false then Bump(Vector(0, 0, 1), Vector(2, 0, 5), 3) end + end + + if passive then passpos = offs.passive[1] + bump passang = offs.passive[2] + bumpang + else passpos = offs.null[1] passang = offs.null[2] end + if !passpos or !passang then return end + passposlerp = LerpVector(lerppower*0.4, passposlerp or passpos, passpos) + passanglerp = LerpVector(lerppower*0.6, passanglerp or passang, passang) + + if oins != inspect then + oins = inspect + if inspect == true then Bump(Vector(0, 0, 0.5), Vector(-2, 0, 2), 2) end + if inspect == false then Bump(Vector(0, 0, 1), Vector(2, 0, 5), 3) end + end + + if inspect then inspos = offs.inspect[1] + bump insang = offs.inspect[2] + bumpang + else inspos = offs.null[1] insang = offs.null[2] end + if !inspos or !insang then return end + insposlerp = LerpVector(lerppower*0.7, insposlerp or inspos, inspos) + insanglerp = LerpVector(lerppower*0.5, insanglerp or insang, insang) + + local POX = (ea.x / 135) + local POY = (ea.x / 100 * 5) + local POZ = (ea.x / -45) + local AOX = (ea.x / 30) + + wpn.VAPos = Vector(POX, POY, POZ) + wpn.VAAng = Vector(AOX, 0, 0) + + wpn.VARPos = LerpVector(wpn.MulI, -wpn.VMPos / 255, wpn.VAPos ) * math.Clamp(wpn.PerspectivePower, 0, 1) + wpn.VARAng = LerpVector(wpn.MulI, Vector(0, 0, 0), wpn.VAAng ) * math.Clamp(wpn.PerspectivePower, 0, 1) + + wpn.DownCorrectionPos = Vector() + wpn.DownCorrectionAng = Vector() + wpn.DownCorrectionAng.z = wpn.DownCorrectionAng.z - (ea.x / 10) * math.Clamp(wpn.PerspectivePower, 0, 1) + wpn.DownCorrectionAng.z = math.Clamp(wpn.DownCorrectionAng.z, -10, 2) * math.Clamp(wpn.PerspectivePower, 0, 1) + wpn.DownCorrectionAng.y = wpn.DownCorrectionAng.y + math.abs(ea.x / 90) * math.Clamp(wpn.PerspectivePower, 0, 1) + + local eyepos = ply:EyePos() + + local walloffset, heft = {}, 10 + if CTFK(handguns, wpn:GetHoldType()) then + heft = 10 + walloffset = { + Vector(-2, -5, 1), + Vector(0, 0, 0), + } + elseif CTFK(meleetwohand, wpn:GetHoldType()) then + heft = 3 + walloffset = { + Vector(2, -5, -3), + Vector(25, -7.5, -15), + } + else + heft = 5 + walloffset = { + Vector(2, -5, -1), + Vector(5, 6, 0), + } + end + if wpn.NearWallPos then walloffset[1] = wpn.NearWallPos end + if wpn.NearWallAng then walloffset[2] = wpn.NearWallAng end + + local aids = ply:GetEyeTrace().HitPos + local hiv = math.Round(ply:EyePos():Distance(aids)) + hiv = math.Clamp(hiv, 0, 50) / 50 + hiv = 1 - hiv + wpn.walllerpval = Lerp((0.008) * heft, wpn.walllerpval or hiv, hiv) * math.Clamp(wpn.NearWallPower, 0, 1) + local wallpos = Lerp(wpn.walllerpval, Vector(), walloffset[1]) + local wallang = Lerp(wpn.walllerpval, Vector(), walloffset[2]) + + wpn.VARPos = wpn.VARPos + wpn.DownCorrectionPos + wallpos + wpn.VARAng = wpn.VARAng + wpn.DownCorrectionAng + wallang + + if osd != sd then + osd = sd + if sd == true then Bump(Vector(-2.5, 0, -1), Vector(0, -5, -15), 1) end + end + + if sd then irpos = offs.iron[1] - offs.base[1] + bump irang = offs.iron[2] - offs.base[2] + bumpang + else irpos = offs.null[1] + bump + DrcGlobalVMOffset + wpn.VARPos irang = offs.null[2] + bumpang + wpn.VARAng end + if !irpos or !irang then return end + irposlerp = LerpVector(lerppower*1.5, irposlerp or irpos, irpos) + iranglerp = LerpVector(lerppower, iranglerp or irang, irang) + + local angpos + if wpn.Sway_IsShouldered == true then + local mul = wpn.Sway_OffsetPowerPos + local x = -wpn.dynmove.Ang.y*0.15 * mul.x + local y = math.abs(wpn.dynmove.Ang.x*0.25) * mul.y + local z = wpn.dynmove.Ang.x*0.25 * mul.z + angpos = Vector(x, y, z) + else + local mul = wpn.Sway_OffsetPowerPos + local x = wpn.dynmove.Ang.y*0.15 * mul.x + local y = math.abs(wpn.dynmove.Ang.x*0.25) * mul.y + local z = -wpn.dynmove.Ang.x*0.25 * mul.z + angpos = Vector(x, y, z) + end + angpos = angpos + + local finalpos = sprposlerp + passposlerp + insposlerp + irposlerp + angpos + local finalang = spranglerp + passanglerp + insanglerp + iranglerp + local dynang = Vector(wpn.dynmove.Ang.x, wpn.dynmove.Ang.y, wpn.dynmove.Ang.z) + dynang.x = dynang.x * wpn.Sway_OffsetPowerAng.x + dynang.y = dynang.y * wpn.Sway_OffsetPowerAng.y + dynang.z = dynang.z * wpn.Sway_OffsetPowerAng.z + finalang = finalang + dynang + + wpn.DynOffsetPos = finalpos + wpn.DynOffsetAng = finalang +end + hook.Add("CalcViewModelView", "DRC_SWEP_Effects", function(wpn, vm, ogpos, ogang, pos, ang) DRCSwepSway(wpn, vm, ogpos, ogang, pos, ang) + DRCSwepOffset(wpn, vm) --[[ if LocalPlayer():GetInfoNum("cl_drc_testvar_0", 0) == 1 then local function Ease(fr, f, t) @@ -844,7 +1336,6 @@ hook.Add("CalcViewModelView", "DRC_SWEP_Effects", function(wpn, vm, ogpos, ogang newpos:Add(ang:Up() * bob.z) end --]] -- return newpos, newang - end) @@ -856,17 +1347,28 @@ concommand.Add("draconic_menu", function() DRCMenu(LocalPlayer()) end) -concommand.Add("draconic_thirdperson_toggle", function() - DRC.CalcView.ThirdPerson.Ang = LocalPlayer():EyeAngles() - DRC.CalcView.ThirdPerson.Ang_Stored = LocalPlayer():EyeAngles() - DRC.CalcView.ThirdPerson.DirectionalAng = LocalPlayer():EyeAngles() - DRC:ThirdPerson_PokeLiveAngle(LocalPlayer()) +local function ToggleThird() + local ply = LocalPlayer() + DRC.CalcView.ThirdPerson.LerpedFinalPos = ply:EyePos() + DRC.CalcView.ThirdPerson.Pos = ply:EyePos() + DRC.CalcView.ThirdPerson.Ang = ply:EyeAngles() + DRC.CalcView.ThirdPerson.Ang_Stored = ply:EyeAngles() + DRC.CalcView.ThirdPerson.DirectionalAng = ply:EyeAngles() + DRC:ThirdPerson_PokeLiveAngle(ply) if GetConVar("cl_drc_thirdperson"):GetFloat() == 0 then RunConsoleCommand("cl_drc_thirdperson", 1) else RunConsoleCommand("cl_drc_thirdperson", 0) end +end + +concommand.Add("draconic_thirdperson", function() + ToggleThird() +end) + +concommand.Add("draconic_thirdperson_toggle", function() + ToggleThird() end) concommand.Add("draconic_thirdperson_swapshoulder", function() @@ -877,6 +1379,11 @@ concommand.Add("draconic_thirdperson_swapshoulder", function() end end) +concommand.Add("draconic_thirdperson_openeditor", function() + local ply = LocalPlayer() + DRC:OpenThirdpersonEditor(ply) +end) + concommand.Add("draconic_firstperson_toggle", function() if GetConVar("cl_drc_experimental_fp"):GetFloat() == 0 then RunConsoleCommand("cl_drc_experimental_fp", 1) @@ -912,7 +1419,9 @@ DRC.Debug = {} local drc_frame = 0 local drc_framesavg = 0 local function drc_DebugUI() - if !LocalPlayer():Alive() then return end + local ply = LocalPlayer() + if !IsValid(ply) then return end + if !ply:Alive() then return end if DRC.SV.drc_allowdebug == 0 then return end if GetConVar("cl_drawhud"):GetFloat() == 0 then return end if GetConVar("cl_drc_debugmode"):GetFloat() == 0 then return end @@ -922,6 +1431,7 @@ local function drc_DebugUI() end local hp, maxhp, ent = DRC:GetShield(LocalPlayer()) + local over = math.Round(DRC:GetOverShield(LocalPlayer()) or 0, 2) local tps = 694201337 if game.SinglePlayer() then @@ -933,7 +1443,7 @@ local function drc_DebugUI() tps = math.floor(tps) drcshieldinterp = Lerp(RealFrameTime() * 25, drcshieldinterp or hp, hp) - draw.DrawText( "Shield: ".. tostring(math.Round(drcshieldinterp)) .."/".. maxhp .."", "TargetID", ScrW() * 0.02, ScrH() * 0.875, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "Shield: ".. tostring(math.Round(drcshieldinterp)) .."/".. maxhp .." +".. over .."", "TargetID", ScrW() * 0.02, ScrH() * 0.875, color_white, TEXT_ALIGN_LEFT ) draw.DrawText( "FPS: ".. drc_framesavg .." | ".. math.Round(1/RealFrameTime()) .."", "TargetID", ScrW() * 0.02, ScrH() * 0.855, color_white, TEXT_ALIGN_LEFT ) draw.DrawText( "TPS: ".. tps .." | ".. math.floor(1/engine.TickInterval()) .."", "TargetID", ScrW() * 0.02, ScrH() * 0.835, color_white, TEXT_ALIGN_LEFT ) @@ -943,11 +1453,29 @@ local function drc_DebugUI() local ammo, maxammo = curswep:Clip1(), curswep:GetMaxClip1() if curswep.Draconic == true then + local vm = draw.DrawText( "".. ammo .."(".. math.Round(curswep:GetNWInt("LoadedAmmo"), 4) ..")/".. maxammo .." | Ammo", "TargetID", ScrW() * 0.975, ScrH() * 0.855, color_white, TEXT_ALIGN_RIGHT ) draw.DrawText( "".. math.Round(curswep:GetHeat(), 4) .."% | Heat", "TargetID", ScrW() * 0.975, ScrH() * 0.855+24, color_white, TEXT_ALIGN_RIGHT ) draw.DrawText( "".. curswep.Category .." - ".. curswep:GetPrintName() .."", "TargetID", ScrW() * 0.975, ScrH() * 0.855-24, color_white, TEXT_ALIGN_RIGHT ) draw.DrawText( "".. curswep.OwnerActivity .."", "TargetID", ScrW() * 0.5, ScrH() * 0.8 + 24, color_white, TEXT_ALIGN_CENTER ) + draw.DrawText( "drc_movement: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_movement"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 48, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "drc_move_x: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_move_x"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 60, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "drc_move_y: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_move_y"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 72, color_white, TEXT_ALIGN_LEFT ) + + draw.DrawText( "drc_ammo: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_ammo"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 94, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "drc_emptymag: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_emptymag"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 106, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "drc_heat: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_heat"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 118, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "drc_battery: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_battery"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 130, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "drc_charge: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_charge"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 142, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "drc_health: ".. math.Round(ply:GetViewModel():GetPoseParameter("drc_health"), 2) .."", "DermaDefault", 32, ScrH() * 0.5 + 166, color_white, TEXT_ALIGN_LEFT ) + + draw.DrawText( "Loading: ".. tostring(curswep.Loading) .."", "DermaDefault", 32, ScrH() * 0.5 + 190, color_white, TEXT_ALIGN_LEFT ) + + draw.DrawText( "Firing Anim: ".. tostring(curswep.PlayingShootAnimation) .."", "DermaDefault", 32, ScrH() * 0.5 + 214, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "Loading Anim: ".. tostring(curswep.PlayingLoadAnimation) .."", "DermaDefault", 32, ScrH() * 0.5 + 226, color_white, TEXT_ALIGN_LEFT ) + draw.DrawText( "Inspect Anim: ".. tostring(curswep:GetNWBool("InspectCamLerp")) .."", "DermaDefault", 32, ScrH() * 0.5 + 238, color_white, TEXT_ALIGN_LEFT ) + local col1 = Color(255, 255, 255, 175) local col2 = Color(255, 255, 255, 75) local posx, posy = ScrW() * 0.94, ScrH() * 0.73 @@ -1047,10 +1575,11 @@ local function drc_TraceInfo() surface.DrawText(tostring("".. hp .." / ".. maxhp .."")) local shp, smhp, sent = DRC:GetShield(ent) + local over = math.Round(DRC:GetOverShield(ent) or 0, 2) if IsValid(sent) then surface.SetTextPos(pos.x - pos.x/2.6, pos.y + 32) surface.SetTextColor(0, 200, 255) - surface.DrawText(tostring("".. math.Round(shp) .." / ".. smhp .."")) + surface.DrawText(tostring("".. math.Round(shp) .." / ".. smhp .." +".. over .."")) end end @@ -1251,6 +1780,16 @@ hook.Add("PostDrawTranslucentRenderables", "drc_DebugStuff", function() end end) +hook.Add("PostDrawTranslucentRenderables", "DRC_LightVolumeRendering", function() + if GetConVar("cl_drc_debugmode"):GetFloat() > 0 && GetConVar("cl_drc_debug_lights"):GetFloat() == 1 && DRC:DebugModeAllowed() then + for k,v in pairs(DRC.VolumeLights) do + local pos, ang, length, width, col, ent, light = v[1], v[2], v[3], v[4]*10, v[5], v[6], v[7] + if light.AddAng then ang = ang + light.AddAng end + render.DrawWireframeBox(pos, ang, Vector(0, width, width), Vector(length, -width, -width), Color(col.r, col.g, col.b, 1), true) + end + end +end) + net.Receive("DRC_RenderTrace", function() local tbl = net.ReadTable() if !tbl then return end @@ -1260,6 +1799,15 @@ net.Receive("DRC_RenderTrace", function() DRC:RenderTrace(tr, colour, thyme) end) +net.Receive("DRC_RenderSphere", function() + local tbl = net.ReadTable() + if !tbl then return end + local origin, radius, colour, thyme = tbl[1], tbl[2], tbl[3], tbl[4] + if isstring(colour) then colour = DRC.Cols[colour] end + + DRC:RenderSphere(origin, radius, colour, thyme) +end) + function DRC:RenderTrace(tr, colour, thyme) if GetConVar("cl_drc_debug_tracelines"):GetFloat() != 1 then return end if !tr then return end @@ -1270,6 +1818,30 @@ function DRC:RenderTrace(tr, colour, thyme) timer.Simple(thyme, function() DRC.Debug.TraceLines[id] = nil end) end +function DRC:RenderSphere(origin, radius, colour, thyme) + if DRC:DebugModeAllowed() && GetConVar("cl_drc_debugmode"):GetFloat() != 1 then return end + if !DRC:DebugModeAllowed() then return end + radius = radius*0.19 + + if !gui.IsGameUIVisible() then + local csent1 = ClientsideModel("models/dav0r/hoverball.mdl") + local csent2 = ClientsideModel("models/dav0r/hoverball.mdl") + csent1:SetMaterial("models/wireframe") + csent2:SetMaterial("models/debug/debugwhite") + csent1:SetPos(origin) + csent2:SetPos(origin) + csent1:SetRenderMode(RENDERMODE_TRANSCOLOR) + csent2:SetRenderMode(RENDERMODE_TRANSCOLOR) + csent1:SetColor(colour) + csent2:SetColor(colour) + csent1:SetModelScale(radius) + csent2:SetModelScale(radius) + csent1:Spawn() + csent2:Spawn() + timer.Simple(thyme, function() csent1:Remove() csent2:Remove() end) + end +end + function DRC:IDLight(pos, colour, size, colmul, thyme) if GetConVar("cl_drc_debug_lights"):GetFloat() != 1 then return end local id = math.Round(math.Rand(1, 999999999)) diff --git a/lua/draconic/cl/menu.lua b/lua/draconic/cl/menu.lua index 4bc84b3..0e008b3 100644 --- a/lua/draconic/cl/menu.lua +++ b/lua/draconic/cl/menu.lua @@ -8,31 +8,27 @@ local function GreyOut(element) element.GreyOut:SetBackgroundColor(Color(127,127,127,127)) end +local ind = { + [1]=32, + [2]=48, + [3]=64, + [4]=72, + [5]=94, + [6]=128, +} function DRCMenu( player ) - local ply = player + local ply = player local VSelection = ply:GetNWString("DRCVoiceSet") local FSelection = ply:GetNWString("DRCFootsteps") - local Customization, TweakMode = DRC:GetCustomizationAllowed() - + local Customization, TweakMode = true, 0 + Customization, TweakMode = DRC:GetCustomizationAllowed() + local usekey = string.upper(ReturnKey("+use")) local m1key = string.upper(ReturnKey("+attack")) local m2key = string.upper(ReturnKey("+attack2")) - local m3key = string.upper(ReturnKey("+attack3")) local sprintkey = string.upper(ReturnKey("+speed")) - local duckkey = string.upper(ReturnKey("+duck")) - local jumpkey = string.upper(ReturnKey("+jump")) local reloadkey = string.upper(ReturnKey("+reload")) local forwkey = string.upper(ReturnKey("+forward")) - local alt1key = string.upper(ReturnKey("+alt1")) - local alt2key = string.upper(ReturnKey("+alt2")) - - local w2 = ScrW()/2 - local leftwide = w2 - local leftwidehalf = leftwide / 2 - - local h2 = ScrH() - local topwide = h2 - local topwidehalf = topwide / 2 local TextCol = Color(220, 220, 220, 255) local SubtextCol = Color(170, 170, 170, 255) @@ -54,58 +50,120 @@ function DRCMenu( player ) draw.RoundedBox(5, 0, 0, 16, 16, Color(157,161,165)) end end - - local Derma = vgui.Create("DFrame") - Derma:SetPos( leftwidehalf/1.25, topwidehalf/4 ) - Derma:SetSize( 1200, 720) - Derma:SetTitle("Draconic Menu") + + local Derma = vgui.Create("DFrame") + Derma:SetSize(1200, 720) + Derma:SetMinWidth(1200) + Derma:SetMinHeight(720) + Derma:SetSizable(false) + Derma:SetTitle("Draconic Menu") Derma:SetIcon("icon16/draconic_base.png") Derma:MakePopup() + Derma:SetDraggable(true) Derma:SetBackgroundBlur(true) Derma:SetScreenLock(false) - Derma.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 200)) - end + Derma:ShowCloseButton(true) + Derma:Center() + Derma:SetVisible(true) + Derma.Paint = function(self, w, h) + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 200)) + end local windowwide = Derma:GetWide() local windowtall = Derma:GetTall() + local windowwidehalf = windowwide * 0.5 + + local function RefreshIcons(isfullscreen, exactoverride) + local size = GetConVar("cl_drc_menu_iconsize"):GetInt() + if isfullscreen then size = GetConVar("cl_drc_menu_iconsize_fullscreen"):GetInt() end + if exactoverride then size = exactoverride end + + for k,v in pairs(Derma.PlayerModels:GetItems()) do + v:SetSize(ind[size],ind[size]) + end + for k,v in pairs(Derma.PlayerModels_Hands:GetItems()) do + v:SetSize(ind[size],ind[size]) + end + Derma.PlayerModels:InvalidateLayout() + Derma.PlayerModels_Hands:InvalidateLayout() + end - local mainframe = vgui.Create("DPanel", Derma) + timer.Simple(0.1, function() + RefreshIcons() + end) + + local maximized = false + Derma.btnMaxim:SetEnabled( true ) + Derma.btnMaxim.DoClick = function() + if maximized == false then + Derma:SetSize(ScrW(), ScrH()) + Derma:Center() + Derma:SetDraggable(false) + maximized = true + + Derma.PlayerFrame1:SetWide(ScrW()*0.5) + Derma.PlayerApplyButton:SetPos(Derma.PlayerFrame1:GetWide()*0.5 - 64,10) + local spraymax = math.Clamp(windowwidehalf, windowwidehalf, 1024) + Derma.SprayPreview:SetSize(spraymax, spraymax) + Derma.SprayPreview:Dock(NODOCK) + + RefreshIcons(true) + elseif maximized == true then + Derma:SetSize(1200,720) + Derma:Center() + Derma:SetDraggable(true) + maximized = false + + Derma.PlayerFrame1:SetWide(windowwide*0.5) + Derma.PlayerApplyButton:SetPos(230,10) + Derma.SprayPreview:SetSize(320, 320) + Derma.SprayPreview:Dock(FILL) + + RefreshIcons(false) + end + end + + Derma.mainframe = vgui.Create("DPanel", Derma) + local mainframe = Derma.mainframe mainframe:Dock(FILL) mainframe:DockMargin(0, 0, 0, 0) mainframe:DockPadding(0, 0, 0, 0) mainframe:SetPaintBackground(false) - local maintabs = vgui.Create( "DPropertySheet", mainframe ) + Derma.maintabs = vgui.Create( "DPropertySheet", mainframe ) + local maintabs = Derma.maintabs maintabs:Dock(FILL) maintabs:DockMargin(0, 0, 0, 0) maintabs:DockPadding(0, 0, 0, 0) maintabs:SetPadding(0) maintabs.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end - local mt1 = vgui.Create( "DPanel", maintabs ) + mainframe.maintabs = vgui.Create( "DPanel", maintabs ) + local mt1 = mainframe.maintabs mt1:DockMargin(0, 0, 0, 0) mt1:DockPadding(0, 0, 0, 0) mt1:SetBackgroundColor(Color(255, 255, 255, 0)) maintabs:AddSheet( "Player Representation", mt1, "icon16/user.png") - - local frame = vgui.Create("DPanel", mt1) - frame:SetSize(590, 658) + + Derma.PlayerFrame1 = vgui.Create("DPanel", mt1) + local frame = Derma.PlayerFrame1 + frame:SetWide(windowwide*0.5) frame:Dock(LEFT) frame:DockPadding(0, 0, 0, 0) --- frame:SetSize(512, topwide/1.5-24) - frame:SetBackgroundColor(Color(255, 255, 255, 5)) - - local frame2 = vgui.Create("DPanel", mt1) - frame2:SetPos(windowwide/2, 0) - frame2:SetWide(windowwide/2) - frame2:Dock(RIGHT) +-- frame:SetSize(512, topwide/1.5-24) + frame:SetBackgroundColor(Color(255, 255, 255, 5)) + + Derma.PlayerFrame2 = vgui.Create("DPanel", mt1) + local frame2 = Derma.PlayerFrame2 + frame2:SetPos(windowwide*0.5, 0) + frame2:SetWide(windowwide*0.5) + frame2:Dock(FILL) frame2:DockPadding(0, 0, 0, 0) -- frame2:SetSize(leftwide*1.25/2, topwide/1.5-54) frame2:SetBackgroundColor(Color(255, 255, 255, 15)) - + local MapAmbient = render.GetAmbientLightColor() * 255 MapAmbient.r = math.Clamp(MapAmbient.r, 35, 255) MapAmbient.g = math.Clamp(MapAmbient.g, 35, 255) @@ -113,14 +171,16 @@ function DRCMenu( player ) local LocalAmbient = render.GetLightColor(LocalPlayer():EyePos()) * 255 local PreviewAmbient = Color((MapAmbient.r + LocalAmbient.r), (MapAmbient.g + LocalAmbient.g), (MapAmbient.b + LocalAmbient.b), 255) - local bg = vgui.Create("DImage", frame) + Derma.PlayerBG = vgui.Create("DImage", frame) + local bg = Derma.PlayerBG bg:SetPos(0, 0) bg:Dock(FILL) bg:SetSize(589, 658) -- bg:SetImage("vgui/drc_playerbg") bg:SetZPos(-10) - local bgloading = vgui.Create("DImage", frame) + Derma.PlayerLoading = vgui.Create("DImage", frame) + local bgloading = Derma.PlayerLoading bgloading:SetPos(0, 0) bgloading:Dock(FILL) bgloading:SetSize(589, 658) @@ -129,6 +189,7 @@ function DRCMenu( player ) bgloading:SetVisible(false) frame.tools = vgui.Create("DPanel", frame) + Derma.PlayerTools = frame.tools frame.tools:SetSize(590,666) frame.tools:Dock(FILL) frame.tools:SetVisible(false) @@ -146,12 +207,13 @@ function DRCMenu( player ) MapAmbient.b = math.Clamp(MapAmbient.b, 127, 255) frame.previewfloor = vgui.Create("DAdjustableModelPanel", frame) - frame.previewfloor:SetSize(590,680) - frame.previewfloor:SetPos(0, 0) - frame.previewfloor:SetFOV(47) +-- frame.previewfloor:SetSize(590,680) + frame.previewfloor:Dock(FILL) + frame.previewfloor:SetPos(0, 0) + frame.previewfloor:SetFOV(47) frame.previewfloor:SetModel("models/props_phx/construct/glass/glass_angle360.mdl") frame.previewfloor:SetAnimated( true ) - frame.previewfloor:SetAnimationEnabled(true) + frame.previewfloor:SetAnimationEnabled(true) frame.previewfloor:SetAmbientLight(MapAmbient) frame.previewfloor:SetDirectionalLight(BOX_TOP, MapAmbient*2) frame.previewfloor:SetDirectionalLight(BOX_FRONT, MapAmbient*1.5) @@ -162,13 +224,14 @@ function DRCMenu( player ) frame.previewfloor:SetLookAng(Angle(10.278, 203.334, 0)) frame.previewfloor:SetCamPos(Vector(80.69, 36.7, 52.02)) - frame.preview = vgui.Create("DAdjustableModelPanel", frame) - frame.preview:SetSize(589,666) - frame.preview:SetPos(0, 0) - frame.preview:SetFOV(47) + frame.preview = vgui.Create("DAdjustableModelPanel", frame) +-- frame.preview:SetSize(589,666) + frame.preview:SetPos(0, 0) + frame.preview:Dock(FILL) + frame.preview:SetFOV(47) frame.preview:SetModel(tostring(pmodelname)) frame.preview:SetAnimated( true ) - frame.preview:SetAnimationEnabled(true) + frame.preview:SetAnimationEnabled(true) frame.preview:SetAmbientLight(MapAmbient) frame.preview:SetDirectionalLight(BOX_TOP, MapAmbient*2) frame.preview:SetDirectionalLight(BOX_FRONT, MapAmbient*1.5) @@ -209,13 +272,13 @@ function DRCMenu( player ) ent.Preview = true DRC.PlayermodelMenuEnt = ent frame.preview:SetFOV(math.Clamp(frame.preview:GetFOV(), 10, 100)) - local idle = ent:SelectWeightedSequence(ACT_HL2MP_IDLE) + if !ent.SelectedIdle then ent.SelectedIdle = ent:SelectWeightedSequence(ACT_HL2MP_IDLE) end if ent:LookupSequence("drc_menu") != -1 then ent:SetSequence("drc_menu") elseif ent:LookupSequence("drc_menu_xdr_default") != -1 then ent:SetSequence("drc_menu_xdr_default") else - ent:SetSequence(idle) + ent:SetSequence(ent.SelectedIdle) end ent.BGNum = 0 @@ -259,7 +322,7 @@ function DRCMenu( player ) frame.previewfloor:SetFOV(frame.preview:GetFOV()) frame.previewfloor:GetEntity():SetParent(frame.preview:GetEntity()) frame.previewfloor:GetEntity():AddEffects(EF_BONEMERGE) - end + end function frame.previewfloor:LayoutEntity(ent) ent:SetLOD(0) @@ -272,8 +335,10 @@ function DRCMenu( player ) bottompanel:SetPos(0,frame.preview:GetTall() - 50) bottompanel:SetSize(frame.preview:GetWide(), 50) bottompanel:SetBackgroundColor(Color(0, 0, 0, 50)) + bottompanel:Dock(BOTTOM) - local applybutton = vgui.Create("DButton", bottompanel) + Derma.PlayerApplyButton = vgui.Create("DButton", bottompanel) + local applybutton = Derma.PlayerApplyButton applybutton:SetText("Apply Changes") applybutton:SetPos(230,10) applybutton:SetSize(128, 32) @@ -288,9 +353,11 @@ function DRCMenu( player ) end end - local hint = vgui.Create("DButton", frame) + local hint = vgui.Create("DButton", bottompanel) hint:SetText("Controls") hint:SetPos(frame.preview:GetWide() - 80,frame.preview:GetTall() - 42) + hint:Dock(RIGHT) + hint:DockMargin(6, 6, 6, 6) hint:SetSize(64, 32) hint:SetTextColor(color_white) hint:SetContentAlignment(5) @@ -610,45 +677,66 @@ function DRCMenu( player ) tabs:SetPadding(0) tabs:DockPadding(0, 0, 0, 0) tabs.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end local tab1 = vgui.Create("DPropertySheet", tabs) tab1:SetPadding(0) tab1:DockPadding(0, 0, 0, 0) - tabs:AddSheet( "Player", tab1, "icon16/user.png") tab1.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end function tab1:OnActiveTabChanged(old, new) local mode = new:GetText() end + if Customization == true then + tabs:AddSheet( "Player", tab1, "icon16/user.png") + else + tab1:SetVisible(false) + end + local tab1PMs = vgui.Create( "DPanel", tab1 ) tab1PMs:DockPadding(0, 0, 0, 0) tab1PMs:SetBackgroundColor( Color(245, 245, 245, 0) ) - tab1:AddSheet( "Playermodels", tab1PMs, "icon16/folder_user.png") + if TweakMode < 1 && Customization == true then + tab1:AddSheet( "Playermodels", tab1PMs, "icon16/folder_user.png") + else + tab1PMs:SetVisible(false) + end tab1.tab1Hands = vgui.Create( "DPanel", tab1 ) tab1.tab1Hands:DockPadding(0, 0, 0, 0) tab1.tab1Hands:SetBackgroundColor( Color(245, 245, 245, 0) ) - tab1:AddSheet( "Hands", tab1.tab1Hands, "icon16/folder_page.png") + if TweakMode < 1 && Customization == true then + tab1:AddSheet( "Hands", tab1.tab1Hands, "icon16/folder_page.png") + else + tab1.tab1Hands:SetVisible(false) + end local tab2 = vgui.Create( "DPanel", tab1 ) tab2:SetBackgroundColor( Color(255, 255, 255, 255) ) - tab1:AddSheet( "Colours", tab2, "icon16/color_wheel.png" ) + if TweakMode != 3 && Customization == true then + tab1:AddSheet( "Colours", tab2, "icon16/color_wheel.png" ) + else + tab2:SetVisible(false) + end + local t3c = vgui.Create( "DPanel", tab1 ) t3c:SetBackgroundColor( Color(0, 0, 0, 0) ) t3c:SetPos(-200, 0) - local t3p = t3c:Add( "DPanelList" ) - t3p:DockPadding( 32, 8, 8, 8 ) - t3p:EnableVerticalScrollbar( true ) - t3p:Dock(FILL) - - local tab3 = tab1:AddSheet( "#smwidget.bodygroups", t3p, "icon16/cog.png" ) + local tab3 = t3c:Add( "DPanelList" ) + tab3:DockPadding( 32, 8, 8, 8 ) + tab3:EnableVerticalScrollbar( true ) + tab3:Dock(FILL) + if TweakMode != 2 && Customization == true then + tab1:AddSheet( "#smwidget.bodygroups", tab3, "icon16/cog.png" ) + else + tab3:SetVisible(false) + end local modelListPnl = tab1PMs:Add( "DPanel" ) modelListPnl:DockPadding( 8, 0, 8, 0 ) @@ -661,12 +749,13 @@ function DRCMenu( player ) SearchBar:SetUpdateOnType( true ) SearchBar:SetPlaceholderText( "#spawnmenu.quick_filter" ) - local PanelSelect = modelListPnl:Add( "DPanelSelect" ) + Derma.PlayerModels = modelListPnl:Add( "DPanelSelect" ) + local PanelSelect = Derma.PlayerModels PanelSelect:Dock(FILL) PanelSelect:SetBackgroundColor(Color(0, 0, 0, 0)) PanelSelect.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end local arms = { ["c_"] = "c_", @@ -742,7 +831,8 @@ function DRCMenu( player ) modelListPnl_Hands:Dock(FILL) modelListPnl_Hands:SetBackgroundColor(Color(0, 0, 0, 0)) - local PanelSelect_Hands = modelListPnl_Hands:Add( "DPanelSelect" ) + Derma.PlayerModels_Hands = modelListPnl_Hands:Add( "DPanelSelect" ) + local PanelSelect_Hands = Derma.PlayerModels_Hands PanelSelect_Hands:Dock(FILL) PanelSelect_Hands:SetBackgroundColor(Color(0, 0, 0, 0)) PanelSelect_Hands.Paint = function(self, w, h) @@ -819,7 +909,7 @@ function DRCMenu( player ) end end - local ScrollPrim = vgui.Create("DPanel", tab2) + local ScrollPrim = vgui.Create("DPanel", tab2) ScrollPrim:SetPos(0, 0) ScrollPrim:Dock(FILL) ScrollPrim:DockMargin(0, 0, 4, 4) @@ -828,19 +918,19 @@ function DRCMenu( player ) local row1 = vgui.Create("DPanel", ScrollPrim) row1:Dock(TOP) row1:DockMargin(4, 4, 0, 0) - row1:SetSize(windowwide/2, windowtall/3.75 ) + row1:SetSize(windowwide*0.5, windowtall/3.75 ) row1:SetBackgroundColor(Color(255, 255, 255, 0)) local row2 = vgui.Create("DPanel", ScrollPrim) row2:Dock(TOP) row2:DockMargin(4, 4, 0, 0) - row2:SetSize(windowwide/2, windowtall/3.75 ) + row2:SetSize(windowwide*0.5, windowtall/3.75 ) row2:SetBackgroundColor(Color(255, 255, 255, 0)) local row3 = vgui.Create("DPanel", ScrollPrim) row3:Dock(TOP) row3:DockMargin(4, 4, 0, 0) - row3:SetSize(windowwide/2, windowtall/3.75 ) + row3:SetSize(windowwide*0.5, windowtall/3.75 ) row3:SetBackgroundColor(Color(255, 255, 255, 0)) @@ -1081,8 +1171,8 @@ function DRCMenu( player ) local tab5 = vgui.Create( "DPropertySheet", tabs ) tab5:DockPadding(0, 0, 0, 0) tab5.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(234, 234, 234, 255)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(234, 234, 234, 255)) + end tabs:AddSheet( "Extra", tab5, "icon16/draconic_base.png" ) tab5.SpraySettings = vgui.Create( "DPanel", tab1 ) @@ -1150,6 +1240,7 @@ function DRCMenu( player ) SpraypreviewText:Dock(TOP) local Spraypreview = vgui.Create("DImage", tab5.SpraySettings) + Derma.SprayPreview = Spraypreview Spraypreview:SetPos(8, 115) Spraypreview:SetSize(320, 320) Spraypreview:SetImageColor(Color(255, 255, 255, 255)) @@ -1432,13 +1523,14 @@ function DRCMenu( player ) end local function RebuildBodygroupTab() - t3p:Clear() + tab3:Clear() + if !IsValid(tab3) then return end -- tab3.Tab:SetVisible( false ) local nskins = frame.preview.Entity:SkinCount() - 1 if ( nskins > 0 ) then - local skins = vgui.Create( "DNumSlider", t3p ) + local skins = vgui.Create( "DNumSlider", tab3 ) skins:Dock( TOP ) skins:SetText( "Skin" ) skins:SetDark( true ) @@ -1449,11 +1541,11 @@ function DRCMenu( player ) skins.type = "skin" skins.OnValueChanged = UpdateBodyGroups - t3p:AddItem( skins ) + tab3:AddItem( skins ) frame.preview.Entity:SetSkin( GetConVarNumber( "cl_playerskin" ) ) - tab3.Tab:SetVisible( true ) + if tab3.Tab then tab3.Tab:SetVisible( true ) end end local groups = string.Explode( " ", GetConVarString( "cl_playerbodygroups" ) ) @@ -1472,11 +1564,11 @@ function DRCMenu( player ) bgroup:SetValue( groups[ k + 1 ] or 0 ) bgroup.OnValueChanged = UpdateBodyGroups - t3p:AddItem( bgroup ) + tab3:AddItem( bgroup ) frame.preview.Entity:SetBodygroup( k, groups[ k + 1 ] or 0 ) - tab3.Tab:SetVisible( true ) + if tab3.Tab then tab3.Tab:SetVisible( true ) end end tabs.tabScroller:InvalidateLayout() @@ -1515,6 +1607,7 @@ function DRCMenu( player ) SetupScene(name) RunConsoleCommand( "cl_playerbodygroups", "0" ) RunConsoleCommand( "cl_playerskin", "0" ) + frame.preview.Entity.SelectedIdle = nil end timer.Simple(0.1, function() if !table.IsEmpty(DRC.CurrentSpecialModelOptions) && table.HasValue(DRC.CurrentSpecialModelOptions, name) then @@ -1862,7 +1955,7 @@ function DRCMenu( player ) -- GreyOut(tab5.VoiceSetSettings) if TweakMode == 1 then - tab1PMs:Remove() + -- tab1PMs:Remove() for k,v in pairs(tab1:GetItems()) do if v.Name == "Playermodels" then tab1:CloseTab(v.Tab) end end @@ -1877,29 +1970,13 @@ function DRCMenu( player ) end tab1:SetActiveTab(tab1:GetItems()[1].Tab) - elseif Customization == false then - for k,v in pairs(tabs:GetItems()) do - if v.Name == "Player" then - tabs:CloseTab(v.Tab) - elseif v.Name == "Saved Avatars" then - tabs:CloseTab(v.Tab) - elseif v.Name == "Colours" then - tabs:CloseTab(v.Tab) - elseif v.Name == "#smwidget.bodygroups" then - tabs:CloseTab(v.Tab) - end - end - tab1:Remove() - tab2:Remove() - tab4:Remove() - tab5.VoiceSetSettings:Remove() end RefreshAvatars() local mt2 = vgui.Create( "DPanel", maintabs ) mt2:SetBackgroundColor(Color(255, 255, 255, 5)) - maintabs:AddSheet( "Settings", mt2, "icon16/wrench.png") + maintabs:AddSheet( "Settings & Tools", mt2, "icon16/wrench.png") local t2frame = vgui.Create("DPanel", mt2) t2frame:SetBackgroundColor(Color(255, 255, 255, 5)) @@ -1909,36 +1986,36 @@ function DRCMenu( player ) t2tabs:Dock(FILL) t2tabs:SetPadding(0) t2tabs.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end local controls = vgui.Create( "DPanel", t2tabs) controls:Dock(RIGHT) controls:SetSize(320) controls.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) + end local CTitle = vgui.Create( "DPanel", controls ) CTitle:Dock(TOP) CTitle:SetSize(320, 50) CTitle.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) + end local controls1 = vgui.Create( "DPanel", controls ) controls1:Dock(LEFT) controls1:SetSize(160) controls1.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) + end local controls2 = vgui.Create( "DPanel", controls ) controls2:Dock(LEFT) controls2:SetSize(160) controls2.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 127)) + end local ControlsTitle = vgui.Create( "DLabel", CTitle) ControlsTitle:SetText("Controls List") @@ -1965,8 +2042,8 @@ function DRCMenu( player ) local t2tab1 = vgui.Create( "DPanel" ) t2tab1:Dock(FILL) t2tab1.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end t2tabs:AddSheet( "Client Settings", t2tab1, "icon16/wrench_orange.png") local AccessibilityTitle = vgui.Create( "DLabel", t2tab1) @@ -2112,31 +2189,59 @@ function DRCMenu( player ) MakeHint(t2tab1, 4, 355, "(Default 1) Scales the torso depth down for Experimental First Person, for playermodels with large geoemtry which can get in the way of aiming.") - local DrcThirdperson = vgui.Create( "DCheckBoxLabel", t2tab1 ) - DrcThirdperson:SetPos(25, 75) - DrcThirdperson:SetSize(500, 20) - DrcThirdperson:SetText( "Enable Draconic Thirdperson*" ) - DrcThirdperson:SetConVar( "cl_drc_thirdperson" ) - DrcThirdperson.Label:SetColor(TextCol) - DrcThirdperson:SetEnabled(true) + local PlayermodelSpawnIconSize = vgui.Create( "DLabel", t2tab1) + PlayermodelSpawnIconSize:SetPos(25, 400) + PlayermodelSpawnIconSize:SetSize(200, 20) + PlayermodelSpawnIconSize:SetText("Playermodel Selector Icon Size:") + PlayermodelSpawnIconSize:SetColor(TextCol) + + local PlayermodelSpawnIconSizeCombo = vgui.Create( "DComboBox", t2tab1 ) + PlayermodelSpawnIconSizeCombo:SetSortItems(false) + PlayermodelSpawnIconSizeCombo:SetPos(180, 400) + PlayermodelSpawnIconSizeCombo:SetSize(150, 20) + PlayermodelSpawnIconSizeCombo:SetConVar( "cl_drc_menu_iconsize" ) + PlayermodelSpawnIconSizeCombo:AddChoice("32x32", 1) + PlayermodelSpawnIconSizeCombo:AddChoice("48x48", 2) + PlayermodelSpawnIconSizeCombo:AddChoice("64x64 (default)", 3) + PlayermodelSpawnIconSizeCombo:AddChoice("96x96", 4) + PlayermodelSpawnIconSizeCombo:AddChoice("128x128", 5) + function PlayermodelSpawnIconSizeCombo:OnSelect(index, value, data) + index = math.Round(index) + RunConsoleCommand("cl_drc_menu_iconsize", index) + if !maximized then RefreshIcons(false, index) end + end - local DrcThirdperson_Dyn = vgui.Create( "DCheckBoxLabel", t2tab1 ) - DrcThirdperson_Dyn:SetPos(25, 95) - DrcThirdperson_Dyn:SetSize(500, 20) - DrcThirdperson_Dyn:SetText( "Disable Thirdperson Free-look" ) - DrcThirdperson_Dyn:SetConVar( "cl_drc_thirdperson_disable_freelook" ) - DrcThirdperson_Dyn.Label:SetColor(TextCol) - DrcThirdperson_Dyn:SetEnabled(true) + local PlayermodelSpawnIconSizeFullscreen = vgui.Create( "DLabel", t2tab1) + PlayermodelSpawnIconSizeFullscreen:SetPos(25, 420) + PlayermodelSpawnIconSizeFullscreen:SetSize(200, 20) + PlayermodelSpawnIconSizeFullscreen:SetText("Selector Fullscreen Icon Size:") + PlayermodelSpawnIconSizeFullscreen:SetColor(TextCol) + + local PlayermodelSpawnIconSizeComboFullscreen = vgui.Create( "DComboBox", t2tab1 ) + PlayermodelSpawnIconSizeComboFullscreen:SetSortItems(false) + PlayermodelSpawnIconSizeComboFullscreen:SetPos(180, 420) + PlayermodelSpawnIconSizeComboFullscreen:SetSize(150, 20) + PlayermodelSpawnIconSizeComboFullscreen:SetConVar( "cl_drc_menu_iconsize_fullscreen" ) + PlayermodelSpawnIconSizeComboFullscreen:AddChoice("32x32", 1) + PlayermodelSpawnIconSizeComboFullscreen:AddChoice("48x48", 2) + PlayermodelSpawnIconSizeComboFullscreen:AddChoice("64x64 (default)", 3) + PlayermodelSpawnIconSizeComboFullscreen:AddChoice("96x96", 4) + PlayermodelSpawnIconSizeComboFullscreen:AddChoice("128x128", 5) + function PlayermodelSpawnIconSizeComboFullscreen:OnSelect(index, value, data) + index = math.Round(index) + RunConsoleCommand("cl_drc_menu_iconsize_fullscreen", index) + if maximized then RefreshIcons(true, index) end + end local DrcExperimentalFP = vgui.Create( "DCheckBoxLabel", t2tab1 ) - DrcExperimentalFP:SetPos(25, 115) + DrcExperimentalFP:SetPos(25, 75) DrcExperimentalFP:SetSize(500, 20) DrcExperimentalFP:SetText( "Enable ''Experimental First Person'' mode" ) DrcExperimentalFP:SetConVar( "cl_drc_experimental_fp" ) DrcExperimentalFP.Label:SetColor(TextCol) DrcExperimentalFP:SetEnabled(true) - MakeHint(t2tab1, 4, 115, "<< Work in Progress Feature >>\n\n''Experimental First Person'' is a true full-body first person camera system which still utilizes the player's viewmodel.\n\nEFP Does:\n> Show your body in first person, accurate to how it is seen in third-person.\n> Show your character's arms when in a vehicle\n> Add a small amount of viewbobbing based on your character's head\n> Still uses the player's viewmodel, allowing you to see your weapon properly as intended by its creators.\n\nEFP Does NOT:\n> Change the aiming angle to match the new camera position (yet)\n\nCurrent known issues:\n> Body desyncs when game is paused in singleplayer") + MakeHint(t2tab1, 4, 75, "<< Work in Progress Feature >>\n\n''Experimental First Person'' is a true full-body first person camera system which still utilizes the player's viewmodel.\n\nEFP Does:\n> Show your body in first person, accurate to how it is seen in third-person.\n> Show your character's arms when in a vehicle\n> Add a small amount of viewbobbing based on your character's head\n> Still uses the player's viewmodel, allowing you to see your weapon properly as intended by its creators.\n\nEFP Does NOT:\n> Change the aiming angle to match the new camera position (yet)\n\nCurrent known issues:\n> Body desyncs when game is paused in singleplayer") local VMOX = vgui.Create( "DNumSlider", t2tab1 ) VMOX:SetPos(25, 240) @@ -2174,175 +2279,169 @@ function DRCMenu( player ) local t2tab2 = vgui.Create( "DPanel" ) t2tab2:Dock(FILL) t2tab2.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end t2tabs:AddSheet( "Server Settings", t2tab2, "icon16/wrench.png") - local DrcMovement = vgui.Create( "DCheckBoxLabel", t2tab2 ) - DrcMovement:SetPos(25, 15) - DrcMovement:SetSize(20, 20) - DrcMovement:SetText( "Draconic SWEP movement speed overrides" ) - DrcMovement:SetConVar( "sv_drc_movement" ) - DrcMovement.Label:SetColor(TextCol) - - local DrcMoveSounds = vgui.Create( "DCheckBoxLabel", t2tab2 ) - DrcMoveSounds:SetPos(25, 35) - DrcMoveSounds:SetSize(20, 20) - DrcMoveSounds:SetText( "Draconic SWEP movement sounds" ) - DrcMoveSounds:SetConVar( "sv_drc_movesounds" ) - DrcMoveSounds.Label:SetColor(TextCol) - - local DrcInspections = vgui.Create( "DCheckBoxLabel", t2tab2 ) - DrcInspections:SetPos(25, 55) - DrcInspections:SetSize(20, 20) - DrcInspections:SetText( "Draconic SWEP Inspection Menu" ) - DrcInspections:SetConVar( "sv_drc_inspections" ) - DrcInspections.Label:SetColor(TextCol) - - local DrcPassive = vgui.Create( "DCheckBoxLabel", t2tab2 ) - DrcPassive:SetPos(25, 75) - DrcPassive:SetSize(20, 20) - DrcPassive:SetText( "Draconic SWEP Passives" ) - DrcPassive:SetConVar( "sv_drc_passives" ) - DrcPassive.Label:SetColor(TextCol) - - local DrcSprintOverride = vgui.Create( "DCheckBoxLabel", t2tab2 ) - DrcSprintOverride:SetPos(25, 95) - DrcSprintOverride:SetSize(20, 20) - DrcSprintOverride:SetText( "All Draconic weapons use passive sprint" ) - DrcSprintOverride:SetConVar( "sv_drc_force_sprint" ) - DrcSprintOverride.Label:SetColor(TextCol) - - local SvThirdperson = vgui.Create( "DCheckBoxLabel", t2tab2 ) - SvThirdperson:SetPos(25, 115) - SvThirdperson:SetSize(20, 20) - SvThirdperson:SetText( "Disable access to Draconic's thirdperson system" ) - SvThirdperson:SetConVar( "sv_drc_disable_thirdperson" ) - SvThirdperson.Label:SetColor(TextCol) - - MakeHint(t2tab2, 4, 115, "Draconic SWEPs which require thirdperson will still use Draconic thirdperson regardless of this setting.") - - local SvFreecam = vgui.Create( "DCheckBoxLabel", t2tab2 ) - SvFreecam:SetPos(25, 135) - SvFreecam:SetSize(20, 20) - SvFreecam:SetText( "Disable Draconic thirdperson's freecam system globally" ) - SvFreecam:SetConVar( "sv_drc_disable_thirdperson_freelook" ) - SvFreecam.Label:SetColor(TextCol) - - t2tab2.SoundStretch = vgui.Create( "DCheckBoxLabel", t2tab2 ) - t2tab2.SoundStretch:SetPos(25, 155) - t2tab2.SoundStretch:SetSize(20, 20) - t2tab2.SoundStretch:SetText( "Disable host_timescale sound alteration" ) - t2tab2.SoundStretch:SetConVar( "sv_drc_soundtime_disabled" ) - t2tab2.SoundStretch.Label:SetColor(TextCol) - - MakeHint(t2tab2.SoundStretch, 300, 0, "Enabling this setting will make it so sounds do not slow down/speed up when host_timescale changes are in effect.") - - local DiffSetting = vgui.Create( "DLabel", t2tab2) - DiffSetting:SetPos(400, 15) - DiffSetting:SetSize(100, 20) - DiffSetting:SetText("HL2 Difficulty:") - DiffSetting:SetColor(TextCol) - - local HL2Diff = vgui.Create( "DComboBox", t2tab2 ) - HL2Diff:SetSortItems(false) - HL2Diff:SetPos(500, 15) - HL2Diff:SetSize(150, 20) - HL2Diff:SetConVar( "skill" ) - HL2Diff:AddChoice("Easy", 1) - HL2Diff:AddChoice("Medium", 2) - HL2Diff:AddChoice("Hard", 3) - function HL2Diff:OnSelect(index, value, data) - LocalPlayer():ConCommand("skill ".. index .."") - end - - local DiffDescE = vgui.Create( "DLabel", t2tab2) - DiffDescE:SetPos(400, 35) - DiffDescE:SetSize(w2, 20) - DiffDescE:SetText("Easy: ".. GetConVarNumber("sk_dmg_inflict_scale1") * 100 .."% damage dealt, ".. GetConVarNumber("sk_dmg_take_scale1") * 100 .."% damage taken.") - DiffDescE:SetColor(SubtextCol) - - local DiffDescM = vgui.Create( "DLabel", t2tab2) - DiffDescM:SetPos(400, 55) - DiffDescM:SetSize(w2, 20) - DiffDescM:SetText("Medium: ".. GetConVarNumber("sk_dmg_inflict_scale2") * 100 .."% damage dealt, ".. GetConVarNumber("sk_dmg_take_scale2") * 100 .."% damage taken.") - DiffDescM:SetColor(SubtextCol) - - local DiffDescH = vgui.Create( "DLabel", t2tab2) - DiffDescH:SetPos(400, 75) - DiffDescH:SetSize(w2, 20) - DiffDescH:SetText("Hard: ".. GetConVarNumber("sk_dmg_inflict_scale3") * 100 .."% damage dealt, ".. GetConVarNumber("sk_dmg_take_scale3") * 100 .."% damage taken.") - DiffDescH:SetColor(SubtextCol) - - t2tab2.AmmoSetting = vgui.Create( "DLabel", t2tab2) - t2tab2.AmmoSetting:SetPos(400, 110) - t2tab2.AmmoSetting:SetSize(100, 20) - t2tab2.AmmoSetting:SetText("DRC Infinite Ammo:") - t2tab2.AmmoSetting:SetColor(TextCol) - - t2tab2.InfiniteAmmo = vgui.Create( "DComboBox", t2tab2 ) - t2tab2.InfiniteAmmo:SetSortItems(false) - t2tab2.InfiniteAmmo:SetPos(500, 110) - t2tab2.InfiniteAmmo:SetSize(150, 20) - t2tab2.InfiniteAmmo:SetConVar( "sv_drc_infiniteammo" ) - t2tab2.InfiniteAmmo:AddChoice("Disabled", 0) - t2tab2.InfiniteAmmo:AddChoice("Enabled", 1) - t2tab2.InfiniteAmmo:AddChoice("Bottomless Mag", 2) - function t2tab2.InfiniteAmmo:OnSelect(index, value, data) - LocalPlayer():ConCommand("sv_drc_infiniteammo ".. index - 1 .."") - end - ---[[ local DrcDistGunfire = vgui.Create( "DCheckBoxLabel", t2tab2 ) - DrcDistGunfire:SetPos(25, 145) - DrcDistGunfire:SetSize(20, 20) - DrcDistGunfire:SetText( "Disable distant gunfire sounds (can alleviate network usage on larger servers)" ) - DrcDistGunfire:SetConVar( "sv_drc_disable_distgunfire" ) - DrcDistGunfire.Label:SetColor(TextCol) - - - local WeaponSway = vgui.Create( "DNumSlider", t2tab2 ) - WeaponSway:SetPos(25, 115) - WeaponSway:SetSize(300, 20) - WeaponSway:SetText( "AI accuracy handicap" ) - WeaponSway.Label:SetColor(TextCol) - WeaponSway:SetMin( 0 ) - WeaponSway:SetMax( 10 ) - WeaponSway:SetDecimals( 2 ) - WeaponSway:SetConVar( "sv_drc_npc_accuracy" ) - - local LGTitle = vgui.Create( "DLabel", t2tab2) - LGTitle:SetPos(25, 135) - LGTitle:SetSize(w2, 60) - LGTitle:SetText("Handicap of how much an NPCs accuracy should be with Draconic guns. \n 0 = Seal Team 6 accuracy (perfect) \n 2 - Half-Life 2 AI Accuracy \n 10 = Can't hit shit.") - LGTitle:SetColor(TextCol) --]] + local DrcMovement = vgui.Create( "DCheckBoxLabel", t2tab2 ) + DrcMovement:SetPos(25, 15) + DrcMovement:SetSize(20, 20) + DrcMovement:SetText( "Draconic SWEP movement speed overrides" ) + DrcMovement:SetConVar( "sv_drc_movement" ) + DrcMovement.Label:SetColor(TextCol) + + local DrcMoveSounds = vgui.Create( "DCheckBoxLabel", t2tab2 ) + DrcMoveSounds:SetPos(25, 35) + DrcMoveSounds:SetSize(20, 20) + DrcMoveSounds:SetText( "Draconic SWEP movement sounds" ) + DrcMoveSounds:SetConVar( "sv_drc_movesounds" ) + DrcMoveSounds.Label:SetColor(TextCol) + + local DrcInspections = vgui.Create( "DCheckBoxLabel", t2tab2 ) + DrcInspections:SetPos(25, 55) + DrcInspections:SetSize(20, 20) + DrcInspections:SetText( "Draconic SWEP Inspection Menu" ) + DrcInspections:SetConVar( "sv_drc_inspections" ) + DrcInspections.Label:SetColor(TextCol) + + local DrcPassive = vgui.Create( "DCheckBoxLabel", t2tab2 ) + DrcPassive:SetPos(25, 75) + DrcPassive:SetSize(20, 20) + DrcPassive:SetText( "Draconic SWEP Passives" ) + DrcPassive:SetConVar( "sv_drc_passives" ) + DrcPassive.Label:SetColor(TextCol) + + local SvThirdperson = vgui.Create( "DCheckBoxLabel", t2tab2 ) + SvThirdperson:SetPos(25, 115) + SvThirdperson:SetSize(20, 20) + SvThirdperson:SetText( "Disable access to Draconic's thirdperson system" ) + SvThirdperson:SetConVar( "sv_drc_disable_thirdperson" ) + SvThirdperson.Label:SetColor(TextCol) + + MakeHint(t2tab2, 4, 115, "Draconic SWEPs which require thirdperson will still use Draconic thirdperson regardless of this setting.") + + local SvFreecam = vgui.Create( "DCheckBoxLabel", t2tab2 ) + SvFreecam:SetPos(25, 135) + SvFreecam:SetSize(20, 20) + SvFreecam:SetText( "Disable Draconic thirdperson's freecam system globally" ) + SvFreecam:SetConVar( "sv_drc_disable_thirdperson_freelook" ) + SvFreecam.Label:SetColor(TextCol) + + t2tab2.SoundStretch = vgui.Create( "DCheckBoxLabel", t2tab2 ) + t2tab2.SoundStretch:SetPos(25, 155) + t2tab2.SoundStretch:SetSize(20, 20) + t2tab2.SoundStretch:SetText( "Disable host_timescale sound alteration" ) + t2tab2.SoundStretch:SetConVar( "sv_drc_soundtime_disabled" ) + t2tab2.SoundStretch.Label:SetColor(TextCol) + + MakeHint(t2tab2, 4, 135, "Enabling this setting will make it so sounds do not slow down/speed up when host_timescale changes are in effect.") + + local DiffSetting = vgui.Create( "DLabel", t2tab2) + DiffSetting:SetPos(400, 15) + DiffSetting:SetSize(100, 20) + DiffSetting:SetText("HL2 Difficulty:") + DiffSetting:SetColor(TextCol) + + local HL2Diff = vgui.Create( "DComboBox", t2tab2 ) + HL2Diff:SetSortItems(false) + HL2Diff:SetPos(500, 15) + HL2Diff:SetSize(150, 20) + HL2Diff:SetConVar( "skill" ) + HL2Diff:AddChoice("Easy", 1) + HL2Diff:AddChoice("Medium", 2) + HL2Diff:AddChoice("Hard", 3) + function HL2Diff:OnSelect(index, value, data) + LocalPlayer():ConCommand("skill ".. index .."") + end ---[[ local t2tab3 = vgui.Create( "DPanel" ) + local textE = "''Easy'': ".. GetConVarNumber("sk_dmg_inflict_scale1") * 100 .."% damage dealt, ".. GetConVarNumber("sk_dmg_take_scale1") * 100 .."% damage taken." + local textM = "''Medium'': ".. GetConVarNumber("sk_dmg_inflict_scale2") * 100 .."% damage dealt, ".. GetConVarNumber("sk_dmg_take_scale2") * 100 .."% damage taken." + local textH = "''Hard'': ".. GetConVarNumber("sk_dmg_inflict_scale3") * 100 .."% damage dealt, ".. GetConVarNumber("sk_dmg_take_scale3") * 100 .."% damage taken." + + MakeHint(t2tab2, 378, 17, "".. textE .."\n\n".. textM .."\n\n".. textH .."\n\n\nThis is the actual Half-Life 2 difficulty the game/server is currently set to.\nIt will also affect certain NPC's behaviours.\n\nDEFAULT AND RECOMMENDED IS MEDIUM.") + + t2tab2.AmmoSetting = vgui.Create( "DLabel", t2tab2) + t2tab2.AmmoSetting:SetPos(400, 50) + t2tab2.AmmoSetting:SetSize(100, 20) + t2tab2.AmmoSetting:SetText("DRC Infinite Ammo:") + t2tab2.AmmoSetting:SetColor(TextCol) + + t2tab2.InfiniteAmmo = vgui.Create( "DComboBox", t2tab2 ) + t2tab2.InfiniteAmmo:SetSortItems(false) + t2tab2.InfiniteAmmo:SetPos(500, 50) + t2tab2.InfiniteAmmo:SetSize(150, 20) + t2tab2.InfiniteAmmo:SetConVar( "sv_drc_infiniteammo" ) + t2tab2.InfiniteAmmo:AddChoice("Disabled", 0) + t2tab2.InfiniteAmmo:AddChoice("Enabled", 1) + t2tab2.InfiniteAmmo:AddChoice("Bottomless Mag", 2) + function t2tab2.InfiniteAmmo:OnSelect(index, value, data) + LocalPlayer():ConCommand("sv_drc_infiniteammo ".. index - 1 .."") + end + + MakeHint(t2tab2, 378, 52, "''Enabled'': Weapons need to be reloaded, weapons will overheat; but won't take ammo from your pool.\n\n''Bottomless Mag'': Ammo never depletes, weapons will never overheat.") + + t2tab2.SprintSetting = vgui.Create( "DLabel", t2tab2) + t2tab2.SprintSetting:SetPos(400, 85) + t2tab2.SprintSetting:SetSize(100, 20) + t2tab2.SprintSetting:SetText("DRC SWEP Sprint:") + t2tab2.SprintSetting:SetColor(TextCol) + + t2tab2.SprintDropdown = vgui.Create( "DComboBox", t2tab2 ) + t2tab2.SprintDropdown:SetSortItems(false) + t2tab2.SprintDropdown:SetPos(500, 85) + t2tab2.SprintDropdown:SetSize(150, 20) + t2tab2.SprintDropdown:SetConVar( "sv_drc_force_sprint" ) + t2tab2.SprintDropdown:AddChoice("SWEP Default", 0) + t2tab2.SprintDropdown:AddChoice("Force Passives", 1) + t2tab2.SprintDropdown:AddChoice("Disable Passives", 2) + function t2tab2.SprintDropdown:OnSelect(index, value, data) + LocalPlayer():ConCommand("sv_drc_force_sprint ".. index - 1 .."") + end + + MakeHint(t2tab2, 378, 87, "''SWEP Default'': Passive sprinting will be based on the weapon's settings.\n\n''Force Passives'': Passive sprinting will be forced on all DRC SWEPs.\n\n''Disable Passives'': Passive sprinting will be DISABLED on all DRC SWEPs.") + + local t2tab3 = vgui.Create( "DPanel" ) t2tab3:Dock(FILL) t2tab3.Paint = function(self, w, h) - draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) - end - t2tabs:AddSheet( "Experimental Settings", t2tab3, "icon16/script_error.png") - - local DisclaimerExperimental = vgui.Create( "DLabel", t2tab3) - DisclaimerExperimental:SetPos(20, -8) - DisclaimerExperimental:SetSize(300, 50) - DisclaimerExperimental:SetText("Experimental Settings") - DisclaimerExperimental:SetFont("DermaLarge") - DisclaimerExperimental:SetColor(Color(255, 255, 255, 255)) - - local DisclaimerExperimental = vgui.Create( "DLabel", t2tab3) - DisclaimerExperimental:SetPos(24, 20) - DisclaimerExperimental:SetSize(w2, 50) - DisclaimerExperimental:SetText("Anything in this tab is either an unstable personal project or a work-in-progress feature in need of testing.") - DisclaimerExperimental:SetColor(TextCol) ]] - --- local t2tab3 = vgui.Create( "DPanel" ) --- t2tab3:Dock(FILL) --- t2tab3.Paint = function(self, w, h) --- draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) --- end --- t2tabs:AddSheet( "Draconic Thirdperson", t2tab3, "icon16/camera.png") + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end + t2tabs:AddSheet( "Thirdperson Settings", t2tab3, "icon16/camera.png") + + local DrcThirdperson = vgui.Create( "DCheckBoxLabel", t2tab3 ) + DrcThirdperson:SetPos(25, 35) + DrcThirdperson:SetSize(500, 20) + DrcThirdperson:SetText( "Enable Draconic Thirdperson*" ) + DrcThirdperson:SetConVar( "cl_drc_thirdperson" ) + DrcThirdperson.Label:SetColor(TextCol) + DrcThirdperson:SetEnabled(true) + + t2tab3.ThirdPersonEditor = vgui.Create("DButton", t2tab3) + t2tab3.ThirdPersonEditor:SetPos(20, 76) + t2tab3.ThirdPersonEditor:SetSize(200, 24) + t2tab3.ThirdPersonEditor:SetEnabled(true) + t2tab3.ThirdPersonEditor:SetText("Open Thirdperson Editor") + t2tab3.ThirdPersonEditor.DoClick = function() + DRC:OpenThirdpersonEditor(ply) + Derma:Remove() + end + t2tab3.TPReset = vgui.Create("DButton", t2tab3) + t2tab3.TPReset:SetPos(20, 106) + t2tab3.TPReset:SetSize(200, 24) + t2tab3.TPReset:SetEnabled(true) + t2tab3.TPReset:SetText("Reset Thirdperson to Default") + t2tab3.TPReset.DoClick = function() + DRC:ThirdPersonResetToDefault() + end + + local ThirdpersonPresets = vgui.Create("DPanel", t2tab3) + ThirdpersonPresets:SetSize(430, 630) + ThirdpersonPresets:SetPos(440, 0) + ThirdpersonPresets.Paint = function(self, w, h) + draw.RoundedBox(0, 0, 0, w, h, Color(0, 0, 0, 0)) + end + + DRC:CreateThirdPersonPresetMenu(ThirdpersonPresets, false) local mt3 = vgui.Create( "DPanel", maintabs ) mt3:SetBackgroundColor(Color(255, 255, 255, 5)) @@ -2352,100 +2451,100 @@ function DRCMenu( player ) infopage:Dock(FILL) --infopage:OpenURL("https://www.google.com/") infopage:SetHTML( [[ - -
- - - - -