Advertisement
SneakySquid

Basic Thirdperson

Oct 19th, 2024
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.02 KB | None | 0 0
  1. local thirdperson = CreateConVar("3rdperson", "0", FCVAR_USERINFO)
  2.  
  3. local m_yaw = GetConVar("m_yaw"):GetFloat()
  4. local m_pitch = GetConVar("m_pitch"):GetFloat()
  5. local view_angle, view_origin = EyeAngles(), EyePos()
  6.  
  7. hook.Add("CalcView", "Cool 3rd Person", function(ply, origin, angles)
  8.     if not thirdperson:GetBool() then return end
  9.  
  10.     -- Use a hull trace to prevent the camera clipping through the world
  11.     view_origin = util.TraceHull({
  12.         start = origin,
  13.         endpos = origin - view_angle:Forward() * 100 + view_angle:Right() * 15,
  14.         filter = ply,
  15.         mask = MASK_SHOT,
  16.         mins = Vector(-5, -5, -5),
  17.         maxs = Vector(5, 5, 5),
  18.     }).HitPos
  19.  
  20.     return {
  21.         angles = view_angle, -- Set the camera view to the calculated angle
  22.         origin = view_origin, -- Set the origin to be thirdperson
  23.         drawviewer = true,
  24.     }
  25. end)
  26.  
  27. hook.Add("StartCommand", "Cool 3rd Person", function(ply, cmd)
  28.     if not thirdperson:GetBool() then return end
  29.  
  30.     -- We need to calculate mouse movement ourselves since we need to set the view angles
  31.     view_angle = view_angle + Angle(cmd:GetMouseY() * m_pitch, cmd:GetMouseX() * -m_yaw, 0)
  32.     view_angle[1] = math.Clamp(view_angle[1], -89, 89)
  33.     view_angle[2] = math.NormalizeAngle(view_angle[2])
  34.  
  35.     -- Movement will get wonky in any other MOVETYPE
  36.     if ply:GetMoveType() == MOVETYPE_WALK then
  37.         -- Run a trace from the 3rd person camera
  38.         local view_trace = util.TraceLine({
  39.             start = view_origin,
  40.             endpos = view_origin + view_angle:Forward() * 1e4,
  41.             filter = ply,
  42.             mask = MASK_SHOT,
  43.         }).HitPos
  44.  
  45.         -- Update view angles so we're facing where the camera trace hit
  46.         cmd:SetViewAngles((view_trace - ply:GetShootPos()):Angle())
  47.  
  48.         -- Because we've meddled with the view angle we need to update the movement so it works as expected
  49.         local move_fix = Vector(cmd:GetForwardMove(), cmd:GetSideMove(), 0)
  50.         move_fix = (move_fix:Angle() + (cmd:GetViewAngles() - view_angle)):Forward() * move_fix:Length()
  51.  
  52.         cmd:SetForwardMove(move_fix[1])
  53.         cmd:SetSideMove(move_fix[2])
  54.     else
  55.         cmd:SetViewAngles(view_angle)
  56.     end
  57. end)
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement