Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Thirdperson script by shadowndacorner
- // works kinda like a cover system, too
- // thirdperson_toggle toggles the effect
- // thirdperson_zoom(in/out) zooms (in/out)
- // thirdperson_togglecombineoverlay turns on/off combine overlay
- ThirdPerson={}
- local ThirdPersonEnabled=true
- concommand.Add("thirdperson_toggle", function()
- if ThirdPersonEnabled then
- ThirdPersonEnabled=false
- else
- ThirdPersonEnabled=true
- end
- end)
- local DrawHead=true
- bonesToHide= {
- {"ValveBiped.Bip01_Head1", 0.00000000000000001},
- {"ValveBiped.Bip01_Neck1", 0.000000000000000001},
- {"ValveBiped.Bip01_Spine4", 0.95},
- }
- hook.Add("ShouldDrawLocalPlayer", "drawLocalPlayerWhenEnabled", function()
- if !DrawHead then
- for f, v in pairs(bonesToHide) do
- local matrx=LocalPlayer():GetBoneMatrix(LocalPlayer():LookupBone(v[1]))
- if matrx then
- matrx:Scale(Vector(v[2], v[2], v[2]))
- LocalPlayer():SetBoneMatrix(LocalPlayer():LookupBone(v[1]), matrx)
- end
- end
- end
- return ThirdPersonEnabled
- end)
- ThirdPerson.zoom=2
- local oldang=oldang or LocalPlayer():GetAngles() or Angle(0, 0, 0)
- local oldpos=oldpos or LocalPlayer():EyePos() or Vector(0, 0, 0)
- local origpos=oldpos
- ThirdPerson.viewSnapped=false
- function CalculateAimVector(pos, angles)
- local mp=50
- local tracedata = {}
- tracedata.start = LocalPlayer():EyePos()
- tracedata.endpos = LocalPlayer():EyePos()+LocalPlayer():EyeAngles():Right()*mp
- tracedata.filter = player.GetAll()
- local dirright=util.TraceLine(tracedata)
- local tracedata = {}
- tracedata.start = LocalPlayer():EyePos()
- tracedata.endpos = LocalPlayer():EyePos()-LocalPlayer():EyeAngles():Right()*mp
- tracedata.filter = player.GetAll()
- local dirleft=util.TraceLine(tracedata)
- if dirright.HitWorld or ValidEntity(dirright.Entity) and dirright.Entity:GetClass()=="prop_physics" then
- pos=LocalPlayer():EyePos()-LocalPlayer():EyeAngles():Right()*mp
- ThirdPerson.viewSnapped=true
- return {["Pos"]=pos, ["Angles"]=angles}
- elseif dirleft.HitWorld or ValidEntity(dirleft.Entity) and dirleft.Entity:GetClass()=="prop_physics" then
- pos=LocalPlayer():EyePos()+LocalPlayer():EyeAngles():Right()*mp
- ThirdPerson.viewSnapped=true
- return {["Pos"]=pos, ["Angles"]=angles}
- end
- local targetpos=(LocalPlayer():EyePos())+angles:Forward()*100
- local tracedata = {}
- tracedata.start = LocalPlayer():EyePos()
- tracedata.endpos = targetpos
- tracedata.filter = player.GetAll()
- local trace=util.TraceLine(tracedata)
- if trace.HitWorld or ValidEntity(trace.Entity) and trace.Entity:GetClass()=="prop_physics" then
- ---FIND POSITION
- local mp=160
- local offset=angles:Forward()*100+angles:Up()*50 -- Up Trace
- local tracedata = {}
- tracedata.start = pos
- tracedata.endpos = tracedata.start+offset
- tracedata.filter = player.GetAll()
- local uptrace=util.TraceLine(tracedata)
- local offset=angles:Forward()*100+angles:Right()*mp -- Right Trace
- local tracedata = {}
- tracedata.start = pos
- tracedata.endpos = tracedata.start+offset
- tracedata.filter = player.GetAll()
- local righttrace=util.TraceLine(tracedata)
- local offset=angles:Forward()*100-angles:Right()*mp -- Left Trace
- local tracedata = {}
- tracedata.start = pos
- tracedata.endpos = tracedata.start+offset
- tracedata.filter = player.GetAll()
- local lefttrace=util.TraceLine(tracedata)
- if !uptrace.HitWorld then
- pos=pos+angles:Up()*50
- ThirdPerson.viewSnapped=true
- elseif !righttrace.HitWorld then
- pos=pos+angles:Right()*(mp/2)
- ThirdPerson.viewSnapped=true
- --print("Right works")
- elseif !lefttrace.HitWorld then
- pos=pos-angles:Right()*(mp/2)
- ThirdPerson.viewSnapped=true
- --print("Left works")
- end
- --/FIND POSITION
- --print("STARING AT A WALL")
- end
- return {["Pos"]=pos, ["Angles"]=angles}
- end
- local posToDraw=Vector(0, 0, 0)
- function behindTheHead(ply, pos, angles, fov)
- local curang=angles
- local calc=CalculateAimVector(pos, angles)
- pos=calc.Pos
- angles=calc.Angles
- if ThirdPerson.zoom<=1.7 and !ThirdPerson.viewSnapped then
- pos=pos+angles:Right()*20
- end
- if ThirdPerson.zoom!=0 then
- angles=LerpAngle(8*FrameTime(), oldang, curang)
- else
- angles=curang
- end
- oldang=angles
- /*if LocalPlayer():Crouching() then
- pos=pos+Vector(0, 0, 30)
- end*/
- origpos=pos
- if ThirdPerson.zoom!=0 then
- pos=LerpVector(8*FrameTime(), oldpos, origpos)
- end
- oldpos=pos
- fov=75
- if ThirdPerson.zoom!=0 then
- local targetpos=(pos)-angles:Forward()*(25*ThirdPerson.zoom)-(angles:Up()*ThirdPerson.zoom)
- --local trace=util.QuickTrace( pos, targetpos, player.GetAll() )
- local tracedata = {}
- tracedata.start = pos
- tracedata.endpos = targetpos
- tracedata.filter = player.GetAll()
- pos=util.TraceLine(tracedata).HitPos
- pos=pos+angles:Forward()*(20)
- DrawHead=true
- ThirdPerson.viewSnapped=false
- return GAMEMODE:CalcView(ply, pos, angles, fov)
- else
- local oply=ply
- if ply.DeathRagdoll then
- oply=ply.DeathRagdoll
- end
- if ply!=oply then
- print(ply, oply)
- end
- local BoneIndx = oply:LookupBone("ValveBiped.Bip01_Head1")
- local BonePos , BoneAng = oply:GetBonePosition( BoneIndx )
- /*if !ply:Alive() then
- local oang=angles
- angles=BoneAng
- end*/
- pos=BonePos+Vector(angles:Up().x*5, angles:Up().y*5, 0)
- --angles=Angle(BoneAng.x, angles.y, BoneAng.z)
- --print(Vector(angles:Forward().x*5, angles:Forward().y*5, 0))
- --print(angles)
- DrawHead=false
- ThirdPerson.viewSnapped=false
- return GAMEMODE:CalcView(ply, pos, angles, fov)
- end
- end
- hook.Add("HUDPaint", "drawHitPos", function()
- pos=LocalPlayer():GetEyeTrace().HitPos
- surface.SetDrawColor(100, 100, 100, 255)
- surface.DrawRect(pos:ToScreen().x-1, pos:ToScreen().y-1, 3, 3)
- surface.DrawRect(pos:ToScreen().x-1, pos:ToScreen().y-10-1, 3, 3)
- surface.DrawRect(pos:ToScreen().x-1, pos:ToScreen().y+10-1, 3, 3)
- surface.DrawRect(pos:ToScreen().x+10-1, pos:ToScreen().y-1, 3, 3)
- surface.DrawRect(pos:ToScreen().x-10-1, pos:ToScreen().y-1, 3, 3)
- surface.SetDrawColor(255, 255, 255, 255)
- surface.DrawRect(pos:ToScreen().x, pos:ToScreen().y, 1, 1)
- surface.DrawRect(pos:ToScreen().x, pos:ToScreen().y-10, 1, 1)
- surface.DrawRect(pos:ToScreen().x, pos:ToScreen().y+10, 1, 1)
- surface.DrawRect(pos:ToScreen().x+10, pos:ToScreen().y, 1, 1)
- surface.DrawRect(pos:ToScreen().x-10, pos:ToScreen().y, 1, 1)
- end)
- hook.Add("HUDShouldDraw", "drawCrosshair", function(key)
- if key=="CHudCrosshair" then
- return false
- end
- end)
- function detectZoom(ply, key, down)
- if key=="invnext" then
- local tgt=math.Clamp(ThirdPerson.zoom+0.5, 1, 4)
- hook.Add("Think", "softZoomIn", function()
- ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgt, 10*FrameTime())
- if ThirdPerson.zoom==tgt then
- hook.Remove("Think", "softZoomIn")
- end
- end)
- end
- if key=="invprev" then
- local tgto=math.Clamp(ThirdPerson.zoom-0.5, 0, 4)
- hook.Add("Think", "softZoomOut", function()
- ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgto, 10*FrameTime())
- if ThirdPerson.zoom==tgto then
- hook.Remove("Think", "softZoomOut")
- end
- end)
- end
- end
- concommand.Add("thirdperson_zoomin", function()
- local tgto=math.Clamp(ThirdPerson.zoom-0.5, 0, 4)
- hook.Add("Think", "softZoomOut", function()
- ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgto, 10*FrameTime())
- if ThirdPerson.zoom==tgto then
- hook.Remove("Think", "softZoomOut")
- end
- end)
- end)
- concommand.Add("thridperson_zoomout", function()
- local tgt=math.Clamp(ThirdPerson.zoom+0.5, 1, 4)
- hook.Add("Think", "softZoomIn", function()
- ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgt, 10*FrameTime())
- if ThirdPerson.zoom==tgt then
- hook.Remove("Think", "softZoomIn")
- end
- end)
- end)
- --hook.Add("PlayerBindPress", "detectZoom", detectZoom)
- hook.Add("CalcView", "tp_calcview", function(a,b,c,d)
- if ThirdPersonEnabled and (!charCreate or !(charCreate.Opened or charCreate.CharMenuOpened)) then
- return behindTheHead(a,b,c,d)
- end
- end)
- function hideViewModel()
- return ThirdPersonEnabled and (!charCreate or !(charCreate.Opened or charCreate.CharMenuOpened))
- end
- hook.Add("PreDrawViewModel", "hideViewModel", hideViewModel)
- local drawingCombineOverlay=false
- hook.Add("RenderScreenspaceEffects", "drawHelmetOverlay", function()
- if (ThirdPerson.zoom==0) and drawingCombineOverlay then
- DrawMaterialOverlay( "effects/combine_binocoverlay.vmt", 0 )
- end
- end)
- concommand.Add("toggle_combine_overlay", function()
- if !drawingCombineOverlay then
- drawingCombineOverlay=true
- else
- drawingCombineOverlay=false
- end
- end)
Add Comment
Please, Sign In to add comment