include("shared.lua") include("cl_tips.lua") include("vgui/vgui_rockets.lua") include("vgui/vgui_powerup.lua") include("cl_help.lua") include("cl_selectscreen.lua") CreateClientConVar( "df_cammove", 5, true, false) CreateClientConVar( "df_camdist", 200, true, false) CreateClientConVar( "df_showtrails", 1, true, false) CreateClientConVar( "df_treedense", 2, true, false) CreateClientConVar( "df_xbox", 0, true, false) //experimental controls that auto center CreateClientConVar( "df_inverse", 0, true, true) //Y axis should reverse? Buggy as hell local cross_tex = surface.GetTextureID("DFHUD/crosshair2") local alt_tex = surface.GetTextureID("DFHUD/alt_meter2") local alt_tex_arrow = surface.GetTextureID("DFHUD/alt_meter_arrow_small") local airspeed_tex = surface.GetTextureID("DFHUD/airspeed_meter2") local power_tex = surface.GetTextureID("DFHUD/powerup_meter") local boost_tex = surface.GetTextureID("DFHUD/boost_meter") local health_tex = surface.GetTextureID("DFHUD/health_meter") local fuel_stat_tex = surface.GetTextureID("DFHUD/fuel_status") local fuel_warning_mat = Material("DFHUD/fuel_status_warning") local fuel_ok_mat = Material("DFHUD/fuel_status_ok") local fuel_wait_mat = Material("DFHUD/fuel_status_waiting") local rocket_arrow_red = surface.GetTextureID("DFHUD/rocket_arrow_red") local rocket_arrow_blue = surface.GetTextureID("DFHUD/rocket_arrow_blue") local rocket_arrow_neut = surface.GetTextureID("DFHUD/rocket_arrow_neutral") local W = ScrW() local H = ScrH() local boost_start = 0 local default_camera_distance = 200 local camera_distance = 200 local target_camera_distance = 200 camera_free_movement = false local SettingsPanel = nil function GM:Initialize() surface.CreateFont("akbar",25,400,false,false,"plane_hud") surface.CreateFont( "coolvetica", 30, 500, true, false, "rocket_nums" ) camera_distance = GetConVarNumber("df_camdist") local rocket = vgui.Create("RocketIcon") rocket:SetTeam(TEAM_RED) local rocket = vgui.Create("RocketIcon") rocket:SetTeam(TEAM_BLUE) self.DrawHud = true end function GM:CreateScoreboard( ScoreBoard ) ScoreBoard:ParentToHUD() ScoreBoard:SetRowHeight( 32 ) ScoreBoard:SetAsBullshitTeam( TEAM_SPECTATOR ) ScoreBoard:SetAsBullshitTeam( TEAM_CONNECTING ) ScoreBoard:SetShowScoreboardHeaders( GAMEMODE.TeamBased ) if ( GAMEMODE.TeamBased ) then ScoreBoard:SetAsBullshitTeam( TEAM_UNASSIGNED ) ScoreBoard:SetHorizontal( true ) end ScoreBoard:SetSkin( GAMEMODE.HudSkin ) self:AddScoreboardAvatar( ScoreBoard ) // 1 self:AddScoreboardWantsChange( ScoreBoard ) // 2 self:AddScoreboardName( ScoreBoard ) // 3 self:AddScoreboardScore( ScoreBoard ) // 4 self:AddScoreboardKills( ScoreBoard ) // 5 self:AddScoreboardDeaths( ScoreBoard ) // 6 self:AddScoreboardPing( ScoreBoard ) // 7 // Here we soort by these columns (and descending), in this order. You can define up to 4 ScoreBoard:SetSortColumns( { 4, true, 5, true, 6, false, 3, true} ) end function GM:AddScoreboardScore( ScoreBoard ) local f = function( ply ) return ply:GetMainScore() end ScoreBoard:AddColumn( "Score", 50, f, 0.1, nil, 6, 6 ) end function GM:HUDPaint() if self.DrawHud then local pln = LocalPlayer():GetPlane() if GetConVarNumber("cl_drawhud") != 0 then if ValidEntity(pln) then self:DrawPlaneHUD() end self:DrawCenterMessages() end end self.BaseClass:HUDPaint() end local shake_factor = 0 local shake_speed = 800 local cam_roll = 0 local attack_start_time = 0 function DoPlaneCam(ply,origin,angles,fov) local plane = ply:GetPlane(); local view = {} //view.fov = 60 view.origin = origin view.angles = angles if !ValidEntity(plane) then return view end; if camera_free_movement then view.origin = plane:GetPos() + (angles:Forward() * -camera_distance) view.angles = angles return view else ply.LastPlaneAngles = ply.LastPlaneAngles or plane:GetAngles() local AngMat = MatrixFromAngle( Angle(0,0,0) ) local move = 1.1 - (GetConVarNumber( "df_cammove" ) * 0.02) AngMat:Rotate( LerpAngle(1-FrameTime() * move * 8, plane:GetAngles() + Angle(5,0,0), ply.LastPlaneAngles) ) local angles = AngMat:GetAngle() ply.LastPlaneAngles = angles if (plane:GetVelocity():Length() > shake_speed) then if plane.Wind_Sound then plane.Wind_Sound:Play() end plane.Wind_Sound:ChangeVolume(shake_factor * 500) local new_shake = math.Clamp(plane:GetVelocity():Length() / 650,0,0.8) shake_factor = math.Approach(shake_factor, new_shake, 0.001) else if plane.Wind_Sound then plane.Wind_Sound:Stop() end shake_factor = math.Approach(shake_factor, 0, 0.01) end if ply:KeyDown(IN_ATTACK) then if attack_start_time == -1 then attack_start_time = CurTime() end // we just started pressing it local attack_hold_time = CurTime() - attack_start_time shake_factor = math.Clamp(attack_hold_time / 40, 0.4, 0.9) else attack_start_time = -1 end angles.p = angles.p + math.Rand(-(shake_factor^2),shake_factor^2) angles.y = angles.y + math.Rand(-(shake_factor^2),shake_factor^2) //angles.r = cam_roll view.angles = angles camera_distance = math.Approach(camera_distance, target_camera_distance + (plane:GetVelocity():Length() * 0.01) - 25, (target_camera_distance - camera_distance) * 0.05) view.origin = plane:GetPos() + (angles:Forward() * -camera_distance) + Vector(0,0,36); view.fov = 60 return view end end local rocket_cam = false local rocket_cam_end = 0 local rocket_cam_pos = Vector(0,0,0) local rocket_cam_team = TEAM_RED function calc(ply,origin,angles,fov) if !rocket_cam then if ply:KeyDown(IN_RELOAD) then return DoRearCam(ply,origin,angles,fov) else return DoPlaneCam(ply,origin,angles,fov) end else return DoRocketCam(ply,origin,angles,fov) end end hook.Add("CalcView", "dfcalc", calc) function DoRearCam(ply,origin,angles,fov) local plane = ply:GetPlane() if !ValidEntity(plane) then return end local view = {} angles.y = plane:GetAngles().y + 180 angles.p = plane:GetAngles().p angles.r = 0 view.origin = plane:GetPos() + (plane:GetForward() * default_camera_distance) view.angles = (plane:GetPos() - view.origin):Angle() return view end function DoRocketCam(ply,origin,angles,fov) if rocket_cam_end < CurTime() then rocket_cam = false GAMEMODE.DrawHud = true return end local rocket = GAMEMODE:GetRocket(rocket_cam_team) if !ValidEntity(rocket) then return end // dunno why this would happen but er GAMEMODE.DrawHud = false local look_pos = rocket:GetPos() + rocket:GetUp() * 100 local view = {} view.origin = rocket_cam_pos + Vector(0,0,100) view.angles = (look_pos - view.origin):Angle() view.fov = 60 return view end function StartRocketCam(um) rocket_cam = true rocket_cam_team = um:ReadShort() rocket_cam_pos = um:ReadVector() rocket_cam_end = CurTime() + GAMEMODE.RoundPostLength end usermessage.Hook("df_startrocketcam", StartRocketCam) local CRS = 35 local cross_size = 4 local missile_flash_change = 5 local missile_flash_yellow = 0 local fuel_warning_text = "WARNING!" local fuel_friend_text = "DEFEND!" local powerup_control = nil local old_boost_rot = 0 local old_health_rot = 0 function GM:DrawPlaneHUD() local circle_radar_table = {} if !ValidPanel(powerup_control) then powerup_control = vgui.Create("PowerupElement") end //Crosshair if CRS < 24 then CRS = math.Approach(CRS, 24,0.1) end local plane = LocalPlayer():GetPlane() local cross_pos = plane:GetPos() + plane:GetForward() * 1000 + plane:GetUp() * 10 cross_pos = cross_pos:ToScreen() surface.SetTexture(cross_tex) surface.SetDrawColor(255,255,255,255) surface.DrawTexturedRect( cross_pos.x - CRS / 2, cross_pos.y - CRS / 2, CRS, CRS ) local entz = {} for k,v in pairs(ents.FindByClass("df_plane")) do if v:GetPos():Distance(plane:GetPos()) < 4000 and v != plane and !v:GetCloaked() then local ts = v:GetPos():ToScreen() local vts = Vector(ts.x,ts.y,0) if vts:Distance(Vector(W/2,H/2,0)) < 100 then table.insert(entz, v) end end end for k,ent in pairs(entz) do if ValidEntity(ent) and ValidEntity(ent:GetDriver()) then local col = team.GetColor(ent:GetTeam()) surface.SetTextColor(col.r,col.g,col.b,200) surface.SetFont("ChatFont") local w,h = surface.GetTextSize(ent:GetDriver():Nick()) local pos = (ent:GetPos() + Vector(0,0,50)):ToScreen() surface.SetTextPos(pos.x - w/2,pos.y + 10 - h/2) surface.DrawText(ent:GetDriver():Nick()) end end //PLANE ESP local planes = ents.FindByClass("df_plane") for k,pln in pairs(planes) do if ValidEntity(pln) && pln != plane && pln:GetTeam() == LocalPlayer():Team() then surface.SetDrawColor(team.GetColor(pln:GetTeam())) local pos = pln:GetPos():ToScreen() local dist = plane:GetPos():Distance(pln:GetPos()) local size = math.Clamp((20000 - dist) / 400,0,100) surface.DrawOutlinedRect( pos.x - (size * 0.5), pos.y - (size * 0.5), size, size ) end end //HOMING MISSILE ESP local missiles = ents.FindByClass("wep_projectile_missile") target_camera_distance = GetConVarNumber("df_camdist") if #missiles > 0 then for k,mis in pairs(missiles) do if mis:GetTarget() == LocalPlayer():GetPlane() and mis.DieTime > CurTime() then local pos = mis:GetPos():ToScreen() local w,h = surface.GetTextSize("WARNING!") pos.x = math.Clamp(pos.x, w / 2, W - w / 2) pos.y = math.Clamp(pos.y, h / 2, H - h / 2) if missile_flash_yellow <= 0 then missile_flash_change = 5 end if missile_flash_yellow >= 255 then missile_flash_change = -5 end missile_flash_yellow = missile_flash_yellow + missile_flash_change local dist = mis:GetPos():Distance(LocalPlayer():GetPlane():GetPos()) target_camera_distance = math.Clamp(dist * 1.1, GetConVarNumber("df_camdist") + 150, 1000) surface.SetTextColor(255,missile_flash_yellow,0,255) surface.SetFont("ChatFont") surface.SetTextPos(pos.x - (w*0.5),pos.y - (h* 0.5)) surface.DrawText("WARNING!") end end end //Fuel pod arrow local got_fuel = false for k,fuel_pod in pairs(ents.FindByClass("df_fuel_pod")) do if ValidEntity(fuel_pod) then if ValidEntity(fuel_pod.dt.OwnerPlane) then local pos = fuel_pod.dt.OwnerPlane:GetPos() + Vector(0,0,64) pos = pos:ToScreen() pos.y = pos.y - 20 if missile_flash_yellow <= 0 then missile_flash_change = 5 fuel_warning_text = "WARNING!" fuel_friend_text = "DEFEND!" end if missile_flash_yellow >= 255 then missile_flash_change = -5 fuel_warning_text = "ENEMY FUEL CARRIER!" fuel_friend_text = "FRIENDLY FUEL CARRIER!" end missile_flash_yellow = missile_flash_yellow + missile_flash_change surface.SetTextColor(255,missile_flash_yellow,0,255) if fuel_pod.dt.OwnerPlane:GetTeam() == LocalPlayer():GetPlane():GetTeam() then surface.SetFont("ChatFont") local w,h = surface.GetTextSize(fuel_friend_text) surface.SetTextPos(pos.x - (w*0.5),pos.y - (h* 0.5)) surface.DrawText(fuel_friend_text) else surface.SetFont("ChatFont") local w,h = surface.GetTextSize(fuel_warning_text) surface.SetTextPos(pos.x - (w*0.5),pos.y - (h* 0.5)) surface.DrawText(fuel_warning_text) end else if LocalPlayer():GetPlane() != fuel_pod.dt.OwnerPlane and !plane:GetHasFuelPod() and LocalPlayer():Team() != fuel_pod:GetTeam() then local pos = (fuel_pod:GetPos() + Vector(0,0,32)):ToScreen() if fuel_pod:GetTeam() == TEAM_RED then surface.SetTexture(rocket_arrow_red) elseif fuel_pod:GetTeam() == TEAM_BLUE then surface.SetTexture(rocket_arrow_blue) else surface.SetTexture(rocket_arrow_neut) end pos.y = pos.y + (math.sin(CurTime() * 5) * 2) surface.DrawTexturedRect(pos.x - 8,pos.y - 18, 16,16) end end end end if LocalPlayer():GetPlane():GetHasFuelPod() then //FUEL CARRIER HUD local pos = nil if LocalPlayer():Team() == TEAM_RED then pos = GAMEMODE:GetRocket(TEAM_RED):GetPos() + Vector(0,0,1500) //cam.Start3D2D( pos, Angle(0, 0, 0), 1 ) pos = pos:ToScreen() surface.SetTexture(rocket_arrow_red) table.insert(circle_radar_table, GAMEMODE:GetRocket(TEAM_RED)) else pos = GAMEMODE:GetRocket(TEAM_BLUE):GetPos() + Vector(0,0,1500) //cam.Start3D2D( pos, Angle(0, 0, 0), 1 ) pos = pos:ToScreen() surface.SetTexture(rocket_arrow_blue) table.insert(circle_radar_table, GAMEMODE:GetRocket(TEAM_BLUE)) end pos.y = pos.y + (math.sin(CurTime() * 5) * 2) //surface.DrawTexturedRect(pos.x - 8,pos.y - 8, 16,16) //surface.DrawTexturedRect(0,0, 16,16) //cam.End3D2D() else for k,v in pairs(ents.FindByClass("df_fuel_pod")) do local insert = true; if v:GetTeam() == LocalPlayer():Team() then // and !ValidEntity(v.dt.OwnerPlane) then insert = false; end if plane:GetPos():Distance(v:GetPos()) > 15000 then insert = false end if insert then table.insert(circle_radar_table, v) end end end for k,v in pairs(ents.FindByClass("df_plane")) do local insert = true if plane == v then insert = false end if plane:GetPos():Distance(v:GetPos()) > 8000 then insert = false end if plane:GetCloaked() then insert = false end if insert then table.insert(circle_radar_table, v) end end //Circular Radar local radius = 64 for k,ent in pairs(circle_radar_table) do local dir = (plane:GetPos() - ent:GetPos()):Normalize() dir = dir:Angle() - plane:GetAngles() dir.p = math.NormalizeAngle(dir.p) dir.y = math.NormalizeAngle(dir.y) dir.r = math.NormalizeAngle(dir.r) local ts = ent:GetPos():ToScreen() local vis = (ts.x < W and ts.x > 0) and (ts.y > 0 and ts.y < H) if !vis then local x = math.sin(math.rad(dir.y)) * radius; local y = math.cos(math.rad(dir.y)) * radius; if ent:GetTeam() == TEAM_RED then surface.SetTexture(rocket_arrow_red) elseif ent:GetTeam() == TEAM_BLUE then surface.SetTexture(rocket_arrow_blue) else surface.SetTexture(rocket_arrow_neut) end surface.DrawTexturedRectRotated( cross_pos.x + x, cross_pos.y + y, 16, 16, dir.y ) end end //Target direction surface.SetDrawColor(0,0,0,255) local pos = plane:GetPos() + (LocalPlayer():GetAimVector() * 1090) pos = pos:ToScreen() surface.DrawLine( pos.x - cross_size, pos.y, pos.x + cross_size, pos.y ) surface.DrawLine( pos.x, pos.y - cross_size, pos.x, pos.y + cross_size ) //AIRSPEED METER local planespeed = plane:WorldToLocal(plane:GetVelocity()+plane:GetPos()) planespeed.x = planespeed.x / 26 * 4 local rot = 90 - (planespeed.x / 175) * 360 if rot < -265 then rot = -265 + math.random(-5,5) end local x = W - 200 local y = H - 200 surface.SetTexture(airspeed_tex) surface.SetDrawColor(255,255,255,255) surface.DrawTexturedRect( x, y, 200, 200 ) if plane.dt.EMPOn then rot = math.random(0,360) end surface.SetTexture(alt_tex_arrow) surface.SetDrawColor(255,255,255,255) surface.DrawTexturedRectRotated( x + 100, y + 100, 200, 250, rot ) x = 50 //ALTITUDE METER surface.SetTexture(alt_tex) surface.DrawTexturedRect( x, y, 200, 200 ) local sea = GetGlobalInt("sea_level",800) local alt = (plane:GetPos().z - sea) / 7 local rot = 90 - alt if plane.dt.EMPOn then rot = math.random(0,360) end surface.SetTexture(alt_tex_arrow) surface.DrawTexturedRectRotated( x + 100, y + 100, 200, 250, rot ) rot = 90 - (alt / 7) if plane.dt.EMPOn then rot = math.random(0,360) end surface.SetTexture(alt_tex_arrow) surface.DrawTexturedRectRotated( x + 100, y + 100, 160, 250, rot ) //BOOST METER x = W - 240 y = H - 110 surface.SetTexture(boost_tex) surface.DrawTexturedRect( x, y, 100, 100 ) local targ_rot = 90 - (plane:GetBoost() / 100) * 360 local rot = math.Approach(old_boost_rot, targ_rot, math.abs(old_boost_rot - targ_rot) / 2) old_boost_rot = rot if plane.dt.EMPOn then rot = math.random(0,360) end surface.SetTexture(alt_tex_arrow) surface.DrawTexturedRectRotated( x + 50, y + 50, 100, 150, rot ) //HEALTH METER x = 190 surface.SetTexture(health_tex) surface.DrawTexturedRect( x, y, 100, 100 ) local targ_rot = 90 - ((100 - plane:GetDamage()) / 100) * 360 local rot = math.Approach(old_health_rot, targ_rot, 5) old_health_rot = rot if plane.dt.EMPOn then rot = math.random(0,360) end surface.SetTexture(alt_tex_arrow) surface.DrawTexturedRectRotated( x + 50, y + 50, 100, 150, rot ) if ValidEntity(LocalPlayer():GetCurrentWeapon()) and LocalPlayer():GetCurrentWeapon().DrawWeaponHUD then LocalPlayer():GetCurrentWeapon():DrawWeaponHUD() end end function GM:PostDrawOpaqueRenderables() if !self.DrawHud then return end if GetConVarNumber("cl_drawhud") == 0 then return end local plane = LocalPlayer():GetPlane() if !ValidEntity(plane) then return end render.SuppressEngineLighting( true ) render.SetAmbientLight( 1, 1, 1 ) render.SetColorModulation( 1, 1, 1 ) if LocalPlayer():GetPlane():GetHasFuelPod() then //FUEL CARRIER HUD local pos = nil if LocalPlayer():Team() == TEAM_RED then pos = GAMEMODE:GetRocket(TEAM_RED):GetPos() + Vector(0,0,1400) local face_dir = (plane:GetPos() - pos):Angle() local ang = Angle(0,face_dir.y + 90,90) cam.Start3D2D( pos, ang, 4 ) surface.SetTexture(rocket_arrow_red) else pos = GAMEMODE:GetRocket(TEAM_BLUE):GetPos() + Vector(0,0,1400) local face_dir = (plane:GetPos() - pos):Angle() local ang = Angle(0,face_dir.y + 90,90) cam.Start3D2D( pos, ang, 4 ) surface.SetTexture(rocket_arrow_blue) end surface.DrawTexturedRect(- 8,- 8, 16,16) cam.End3D2D() end render.SuppressEngineLighting( false ) end local CenterMessageList = {} function GM:DrawCenterMessages() for k,event in pairs(CenterMessageList) do if k == 1 and !event.Start then event.Start = CurTime() end local alp = 0 local time_passed = nil if k == 1 then if #CenterMessageList > 6 then event.Time = 0.25 end time_passed = event.Start + event.Time - CurTime() alp = math.Clamp(time_passed / event.Time,0,1) * 255 else alp = 25 end draw.SimpleTextOutlined( event.Text, "rocket_nums", W * 0.5, 150 + (k-1) * 30, Color(251,200,37,alp), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 2, Color(10,10,10,alp) ) if alp < 25 then table.remove(CenterMessageList,1) end end end function GM:CenterMessage(text, tim) print(text) if !text then return end local tab = {} tab.Start = nil tab.Text = text tab.Time = tim table.insert(CenterMessageList, tab) end function MessageCenter(um) local text = um:ReadString() if !text or text == "" then return end local showtime = um:ReadShort() if !showtime then showtime = 3 end local urgency = um:ReadShort() if urgency == 1 then surface.PlaySound("buttons/blip1.wav") elseif urgency == 2 then surface.PlaySound("ambient/alarms/warningbell1.wav") elseif urgency == 3 then surface.PlaySound("npc/attack_helicopter/aheli_megabomb_siren1.wav") end GAMEMODE:CenterMessage(text, showtime) end usermessage.Hook("df_centertext", MessageCenter) function GM:PlayerBindPress(ply, bind, pressed) for i=1,10 do if bind == "slot"..i then RunConsoleCommand("df_useslot", i) self:StopHint("WepSelect1") self:StopHint("WepSelect2") end if bind == "invnext" then local found = false local all_weps = LocalPlayer():GetAllWeapons() for k,v in pairs(all_weps) do if v == LocalPlayer():GetCurrentWeapon() then local slot = k + 1 if slot > #all_weps then slot = 1 end RunConsoleCommand("df_useslot",slot) found = true end end if !found and #all_weps > 0 then RunConsoleCommand("df_useslot", 1) //try and get the first weapon end end if bind == "invprev" then local found = false local all_weps = LocalPlayer():GetAllWeapons() for k,v in pairs(all_weps) do if v == LocalPlayer():GetCurrentWeapon() then local slot = k - 1 if slot <= 0 then slot = #all_weps end RunConsoleCommand("df_useslot",slot) found = true end end if !found and #all_weps > 0 then RunConsoleCommand("df_useslot", 1) //try and get the first weapon end end end end function OnBulletHit(um) surface.PlaySound("physics/metal/metal_sheet_impact_soft2.wav") end usermessage.Hook("df_bullet_hit", OnBulletHit) local pixelvisible = util.GetPixelVisibleHandle() //A million thanks to Capsadmin! function EasySunbeams(position, distance, amount, size) if EyePos():Distance(position) > distance then return end local visible = util.PixelVisible(position, 150, pixelvisible) if visible > 0 then local dotProduct = math.Clamp(LocalPlayer():GetAimVector():DotProduct((position-EyePos()):Normalize())-0.5, 0, 1) * 2 local distance = math.Clamp((position-EyePos()):Length() / -distance + 1, 0, 1) local screenPos = position:ToScreen() DrawSunbeams( 0, (amount*dotProduct*visible)*distance, size*math.abs(distance*-1+1), screenPos.x / ScrW(), screenPos.y / ScrH()) end end --[[ local blur_amount = 0 function GM:RenderScreenspaceEffects() local am = math.Clamp(boost_start - CurTime(),0,5) local plane = LocalPlayer():GetPlane() if ValidEntity(plane) and plane:GetVelocity():Length() > shake_speed then am = am + (plane:GetVelocity():Length() * 0.001) end blur_amount = math.Approach(blur_amount, am, 0.01) print(blur_amount) DrawMotionBlur( blur_amount * 0.1, blur_amount, 0 ) end ]] function GM:RenderScreenspaceEffects() local am = math.Clamp(boost_start - CurTime(),0,5) local plane = LocalPlayer():GetPlane() if ValidEntity(plane) and plane:GetVelocity():Length() > shake_speed then am = am + (plane:GetVelocity():Length() * 0.0001) end if am <=0 then target_camera_distance = GetConVarNumber("df_camdist") end DrawMotionBlur( 0.1, am, 0 ) end function start_boost(um) target_camera_distance = GetConVarNumber("df_camdist") + 50 boost_start = CurTime() + um:ReadFloat() end usermessage.Hook("df_boost",start_boost) //Little boost from doing aerobatic events