284 lines
9.0 KiB
Lua
284 lines
9.0 KiB
Lua
local QBCore = exports['qb-core']:GetCoreObject()
|
|
--===================================================
|
|
-- LOCALS
|
|
--===================================================
|
|
local currentJob = {}
|
|
local onJob = false
|
|
local onDelivery = false
|
|
local goPostalVehicle = nil
|
|
local currentJobPay = 0
|
|
local totalpayamount = 0
|
|
local MaxDelivery = 0
|
|
local PackageObject = nil
|
|
local missionblip = nil
|
|
local isDeliverySignedIn = false
|
|
local PlayerJob = {}
|
|
--===================================================
|
|
-- CONFIG
|
|
--===================================================
|
|
local locations = Config.deliveryLocations
|
|
local vehicleSpawnLocations = Config.vehicleSpawnLocations
|
|
--===================================================
|
|
-- FUNCTIONS
|
|
--===================================================
|
|
CreateThread(function()
|
|
local bCfg = Config.blip
|
|
PostalBlip = AddBlipForCoord(bCfg.coords)
|
|
SetBlipSprite(PostalBlip, bCfg.sprite)
|
|
SetBlipScale(PostalBlip, bCfg.scale)
|
|
SetBlipDisplay(PostalBlip, 4)
|
|
SetBlipColour(PostalBlip, bCfg.color)
|
|
SetBlipAsShortRange(PostalBlip, true)
|
|
BeginTextCommandSetBlipName("STRING")
|
|
AddTextComponentString(bCfg.label)
|
|
EndTextCommandSetBlipName(PostalBlip)
|
|
end)
|
|
|
|
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
|
|
PlayerJob = QBCore.Functions.GetPlayerData().job
|
|
end)
|
|
|
|
RegisterNetEvent('QBCore:Client:OnJobUpdate', function()
|
|
PlayerJob = QBCore.Functions.GetPlayerData().job
|
|
end)
|
|
|
|
AddEventHandler('onResourceStart', function(resourceName)
|
|
if GetCurrentResourceName() == resourceName then
|
|
PlayerJob = QBCore.Functions.GetPlayerData().job
|
|
end
|
|
end)
|
|
|
|
function NewDeliveryShift()
|
|
if MaxDelivery >= 0 then
|
|
local jobLocation = locations[math.random(1, #locations)]
|
|
SetDeliveryJobBlip(jobLocation[1], jobLocation[2], jobLocation[3])
|
|
currentJob = jobLocation
|
|
currentJobPay = CalculateTravelDistanceBetweenPoints(GetEntityCoords(goPostalVehicle), currentJob[1],
|
|
currentJob[2], currentJob[3]) / 2 / 4
|
|
if currentJobPay > 60 then
|
|
currentJobPay = math.random(1200, 1500)
|
|
end
|
|
QBCore.Functions.Notify("Kør til næste leverings punkt!")
|
|
else
|
|
onJob = false
|
|
RemoveJobBlip()
|
|
SetNewWaypoint(-425.44, -2787.76, 6.0)
|
|
QBCore.Functions.Notify("Du er færdig! Kør tilbage til depottet.")
|
|
end
|
|
end
|
|
|
|
function SpawnGoPostal(x, y, z, h)
|
|
local vehicleHash = GetHashKey(Config.vehicleModel)
|
|
RequestModel(vehicleHash)
|
|
while not HasModelLoaded(vehicleHash) do
|
|
Wait(0)
|
|
end
|
|
goPostalVehicle = CreateVehicle(vehicleHash, x, y, z, h, true, false)
|
|
local id = NetworkGetNetworkIdFromEntity(goPostalVehicle)
|
|
SetNetworkIdCanMigrate(id, true)
|
|
SetNetworkIdExistsOnAllMachines(id, true)
|
|
SetVehicleDirtLevel(goPostalVehicle, 0)
|
|
SetVehicleHasBeenOwnedByPlayer(goPostalVehicle, true)
|
|
SetEntityAsMissionEntity(goPostalVehicle, true, true)
|
|
SetVehicleEngineOn(goPostalVehicle, true)
|
|
SetVehicleColours(goPostalVehicle, 131, 74)
|
|
TaskWarpPedIntoVehicle(PlayerPedId(), goPostalVehicle, -1)
|
|
TriggerEvent('vehiclekeys:client:SetOwner', GetVehicleNumberPlateText(goPostalVehicle))
|
|
exports['qb-fuel']:SetFuel(goPostalVehicle, 100.0)
|
|
end
|
|
|
|
function getParkingPosition(spots)
|
|
for id, v in pairs(spots) do
|
|
if GetClosestVehicle(v.x, v.y, v.z, 3.0, 0, 70) == 0 then
|
|
return true, v
|
|
end
|
|
end
|
|
QBCore.Functions.Notify("Parkeringspladsen er fuld, vent venligst.")
|
|
end
|
|
|
|
function SetDeliveryJobBlip(x, y, z)
|
|
if DoesBlipExist(missionblip) then RemoveBlip(missionblip) end
|
|
missionblip = AddBlipForCoord(x, y, z)
|
|
SetBlipSprite(missionblip, 164)
|
|
SetBlipColour(missionblip, 53)
|
|
SetNewWaypoint(x, y)
|
|
BeginTextCommandSetBlipName("STRING")
|
|
AddTextComponentString("Destination")
|
|
EndTextCommandSetBlipName(missionblip)
|
|
end
|
|
|
|
function RemoveJobBlip()
|
|
if DoesBlipExist(missionblip) then RemoveBlip(missionblip) end
|
|
end
|
|
|
|
function LoadAnim(animDict)
|
|
RequestAnimDict(animDict)
|
|
while not HasAnimDictLoaded(animDict) do
|
|
Wait(10)
|
|
end
|
|
end
|
|
|
|
function LoadModel(model)
|
|
RequestModel(model)
|
|
while not HasModelLoaded(model) do
|
|
Wait(10)
|
|
end
|
|
end
|
|
|
|
--===================================================
|
|
-- JOB WORK
|
|
--===================================================
|
|
|
|
CreateThread(function()
|
|
local pedModel = GetHashKey(Config.pedModel)
|
|
RequestModel(pedModel)
|
|
while not HasModelLoaded(pedModel) do
|
|
Wait(1)
|
|
end
|
|
local ped = CreatePed(4, pedModel, Config.pedCoords.x, Config.pedCoords.y, Config.pedCoords.z,
|
|
Config.pedCoords.w, false, false)
|
|
SetBlockingOfNonTemporaryEvents(ped, true)
|
|
SetPedDiesWhenInjured(ped, false)
|
|
SetEntityHeading(ped, Config.pedCoords.w)
|
|
SetPedCanPlayAmbientAnims(ped, true)
|
|
SetPedCanRagdollFromPlayerImpact(ped, false)
|
|
SetEntityInvincible(ped, true)
|
|
FreezeEntityPosition(ped, true)
|
|
|
|
if PlayerJob.name == Config.JobName then
|
|
exports['qb-target']:AddTargetModel('s_m_m_postal_01', {
|
|
options = {
|
|
{
|
|
type = "client",
|
|
event = "cad-postalop:startwork",
|
|
icon = "fas fa-sign-in-alt",
|
|
label = "Gå på arbejde",
|
|
canInteract = function(entity, data)
|
|
return not isDeliverySignedIn
|
|
end,
|
|
},
|
|
{
|
|
type = "client",
|
|
event = "cad-postalop:finishwork",
|
|
icon = "fas fa-money-check-alt",
|
|
label = "Modtag løn og afslut arbejde",
|
|
canInteract = function(entity, data)
|
|
return isDeliverySignedIn
|
|
end,
|
|
},
|
|
},
|
|
distance = 1.5
|
|
})
|
|
end
|
|
exports['qb-target']:AddTargetBone('boot', {
|
|
options = {
|
|
{
|
|
type = "client",
|
|
event = "cad-postalop:takepackage",
|
|
icon = "fas fa-box",
|
|
label = "Tag pakke",
|
|
canInteract = function(entity, data)
|
|
return onJob and (entity == goPostalVehicle)
|
|
end,
|
|
}
|
|
},
|
|
distance = 2.5,
|
|
})
|
|
|
|
end)
|
|
|
|
CreateThread(function()
|
|
while true do
|
|
local inRange = false
|
|
if isDeliverySignedIn then
|
|
if (GetDistanceBetweenCoords(GetEntityCoords(PlayerPedId()), currentJob[1], currentJob[2], currentJob[3], true) < 50) and onJob and onDelivery then
|
|
inRange = true
|
|
DrawMarker(2, currentJob[1], currentJob[2], currentJob[3], 0, 0, 0, 0, 0, 0, 0.3, 0.2, -0.2, 100, 100,
|
|
155, 255, true, true, 0, 0)
|
|
if (GetDistanceBetweenCoords(GetEntityCoords(PlayerPedId()), currentJob[1], currentJob[2], currentJob[3], true) < 1.5) and onJob and onDelivery then
|
|
LoadAnim("creatures@rottweiler@tricks@")
|
|
TaskPlayAnim(PlayerPedId(), "creatures@rottweiler@tricks@", "petting_franklin", 8.0, 8.0, -1, 50, 0,
|
|
false, false, false)
|
|
FreezeEntityPosition(PlayerPedId(), true)
|
|
Wait(5000)
|
|
DeleteObject(PackageObject)
|
|
FreezeEntityPosition(PlayerPedId(), false)
|
|
ClearPedTasksImmediately(PlayerPedId())
|
|
PackageObject = nil
|
|
onDelivery = false
|
|
totalpayamount = totalpayamount + currentJobPay
|
|
MaxDelivery = MaxDelivery - 1
|
|
NewDeliveryShift()
|
|
end
|
|
end
|
|
end
|
|
if not inRange then
|
|
Wait(1000)
|
|
end
|
|
Wait(4)
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('cad-postalop:startwork', function()
|
|
if not isDeliverySignedIn and not onJob then
|
|
if not DoesEntityExist(goPostalVehicle) then
|
|
local freespot, v = getParkingPosition(vehicleSpawnLocations)
|
|
if freespot then SpawnGoPostal(v.x, v.y, v.z, v.h) end
|
|
MaxDelivery = math.random(2, 8)
|
|
NewDeliveryShift()
|
|
onJob = true
|
|
isDeliverySignedIn = true
|
|
else
|
|
QBCore.Functions.Notify("Du har allerede et køretøj!")
|
|
end
|
|
else
|
|
QBCore.Functions.Notify("Du er allerede igang med et job, færdiggør det først.")
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('cad-postalop:takepackage', function()
|
|
if not onDelivery and onJob and not IsPedInAnyVehicle(PlayerPedId()) and GetDistanceBetweenCoords(GetEntityCoords(PlayerPedId()), currentJob[1], currentJob[2], currentJob[3], true) < 40 then
|
|
LoadModel("hei_prop_heist_box")
|
|
local pos = GetEntityCoords(PlayerPedId(), false)
|
|
PackageObject = CreateObject(GetHashKey("hei_prop_heist_box"), pos.x, pos.y, pos.z, true, true, true)
|
|
AttachEntityToEntity(PackageObject, PlayerPedId(), GetPedBoneIndex(PlayerPedId(), 28422), 0.0, -0.03, 0.0, 5.0,
|
|
0.0, 0.0, 1, 1, 0, 1, 0, 1)
|
|
LoadAnim("anim@heists@box_carry@")
|
|
TaskPlayAnim(PlayerPedId(), "anim@heists@box_carry@", "idle", 8.0, 8.0, -1, 50, 0, false, false, false)
|
|
onDelivery = true
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('cad-postalop:finishwork', function()
|
|
if isDeliverySignedIn then
|
|
if not onJob then
|
|
if DoesEntityExist(goPostalVehicle) then
|
|
DeleteVehicle(goPostalVehicle)
|
|
RemoveJobBlip()
|
|
if IsVehicleDamaged(goPostalVehicle) then
|
|
totalpayamount = totalpayamount - 1000
|
|
QBCore.Functions.Notify("Din lastbil blev beskadiget, du er blevet trukket 1000,- for at dække skaderne.")
|
|
end
|
|
isDeliverySignedIn = false
|
|
onJob = false
|
|
TriggerServerEvent('cad-delivery:cash', totalpayamount, 0)
|
|
Wait(500)
|
|
totalpayamount = 0
|
|
else
|
|
isDeliverySignedIn = false
|
|
onJob = false
|
|
QBCore.Functions.Notify("Den lastbil var altså dyr... Du får ingen løn denne omgang.")
|
|
end
|
|
else
|
|
QBCore.Functions.Notify("Du er nødt til at afslutte dit job først.")
|
|
end
|
|
else
|
|
QBCore.Functions.Notify("Gå på arbejde før du kan få dine penge!")
|
|
end
|
|
end)
|
|
|
|
|
|
--===================================================
|
|
-- END
|
|
--===================================================s
|