shadowndacorner

Epic thirdperson for ya

Jul 30th, 2013
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.53 KB | None | 0 0
  1. // Thirdperson script by shadowndacorner
  2. // works kinda like a cover system, too
  3. // thirdperson_toggle toggles the effect
  4. // thirdperson_zoom(in/out) zooms (in/out)
  5. // thirdperson_togglecombineoverlay turns on/off combine overlay
  6.  
  7. ThirdPerson={}
  8. local ThirdPersonEnabled=true
  9. concommand.Add("thirdperson_toggle", function()
  10.     if ThirdPersonEnabled then
  11.         ThirdPersonEnabled=false
  12.     else
  13.         ThirdPersonEnabled=true
  14.     end
  15. end)
  16. local DrawHead=true
  17.  
  18. bonesToHide=    {
  19.                         {"ValveBiped.Bip01_Head1", 0.00000000000000001},
  20.                         {"ValveBiped.Bip01_Neck1", 0.000000000000000001},
  21.                         {"ValveBiped.Bip01_Spine4", 0.95},
  22.                         }
  23.  
  24. hook.Add("ShouldDrawLocalPlayer", "drawLocalPlayerWhenEnabled", function()
  25.     if !DrawHead then
  26.         for f, v in pairs(bonesToHide) do
  27.             local matrx=LocalPlayer():GetBoneMatrix(LocalPlayer():LookupBone(v[1]))
  28.             if matrx then
  29.                 matrx:Scale(Vector(v[2], v[2], v[2]))
  30.                 LocalPlayer():SetBoneMatrix(LocalPlayer():LookupBone(v[1]), matrx)
  31.             end
  32.         end
  33.     end
  34.     return ThirdPersonEnabled
  35. end)
  36.  
  37. ThirdPerson.zoom=2
  38. local oldang=oldang or LocalPlayer():GetAngles() or Angle(0, 0, 0)
  39. local oldpos=oldpos or LocalPlayer():EyePos() or Vector(0, 0, 0)
  40. local origpos=oldpos
  41.  
  42. ThirdPerson.viewSnapped=false
  43. function CalculateAimVector(pos, angles)
  44.     local mp=50
  45.     local tracedata = {}
  46.     tracedata.start = LocalPlayer():EyePos()
  47.     tracedata.endpos = LocalPlayer():EyePos()+LocalPlayer():EyeAngles():Right()*mp
  48.     tracedata.filter = player.GetAll()
  49.     local dirright=util.TraceLine(tracedata)
  50.    
  51.     local tracedata = {}
  52.     tracedata.start = LocalPlayer():EyePos()
  53.     tracedata.endpos = LocalPlayer():EyePos()-LocalPlayer():EyeAngles():Right()*mp
  54.     tracedata.filter = player.GetAll()
  55.     local dirleft=util.TraceLine(tracedata)
  56.    
  57.     if dirright.HitWorld or ValidEntity(dirright.Entity) and dirright.Entity:GetClass()=="prop_physics" then
  58.         pos=LocalPlayer():EyePos()-LocalPlayer():EyeAngles():Right()*mp
  59.         ThirdPerson.viewSnapped=true
  60.         return {["Pos"]=pos, ["Angles"]=angles}
  61.     elseif dirleft.HitWorld or ValidEntity(dirleft.Entity) and dirleft.Entity:GetClass()=="prop_physics" then
  62.         pos=LocalPlayer():EyePos()+LocalPlayer():EyeAngles():Right()*mp
  63.         ThirdPerson.viewSnapped=true
  64.         return {["Pos"]=pos, ["Angles"]=angles}
  65.     end
  66.    
  67.     local targetpos=(LocalPlayer():EyePos())+angles:Forward()*100
  68.    
  69.     local tracedata = {}
  70.     tracedata.start = LocalPlayer():EyePos()
  71.     tracedata.endpos = targetpos
  72.     tracedata.filter = player.GetAll()
  73.     local trace=util.TraceLine(tracedata)
  74.    
  75.     if trace.HitWorld or ValidEntity(trace.Entity) and trace.Entity:GetClass()=="prop_physics" then
  76.         ---FIND POSITION
  77.             local mp=160
  78.             local offset=angles:Forward()*100+angles:Up()*50 -- Up Trace
  79.            
  80.             local tracedata = {}
  81.             tracedata.start = pos
  82.             tracedata.endpos = tracedata.start+offset
  83.             tracedata.filter = player.GetAll()
  84.             local uptrace=util.TraceLine(tracedata)
  85.            
  86.             local offset=angles:Forward()*100+angles:Right()*mp -- Right Trace
  87.            
  88.             local tracedata = {}
  89.             tracedata.start = pos
  90.             tracedata.endpos = tracedata.start+offset
  91.             tracedata.filter = player.GetAll()
  92.             local righttrace=util.TraceLine(tracedata)
  93.            
  94.             local offset=angles:Forward()*100-angles:Right()*mp -- Left Trace
  95.            
  96.             local tracedata = {}
  97.             tracedata.start = pos
  98.             tracedata.endpos = tracedata.start+offset
  99.             tracedata.filter = player.GetAll()
  100.             local lefttrace=util.TraceLine(tracedata)
  101.            
  102.             if !uptrace.HitWorld then
  103.                 pos=pos+angles:Up()*50
  104.                 ThirdPerson.viewSnapped=true
  105.             elseif !righttrace.HitWorld then
  106.                 pos=pos+angles:Right()*(mp/2)
  107.                 ThirdPerson.viewSnapped=true
  108.                 --print("Right works")
  109.             elseif !lefttrace.HitWorld then
  110.                 pos=pos-angles:Right()*(mp/2)
  111.                 ThirdPerson.viewSnapped=true
  112.                 --print("Left works")
  113.             end
  114.         --/FIND POSITION
  115.         --print("STARING AT A WALL")
  116.     end
  117.     return {["Pos"]=pos, ["Angles"]=angles}
  118. end
  119.  
  120. local posToDraw=Vector(0, 0, 0)
  121. function behindTheHead(ply, pos, angles, fov)
  122.     local curang=angles
  123.     local calc=CalculateAimVector(pos, angles)
  124.     pos=calc.Pos
  125.     angles=calc.Angles
  126.     if ThirdPerson.zoom<=1.7 and !ThirdPerson.viewSnapped then
  127.         pos=pos+angles:Right()*20
  128.     end
  129.     if ThirdPerson.zoom!=0 then
  130.         angles=LerpAngle(8*FrameTime(), oldang, curang)
  131.     else
  132.         angles=curang
  133.     end
  134.     oldang=angles
  135.    
  136.     /*if LocalPlayer():Crouching() then
  137.         pos=pos+Vector(0, 0, 30)
  138.     end*/
  139.    
  140.     origpos=pos
  141.    
  142.     if ThirdPerson.zoom!=0 then
  143.         pos=LerpVector(8*FrameTime(), oldpos, origpos)
  144.     end
  145.     oldpos=pos
  146.    
  147.     fov=75
  148.     if ThirdPerson.zoom!=0 then
  149.         local targetpos=(pos)-angles:Forward()*(25*ThirdPerson.zoom)-(angles:Up()*ThirdPerson.zoom)
  150.         --local trace=util.QuickTrace( pos, targetpos, player.GetAll() )
  151.         local tracedata = {}
  152.         tracedata.start = pos
  153.         tracedata.endpos = targetpos
  154.         tracedata.filter = player.GetAll()
  155.         pos=util.TraceLine(tracedata).HitPos
  156.         pos=pos+angles:Forward()*(20)
  157.         DrawHead=true
  158.         ThirdPerson.viewSnapped=false
  159.         return GAMEMODE:CalcView(ply, pos, angles, fov)
  160.     else
  161.         local oply=ply
  162.         if ply.DeathRagdoll then
  163.             oply=ply.DeathRagdoll
  164.         end
  165.         if ply!=oply then
  166.             print(ply, oply)
  167.         end
  168.         local BoneIndx = oply:LookupBone("ValveBiped.Bip01_Head1")
  169.         local BonePos , BoneAng = oply:GetBonePosition( BoneIndx )
  170.         /*if !ply:Alive() then
  171.             local oang=angles
  172.             angles=BoneAng
  173.         end*/
  174.         pos=BonePos+Vector(angles:Up().x*5, angles:Up().y*5, 0)
  175.         --angles=Angle(BoneAng.x, angles.y, BoneAng.z)
  176.         --print(Vector(angles:Forward().x*5, angles:Forward().y*5, 0))
  177.         --print(angles)
  178.         DrawHead=false
  179.         ThirdPerson.viewSnapped=false
  180.         return GAMEMODE:CalcView(ply, pos, angles, fov)
  181.     end
  182. end
  183.  
  184. hook.Add("HUDPaint", "drawHitPos", function()
  185.     pos=LocalPlayer():GetEyeTrace().HitPos
  186.     surface.SetDrawColor(100, 100, 100, 255)
  187.     surface.DrawRect(pos:ToScreen().x-1, pos:ToScreen().y-1, 3, 3)
  188.     surface.DrawRect(pos:ToScreen().x-1, pos:ToScreen().y-10-1, 3, 3)
  189.     surface.DrawRect(pos:ToScreen().x-1, pos:ToScreen().y+10-1, 3, 3)
  190.     surface.DrawRect(pos:ToScreen().x+10-1, pos:ToScreen().y-1, 3, 3)
  191.     surface.DrawRect(pos:ToScreen().x-10-1, pos:ToScreen().y-1, 3, 3)
  192.    
  193.     surface.SetDrawColor(255, 255, 255, 255)
  194.     surface.DrawRect(pos:ToScreen().x, pos:ToScreen().y, 1, 1)
  195.     surface.DrawRect(pos:ToScreen().x, pos:ToScreen().y-10, 1, 1)
  196.     surface.DrawRect(pos:ToScreen().x, pos:ToScreen().y+10, 1, 1)
  197.     surface.DrawRect(pos:ToScreen().x+10, pos:ToScreen().y, 1, 1)
  198.     surface.DrawRect(pos:ToScreen().x-10, pos:ToScreen().y, 1, 1)
  199. end)
  200.  
  201. hook.Add("HUDShouldDraw", "drawCrosshair", function(key)
  202.     if key=="CHudCrosshair" then
  203.         return false
  204.     end
  205. end)
  206.  
  207. function detectZoom(ply, key, down)
  208.     if key=="invnext" then
  209.         local tgt=math.Clamp(ThirdPerson.zoom+0.5, 1, 4)
  210.         hook.Add("Think", "softZoomIn", function()
  211.             ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgt, 10*FrameTime())
  212.             if ThirdPerson.zoom==tgt then
  213.                 hook.Remove("Think", "softZoomIn")
  214.             end
  215.         end)
  216.     end
  217.     if key=="invprev" then
  218.         local tgto=math.Clamp(ThirdPerson.zoom-0.5, 0, 4)
  219.         hook.Add("Think", "softZoomOut", function()
  220.             ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgto, 10*FrameTime())
  221.             if ThirdPerson.zoom==tgto then
  222.                 hook.Remove("Think", "softZoomOut")
  223.             end
  224.         end)
  225.     end
  226. end
  227.  
  228. concommand.Add("thirdperson_zoomin", function()
  229.     local tgto=math.Clamp(ThirdPerson.zoom-0.5, 0, 4)
  230.     hook.Add("Think", "softZoomOut", function()
  231.         ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgto, 10*FrameTime())
  232.         if ThirdPerson.zoom==tgto then
  233.             hook.Remove("Think", "softZoomOut")
  234.         end
  235.     end)
  236. end)
  237.  
  238. concommand.Add("thridperson_zoomout", function()
  239.     local tgt=math.Clamp(ThirdPerson.zoom+0.5, 1, 4)
  240.     hook.Add("Think", "softZoomIn", function()
  241.         ThirdPerson.zoom=math.Approach(ThirdPerson.zoom, tgt, 10*FrameTime())
  242.         if ThirdPerson.zoom==tgt then
  243.             hook.Remove("Think", "softZoomIn")
  244.         end
  245.     end)
  246. end)
  247. --hook.Add("PlayerBindPress", "detectZoom", detectZoom)
  248.  
  249. hook.Add("CalcView", "tp_calcview", function(a,b,c,d)
  250.     if ThirdPersonEnabled and (!charCreate or !(charCreate.Opened or charCreate.CharMenuOpened)) then
  251.         return behindTheHead(a,b,c,d)
  252.     end
  253. end)
  254.  
  255. function hideViewModel()
  256.     return ThirdPersonEnabled and (!charCreate or !(charCreate.Opened or charCreate.CharMenuOpened))
  257. end
  258. hook.Add("PreDrawViewModel", "hideViewModel", hideViewModel)
  259.  
  260. local drawingCombineOverlay=false
  261. hook.Add("RenderScreenspaceEffects", "drawHelmetOverlay", function()
  262.     if (ThirdPerson.zoom==0) and drawingCombineOverlay then
  263.         DrawMaterialOverlay( "effects/combine_binocoverlay.vmt", 0 )
  264.     end
  265. end)
  266.  
  267. concommand.Add("toggle_combine_overlay", function()
  268.     if !drawingCombineOverlay then
  269.         drawingCombineOverlay=true
  270.     else
  271.         drawingCombineOverlay=false
  272.     end
  273. end)
Add Comment
Please, Sign In to add comment