local QBCore = exports['qb-core']:GetCoreObject() local waitingTakeOff = 0 -- Don't touch. CreateThread(function() local blip = AddBlipForCoord(1742.21, 3295.82, 41.11) SetBlipSprite(blip, 94) SetBlipColour(blip, 2) SetBlipScale(blip, 0.65) SetBlipAsShortRange(blip, true) BeginTextCommandSetBlipName("STRING") AddTextComponentString("Skydiving") EndTextCommandSetBlipName(blip) end) local function drawTxt(text, font, x, y, scale, r, g, b, a) SetTextFont(font) SetTextScale(scale, scale) SetTextColour(r, g, b, a) SetTextOutline() SetTextCentre(1) SetTextEntry("STRING") AddTextComponentString(text) DrawText(x, y) end local function startTimer(Time) -- Shoutout to qb-vehicleshop for having this countdown timer function I could yoink. local gameTimer = GetGameTimer() CreateThread(function() while waitingTakeOff do if GetGameTimer() < gameTimer + tonumber(1000 * Time) then local secondsLeft = GetGameTimer() - gameTimer drawTxt("TID TIL TAKE OFF: " .. math.ceil(Time - secondsLeft / 1000), 4, 0.5, 0.93, 0.50, 255, 255, 255, 180) end Wait(0) end end) end AddEventHandler('onResourceStart', function(resourceName) if GetCurrentResourceName() == resourceName then AirfieldPilot() end end) RegisterNetEvent("QBCore:Client:OnPlayerLoaded") AddEventHandler("QBCore:Client:OnPlayerLoaded", function() AirfieldPilot() end) function AirfieldPilot() if not DoesEntityExist(igpilot) then RequestModel("ig_pilot") while not HasModelLoaded("ig_pilot") do Wait(0) end igpilot = CreatePed(4, "ig_pilot" , 1742.58, 3296.68, 40.14, 196.03, false, false) SetEntityAsMissionEntity(igpilot) SetBlockingOfNonTemporaryEvents(igpilot, true) SetEntityInvincible(igpilot, true) FreezeEntityPosition(igpilot, true) TaskStartScenarioInPlace(igpilot, "WORLD_HUMAN_CLIPBOARD", 0, true) exports['qb-target']:AddTargetEntity(igpilot, { options = { { type = "server", event = "qb-skydive:server:payforgroup", icon = "fa-solid fa-user-group", label = "Gruppe Skydive (750,-)", }, { type = "client", event = "qb-skydive:client:ridewithbuddy", icon = "fa-solid fa-user-group", label = "Join Venner", }, { type = "server", event = "qb-skydive:server:solojump", icon = "fa-solid fa-parachute-box", label = "Solo Hop", } }, distance = 2.5, }) end end --- GROUP FLIGHT RegisterNetEvent('qb-skydive:client:skydivetime') AddEventHandler('qb-skydive:client:skydivetime', function() local Ped = PlayerPedId() DoScreenFadeOut(2000) Wait(4000) planeHK = GetHashKey("mammatus") pilotHK = GetHashKey("s_m_m_pilot_01") RequestModel(planeHK) while not HasModelLoaded(planeHK) do Wait(0) end RequestModel(pilotHK) while not HasModelLoaded(pilotHK) do Wait(0) end if HasModelLoaded(planeHK) and HasModelLoaded(pilotHK) then local Skydive = CreateVehicle(planeHK, 1738.58, 3283.2, 41.11, 191.1, true, false) exports[Config.FuelExport]:SetFuel(Skydive, 100.0) SetEntityAsMissionEntity(Skydive, true, true) SetModelAsNoLongerNeeded(Skydive) TriggerEvent("vehiclekeys:client:SetOwner", GetVehicleNumberPlateText(vehicle)) SetVehicleEngineOn(SkyDive, true, true) local pilot = CreatePedInsideVehicle(Skydive, 6, pilotHK, -1, true, false) Wait(500) SetPedIntoVehicle(Ped, Skydive, 2) TriggerServerEvent('qb-skydive:flightcooldown') -- Triggers global cooldown GiveWeaponToPed(Ped, GetHashKey("GADGET_PARACHUTE"), true) SetBlockingOfNonTemporaryEvents(pilot, true) SetPedCanBeDraggedOut(pilot, false) SetDriverAbility(pilot, 1.0) SetDriverAggressiveness(pilot, 0.0) DoScreenFadeIn(2000) startTimer(0.5 * 60) -- 30 seconds - Don't touch. Wait(30000) -- Time until it takes off. (Gives friends time to join) - Don't touch. TaskVehicleDriveToCoord(pilot, Skydive, 1122.66, 3094.08, 40.41, 30.0, 0, 1341619767, 786603, 1, true) Wait(28000) -- Give pilot time to go down the runway before switching route. TaskVehicleDriveToCoord(pilot, Skydive, -817.27, 4563.03, 1431.49, 253.07, 0, 1341619767, 4457279, 1, true) Wait(90000) -- Time spent in the air getting to destination before parachuting. SetAmbientVoiceName(pilot, "BRAD") PlayAmbientSpeech1(pilot, "GET_OUT_OF_HERE", "SPEECH_PARAMS_FORCE_NORMAL") Wait(3000) DeletePed(pilot) QBCore.Functions.DeleteVehicle(Skydive) end end) ----------- SOLO JUMP ------------- RegisterNetEvent('qb-skydive:client:skydivesolo') AddEventHandler('qb-skydive:client:skydivesolo', function() local Ped = PlayerPedId() DoScreenFadeOut(2000) Wait(4000) planeHK = GetHashKey("dodo") pilotHK = GetHashKey("s_m_m_pilot_01") RequestModel(planeHK) while not HasModelLoaded(planeHK) do Wait(0) end RequestModel(pilotHK) while not HasModelLoaded(pilotHK) do Wait(0) end if HasModelLoaded(planeHK) and HasModelLoaded(pilotHK) then Skydive = CreateVehicle(planeHK, -2024.23, 4983.37, 968.92, 246.51, true, false) SetPedIntoVehicle(Ped, Skydive, 2) GiveWeaponToPed(Ped, GetHashKey("GADGET_PARACHUTE"), true) exports[Config.FuelExport]:SetFuel(Skydive, 100.0) SetEntityAsMissionEntity(Skydive, true, true) SetModelAsNoLongerNeeded(Skydive) TriggerEvent("vehiclekeys:client:SetOwner", GetVehicleNumberPlateText(vehicle)) SetVehicleEngineOn(SkyDive, true, true) pilot = CreatePedInsideVehicle(Skydive, 6, pilotHK, -1, true, false) Wait(500) TriggerServerEvent('qb-skydive:flightcooldown') SetBlockingOfNonTemporaryEvents(pilot, true) SetPedCanBeDraggedOut(pilot, false) SetDriverAbility(pilot, 1.0) SetDriverAggressiveness(pilot, 0.0) TaskVehicleDriveToCoord(pilot, Skydive, 1201.69, 2700.12, 1450.0, 230.0, 0, 1341619767, 4457279, 1, true) DoScreenFadeIn(2000) Wait(30000) SetAmbientVoiceName(pilot, "BRAD") PlayAmbientSpeech1(pilot, "GET_OUT_OF_HERE", "SPEECH_PARAMS_FORCE_NORMAL") Wait(3000) TaskLeaveVehicle(Ped, Skydive, 64) Wait(10000) DeletePed(pilot) QBCore.Functions.DeleteVehicle(Skydive) end end) -- Event to ride with buddies. RegisterNetEvent('qb-skydive:client:ridewithbuddy') AddEventHandler('qb-skydive:client:ridewithbuddy', function() local friends = PlayerPedId() local friendsCoords = GetEntityCoords(friends) local vehicles = GetGamePool("CVehicle") local foundVehicle = nil for k, v in pairs(vehicles) do if v ~= 0 then local vehPos = GetEntityCoords(v) local dist = #(friendsCoords - vehPos) if GetEntityModel(v) == `mammatus` and dist < 20.0 then foundVehicle = v break end end end if foundVehicle == nil then QBCore.Functions.Notify("Ingen har betalt for gruppen endnu!", 'error') return end local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(foundVehicle) for i=maxSeats - 1, 0, -1 do if IsVehicleSeatFree(foundVehicle, i) then freeSeat = i break end end SetPedIntoVehicle(friends, foundVehicle, freeSeat) GiveWeaponToPed(friends, GetHashKey("GADGET_PARACHUTE"), true) end) function DeletePilot() if DoesEntityExist(igpilot) then DeletePed(igpilot) end end AddEventHandler('onResourceStop', function(resourceName) if GetCurrentResourceName() == resourceName then DeletePilot() end end) RegisterNetEvent('QBCore:Client:OnPlayerUnload') AddEventHandler('QBCore:Client:OnPlayerUnload', function() DeletePilot() end)