-- local debugcolor = Color( 255, 0, 255, 1 ) local function QuickDrag( self, dist, ply ) local spos = ply:GetPos() self.QuickDrag = self.QuickDrag or Vector() -- debugoverlay.Box( self.last, Vector( -dist, -dist, 0 ), Vector( dist, dist, 64 ), 0, Color( 0, 0, 255, 0 ) ) if spos.x > (self.QuickDrag.x+dist) then self.QuickDrag.x = spos.x-dist elseif spos.x < (self.QuickDrag.x-dist) then self.QuickDrag.x = spos.x+dist end if spos.y > (self.QuickDrag.y+dist) then self.QuickDrag.y = spos.y-dist elseif spos.y < (self.QuickDrag.y-dist) then self.QuickDrag.y = spos.y+dist end return spos end tempmapcameras = {} tempmapcameras["benny_caramelldansen"] = {} tempmapcameras["benny_caramelldansen"]["main"] = { Type = "Standard", Pos = Vector( -510, 0, 128 ), Ang = Angle( 44, 0, 0 ), FOV = 90, Checks = { { Vector( -512, -512, 64 ), Vector( 512, 512, -64 ), }, }, Special = function( self, ply ) local pos = Vector() pos:Set( self.Pos ) local ang = Angle() ang:Set( self.Ang ) pos:Set( QuickDrag( self, 40, ply ) ) pos.x = pos.x - 130 pos.z = 180 return pos, ang, self.FOV end } tempmapcameras["benny_test"] = {} tempmapcameras["benny_test"]["main"] = { Type = "Standard", Pos = Vector( -692, 0, 268 ), Ang = Angle( 55, 0, 0 ), FOV = 90, Checks = { { Vector( -390, 510, 0 ), Vector( -924, -509, -90 ), }, }, iX1 = -550, iX2 = -800, Special = function( self, ply ) local pos = Vector() pos:Set( self.Pos ) local ang = Angle() ang:Set( self.Ang ) local ppos = ply:GetPos() pos.y = ppos.y do -- Angle local amt = math.TimeFraction( self.iX1, self.iX2, ppos.x ) debugoverlay.Line( Vector( self.iX1, 0, 0 ), Vector( self.iX2, 0, 0 ), 0, debugcolor, true ) amt = math.Clamp( amt, 0, 1 ) amt = math.ease.InOutCubic( amt ) ang.p = ang.p + ( 25 * (amt) ) pos.x = pos.x - ( 170 * (amt) ) end return pos, ang, self.FOV end } tempmapcameras["benny_test"]["grass"] = { Pos = Vector( -1622, -214, 284 ), Ang = Angle( 70, 0, 0 ), FOV = 90, Checks = { { Vector( -931, -130, 0 ), Vector( -1311, -319, -70 ), }, { Vector( -1321, 506, 0 ), Vector( -1813, -503, -70 ), }, }, iX1 = -900, iX2 = -1330, iX3 = -1400, iX4 = -1750, Special = function( self, ply ) local pos = Vector() pos:Set( self.Pos ) local ang = Angle() ang:Set( self.Ang ) local fov = self.FOV local ppos = ply:GetPos() pos.y = ppos.y do -- far local amt = math.TimeFraction( self.iX1, self.iX2, ppos.x ) debugoverlay.Line( Vector( self.iX1, ppos.y, ppos.z ), Vector( self.iX2, ppos.y, ppos.z ), 0, debugcolor, true ) amt = 1-math.Clamp( amt, 0, 1 ) amt = math.ease.InOutSine( amt ) ang.p = ang.p - ( 11 * amt ) pos.x = pos.x + ( 400 * amt ) fov = fov - ( 22 * amt ) end do -- close local amt = math.TimeFraction( self.iX3, self.iX4, ppos.x ) debugoverlay.Line( Vector( self.iX3, ppos.y, ppos.z ), Vector( self.iX4, ppos.y, ppos.z ), 0, debugcolor, true ) amt = math.Clamp( amt, 0, 1 ) amt = math.ease.InOutCubic( amt ) pos.x = pos.x - ( 150 * (amt) ) ang.p = ang.p + ( 0 * (amt) ) end return pos, ang, fov end } tempmapcameras["benny_test"]["barber"] = { Pos = Vector( -64, 0, 80 ), Ang = Angle( 34, 0, 0 ), FOV = 90, Checks = { { Vector( -382, 128, 0 ), Vector( 128, -128, -70 ), }, }, Special = function( self, ply ) local pos = Vector() pos:Set( self.Pos ) local ang = Angle() ang:Set( self.Ang ) local fov = self.FOV local ppos = ply:GetPos() pos.x = pos.x + ppos.x pos.y = pos.y + ppos.y pos.x = math.max( pos.x, -400 ) return pos, ang, fov end } BENNY_ACTIVECAMERA = nil local c_over = CreateConVar( "benny_cam_override", "" ) local c_unlock = CreateConVar( "benny_cam_unlock", 0 ) local si = 4 local ctrace = { start = nil, endpos = nil, mins = Vector( -si, -si, -si ), maxs = Vector( si, si, si ), mask = MASK_SHOT_HULL, filter = nil, } local tempcam = { FOV = 90, Special = function( self, ply ) local pos = Vector() local ang = Angle( 22, 0, 0 ) pos:Set( QuickDrag( self, 40, ply ) ) pos.x = pos.x - 30 pos.z = pos.z + 80 return pos, ang, self.FOV end } local fixer = Angle( 0, -90, 90 ) local fixer2 = Angle( 0, -90, 90 ) local cscam = { Special = function( self, ply ) local pos = Vector() local ang = Angle() local fov = 90 cuts:SetupBones() local mat = cuts:GetBoneMatrix( cuts:LookupBone( "camera" ) ) local matf = cuts:GetBoneMatrix( cuts:LookupBone( "camera.fov" ) ) pos:Set( mat:GetTranslation() ) ang:Set( mat:GetAngles() ) ang:Sub( fixer ) local fix, fixa = matf:GetTranslation(), matf:GetAngles() fix:Sub( cuts:GetPos() ) fov = fix.z do local x, y, z = pos.x, pos.y, pos.z end do local p, y, r = ang.p, ang.y, ang.r ang.p = -r ang.r = 0 end fov = Convert( fov, (4/3) ) -- Convert to vertical FOV.. somehow fov = Convert( fov, (ScrH()/ScrW())/(3/4) ) -- Shut up default Source FOV widescreen magic return pos, ang, fov end } local function decide_active() -- print( LocalPlayer():GetPos() ) -- BENNY_ACTIVECAMERA = tempcam local csent = ents.FindByClass( "benny_cutscene" )[1] if IsValid( csent ) then BENNY_ACTIVECAMERA = cscam cuts = csent return true end if tempmapcameras[ game.GetMap() ] then for name, camera in pairs( tempmapcameras[ game.GetMap() ] ) do if camera.Checks then for i, v in ipairs(camera.Checks) do debugoverlay.Box( vector_origin, v[1], v[2], 0, debugcolor ) if LocalPlayer():GetPos():WithinAABox( v[1], v[2] ) then BENNY_ACTIVECAMERA = camera return true end end end end end return false end function bennyfp( origin, angles, fov ) local ply = LocalPlayer() assert( IsValid( ply:GetActiveWeapon() ) ) local pos, ang = Vector(), Angle() pos:Set( ply:GetPos() ) pos.z = pos.z + 64 ang:Set( angles ) pos:Add( 16 * ang:Right() ) pos:Add( -32 * ang:Forward() ) pos:Add( 0 * ang:Up() ) pos:Add( 16 * ang:Up() * (ang.p/90) ) return pos, ang, 90 end hook.Add( "CalcView", "MyCalcView", function( ply, pos, ang, fov ) if c_unlock:GetBool() then return end if ply:GetMoveType() == MOVETYPE_NOCLIP then return end decide_active() local camera = BENNY_ACTIVECAMERA local view = {} view.origin = pos view.angles = ang view.fov = 90 if camera then view.origin = camera.Pos view.angles = camera.Ang view.fov = camera.FOV or 60 if camera.Special then view.origin, view.angles, view.fov = camera.Special( camera, ply ) end end -- PROTO: Add correct benny weapon check if IsValid(ply:GetActiveWeapon()) and ply:GetActiveWeapon():GetAim() > 0 then view.drawviewer = true view.origin, view.angles, view.fov = bennyfp( view.origin, view.angles, view.fov ) end local st = c_over:GetString() if st != "" then local st = string.Explode( " ", st ) view.origin.x = tonumber(st[1]) view.origin.y = tonumber(st[2]) view.origin.z = tonumber(st[3]) view.angles.x = tonumber(st[4]) view.angles.y = tonumber(st[5]) view.angles.z = tonumber(st[6]) view.fov = tonumber(st[7]) end view.fov = Convert( view.fov, (ScrH()/ScrW())/(3/4) ) return view end ) function Convert( fovDegrees, ratio ) local halfAngleRadians = fovDegrees * ( 0.5 * math.pi / 180 ) local t = math.tan( halfAngleRadians ) t = t * ratio local retDegrees = ( 180 / math.pi ) * math.atan( t ) return retDegrees * 2 end concommand.Add("benny_cam_panel", function() if IsValid( CamPanel ) then CamPanel:Remove() end CamPanel = vgui.Create( "DFrame" ) local a = CamPanel a:SetSize( 320, 280 ) a:Center() a:MakePopup() local st = c_over:GetString() if st == "" then st = "0 0 0 0 0 0 90" end st = string.Explode( " ", st ) for i=1, 3 do local t = a:Add("DLabel") t:SetSize( 300, 14 ) t:DockMargin( 20, 2, 20, 2 ) t:Dock( TOP ) t:SetText( i==1 and "Hold CONTROL to Right/Forward/Up" or i==2 and "Hold SHIFT to multiply 10x" or i==3 and "Hold ALT to multiply 2x" ) end local bloink = {} for i=1, 3 do local b = vgui.Create("DNumberWang") bloink[i] = b b:SetSize( 200, 20 ) b:DockMargin( 20, 2, 20, 2 ) b:SetText( st[i] ) b:SetMinMax( -math.huge, math.huge ) b.OnValueChanged = function(self) st[i] = self:GetValue() c_over:SetString( table.concat( st, " " ) ) end local d = vgui.Create("DPanel") for u=1, 6 do local bu = d:Add("DButton") bu:Dock( LEFT ) bu:SetSize( 29, 24 ) bu:DockMargin( 0, 0, 2, 0 ) local wa = 0 if u==1 then wa = -10 elseif u==2 then wa = -5 elseif u==3 then wa = -1 elseif u==4 then wa = 1 elseif u==5 then wa = 5 elseif u==6 then wa = 10 end bu:SetText( wa ) function bu:DoClick( ) local wa = wa if input.IsKeyDown( KEY_LALT ) then wa = wa * 2 end if input.IsKeyDown( KEY_LSHIFT ) then wa = wa * 10 end if input.IsKeyDown( KEY_LCONTROL ) then local wawa = Vector() local new = Angle( st[4], st[5], st[6] ) wawa = i==1 and new:Right() or i==2 and new:Forward() or new:Up() wawa:Mul(wa) st[1] = st[1] + wawa[1] st[2] = st[2] + wawa[2] st[3] = st[3] + wawa[3] bloink[1]:SetValue( st[1] ) bloink[2]:SetValue( st[2] ) bloink[3]:SetValue( st[3] ) return end b:SetValue( b:GetValue() + wa ) end end local c = a:Add("DHorizontalDivider") c:Dock( TOP ) c:DockMargin( 10, 0, 10, 0 ) c:SetLeft(b) c:SetRight(d) end for i=1, 3 do local b = a:Add("DNumSlider") bloink[i+3] = b b:SetSize( 200, 20 ) b:Dock( TOP ) b:DockMargin( 20, 2, 20, 2 ) b:SetText( i==1 and "Pitch" or i==2 and "Yaw" or "Roll" ) b:SetMin( -360 ) b:SetMax( 360 ) b:SetValue( st[i+3] ) b:SetDecimals( 1 ) b.OnValueChanged = function( self, val ) val = math.NormalizeAngle( val ) self:SetValue( val ) st[i+3] = val c_over:SetString( table.concat( st, " " ) ) end end do local b = a:Add("DNumSlider") bloink[7] = b b:SetSize( 200, 20 ) b:Dock( TOP ) b:DockMargin( 20, 2, 20, 2 ) b:SetText( "Field of View" ) b:SetMin( 0 ) b:SetMax( 90 ) b:SetValue( st[7] ) b.OnValueChanged = function(self) st[7] = self:GetValue() c_over:SetString( table.concat( st, " " ) ) end end do local b = vgui.Create("DButton") b:SetText( "Steal from current" ) function b:DoClick() local ply = LocalPlayer() local ppos = ply:EyePos() local pang = ply:EyeAngles() for i=1, 7 do if i==1 then bloink[i]:SetValue( ppos[1] ) elseif i==2 then bloink[i]:SetValue( ppos[2] ) elseif i==3 then bloink[i]:SetValue( ppos[3] ) elseif i==4 then bloink[i]:SetValue( pang[1] ) elseif i==5 then bloink[i]:SetValue( pang[2] ) elseif i==6 then bloink[i]:SetValue( pang[3] ) elseif i==7 then bloink[i]:SetValue( 90 ) end c_over:SetString( table.concat( st, " " ) ) end end local d = vgui.Create("DButton") d:SetText( "Reset" ) function d:DoClick() for i=1, 7 do bloink[i]:SetValue( i==7 and 90 or 0 ) end c_over:SetString("") end local c = a:Add("DHorizontalDivider") c:Dock( TOP ) c:DockMargin( 10, 0, 10, 0 ) c:SetLeft(b) c:SetRight(d) end end) concommand.Add( "benny_dev_eyetrace", function( ply ) local tr = ply:GetEyeTrace() print( string.format("Vector( %i, %i, %i )", math.Round( tr.HitPos.x ), math.Round( tr.HitPos.y ), math.Round( tr.HitPos.z ) ) ) print( tr.Entity ) end)