Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local function getEyeAngles( ply )
- return ply:InVehicle()
- and select( 2, ply:GetVehicle():GetVehicleViewPosition() )
- or ply:EyeAngles()
- end
- local function isDown( cmd, key )
- local isDown = cmd:KeyDown( key )
- if isDown then
- cmd:RemoveKey( key )
- end
- return isDown
- end
- if FreeCam then
- if FreeCam.enabled then
- FreeCam:Toggle()
- if IsValid( FreeCam.panel ) then
- FreeCam.panel:Remove()
- end
- end
- end
- FreeCam = {
- enabled = FreeCam and FreeCam.enabled or false,
- movementEnabled = FreeCam and FreeCam.movementEnabled or false,
- followingEnabled = FreeCam and FreeCam.followingEnabled or false,
- pos = FreeCam and FreeCam.pos or nil,
- ang = FreeCam and FreeCam.ang or nil,
- speed = FreeCam and FreeCam.speed or 10,
- physicalAngles = FreeCam and FreeCam.physicalAngles or Angle(),
- m_yaw = 0,
- m_pitch = 0,
- panel = NULL,
- }
- local function updateSensivity()
- FreeCam.m_yaw = tonumber( GetConVar( 'm_yaw' ):GetString() ) or FreeCam.m_yaw
- FreeCam.m_pitch = tonumber( GetConVar( 'm_pitch' ):GetString() ) or FreeCam.m_pitch
- end
- updateSensivity()
- timer.Create( 'UpdateThirdPersonViewSensivity', 10, 0, updateSensivity )
- function FreeCam:Toggle()
- self.enabled = !self.enabled
- if self.enabled then
- if !self.pos or !self.ang then
- self:Reset()
- end
- self:ShowGUI()
- hook.Add( 'CalcView', 'FreeCam', function( ... )
- return self:CalcView( ... )
- end )
- else
- self:HideGUI()
- hook.Remove( 'CalcView', 'FreeCam' )
- end
- if !self.movementEnabled then
- self.physicalAngles = LocalPlayer():EyeAngles()
- end
- return self.enabled
- end
- function FreeCam:ToggleMovement()
- self.movementEnabled = !self.movementEnabled
- if !self.movementEnabled then
- self.physicalAngles = LocalPlayer():EyeAngles()
- end
- return self.movementEnabled
- end
- function FreeCam:ToggleFollowing()
- self.followingEnabled = !self.followingEnabled
- if self.pos then
- if self.followingEnabled then
- self.pos = self.pos - LocalPlayer():GetPos()
- else
- self.pos = self.pos + LocalPlayer():GetPos()
- end
- end
- return self.followingEnabled
- end
- function FreeCam:ToggleGUI()
- if IsValid( self.panel ) then
- self:HideGUI()
- else
- self:ShowGUI()
- end
- end
- function FreeCam:Reset()
- self.pos = LocalPlayer():GetShootPos()
- if self.followingEnabled then
- self.pos = self.pos - LocalPlayer():GetPos()
- end
- self.ang = getEyeAngles( LocalPlayer() )
- end
- function FreeCam:Init()
- hook.Add( 'HUDPaint', 'FreeCam', function( ... )
- return self:HUDPaint( ... )
- end )
- hook.Add( 'HUDShouldDraw', 'FreeCam', function( ... )
- return self:HUDShouldDraw( ... )
- end )
- hook.Add( 'StartCommand', 'FreeCam', function( ... )
- return self:StartCommand( ... )
- end )
- concommand.Add( 'aoki_freecam_toggle', function()
- local enabled = self:Toggle()
- print( '[Freecam] Freecam ' .. ( enabled and 'enabled' or 'disabled' ) )
- end )
- concommand.Add( 'aoki_freecam_toggle_movement', function()
- local enabled = self:ToggleMovement()
- print( '[Freecam] Movement ' .. ( enabled and 'enabled' or 'disabled' ) )
- end )
- concommand.Add( 'aoki_freecam_toggle_following', function()
- local enabled = self:ToggleFollowing()
- print( '[Freecam] Following ' .. ( enabled and 'enabled' or 'disabled' ) )
- end )
- concommand.Add( 'aoki_freecam_reset_camera', function()
- self:Reset()
- print( '[Freecam] Camera reset' )
- end )
- concommand.Add( 'aoki_freecam_destroy', function()
- self:Destroy()
- print( '[Freecam] FreeCam destroyed' )
- end )
- end
- function FreeCam:Destroy()
- hook.Remove( 'CalcView', 'FreeCam' )
- hook.Remove( 'StartCommand', 'FreeCam' )
- end
- function FreeCam:ShowGUI()
- if IsValid( self.panel ) then return end
- local panel = vgui.Create( 'DPanel' )
- self.panel = panel
- panel.freecam = self
- panel:SetSize( 1, 1 )
- panel:SetRenderInScreenshots( false )
- panel:SetPaintedManually( true )
- panel:NoClipping( true )
- local font = 'Trebuchet24'
- function panel:Paint()
- if !self.freecam.enabled then
- return
- end
- local text = string.format(
- '[Freecam enabled]\nControlling: %s\nSpeed: %s',
- self.freecam.movementEnabled and 'Player' or 'Camera',
- self.freecam.speed
- )
- local x, y = ScrW() / 2, 5
- draw.DrawText( text, font, x + 1, y + 1, Color( 50, 50, 50 ), TEXT_ALIGN_CENTER )
- draw.DrawText( text, font, x, y, Color( 255, 255, 255 ), TEXT_ALIGN_CENTER )
- render.DrawLine( LocalPlayer():GetShootPos(), LocalPlayer():GetEyeTrace().HitPos, color_white )
- end
- end
- function FreeCam:HideGUI()
- if IsValid( self.panel ) then
- self.panel:Remove()
- end
- end
- function FreeCam:HUDPaint()
- if IsValid( self.panel ) then
- self.panel:PaintManual( true )
- end
- end
- function FreeCam:CalcView( ply, pos, ang, fov )
- if !self.enabled then
- return
- end
- local pos = self.pos
- local ang = self.ang
- if self.followingEnabled then
- pos = LocalPlayer():GetPos()
- pos:Add( self.pos )
- end
- local view = {
- origin = pos,
- angles = ang,
- fov = fov,
- drawviewer = true,
- }
- return view
- end
- function FreeCam:HUDShouldDraw( name )
- if name == 'CHudWeaponSelection' and self.enabled and !self.movementEnabled then
- return false
- end
- end
- function FreeCam:StartCommand( _, cmd )
- if !self.enabled or self.movementEnabled then
- return
- end
- local wheel = cmd:GetMouseWheel()
- if wheel != 0 then
- self.speed = math.Clamp( self.speed + wheel * math.abs( wheel ), 1, 100 )
- end
- local w = isDown( cmd, IN_FORWARD ) and 1 or 0
- local s = isDown( cmd, IN_BACK ) and 1 or 0
- local a = isDown( cmd, IN_MOVELEFT ) and 1 or 0
- local d = isDown( cmd, IN_MOVERIGHT ) and 1 or 0
- local space = isDown( cmd, IN_JUMP ) and 1 or 0
- local ctrl = isDown( cmd, IN_DUCK ) and 1 or 0
- local shift = isDown( cmd, IN_SPEED )
- local r = isDown( cmd, IN_RELOAD )
- if r and shift then
- self:Reset()
- end
- local coefficient = FrameTime() * self.speed * self.speed * ( shift and 2 or 1 )
- self.pos:Add( ( w - s ) * self.ang:Forward() * coefficient )
- self.pos:Add( ( d - a ) * self.ang:Right() * coefficient )
- --- Moves the camera by Z axis relatively to the camera angles ---
- --self.pos:Add( ( space - ctrl ) * self.ang:Up() * coefficient )
- --- Moves the camera by Z axis relatively to the world ---
- self.pos.z = self.pos.z + ( space - ctrl ) * coefficient
- local mouseX = cmd:GetMouseX()
- local mouseY = cmd:GetMouseY()
- self.ang.pitch = self.ang.pitch + mouseY * FreeCam.m_pitch
- self.ang.yaw = self.ang.yaw + mouseX * -FreeCam.m_yaw
- cmd:ClearMovement()
- cmd:ClearButtons()
- cmd:SetViewAngles( self.physicalAngles )
- cmd:SetMouseWheel( 0 )
- end
- FreeCam:Init()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement