422 lines
14 KiB
Lua
422 lines
14 KiB
Lua
|
local QBCore = exports['qb-core']:GetCoreObject()
|
||
|
|
||
|
local InStartOption = nil
|
||
|
local InShopOption = nil
|
||
|
local collected = false
|
||
|
local pedinveh = false
|
||
|
local GotJob = false
|
||
|
local prop = nil
|
||
|
local PackageDelivered = false
|
||
|
local deliveredboxes = 0
|
||
|
local InReturn = nil
|
||
|
local VehicleReturned = false
|
||
|
local data = {}
|
||
|
local PlayerJob = {}
|
||
|
local Zone
|
||
|
local ReturnZone
|
||
|
|
||
|
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)
|
||
|
|
||
|
CreateThread(function()
|
||
|
PedBlip = AddBlipForCoord(Config.JobPedLocation)
|
||
|
SetBlipSprite(PedBlip, 304)
|
||
|
SetBlipColour(PedBlip, 32)
|
||
|
SetBlipAsShortRange(PedBlip, true)
|
||
|
SetBlipScale(PedBlip, 0.5)
|
||
|
BeginTextCommandSetBlipName("STRING")
|
||
|
AddTextComponentSubstringPlayerName(Config.JobBlipName)
|
||
|
EndTextCommandSetBlipName(PedBlip)
|
||
|
QBCore.Functions.LoadModel(Config.JobPed)
|
||
|
local startloc = Config.JobPedLocation
|
||
|
local ped = CreatePed(0, Config.JobPed, startloc.x, startloc.y, startloc.z-1.0, startloc.w, false, false)
|
||
|
TaskStartScenarioInPlace(ped, 'WORLD_HUMAN_CLIPBOARD', true)
|
||
|
FreezeEntityPosition(ped, true)
|
||
|
SetEntityInvincible(ped, true)
|
||
|
SetBlockingOfNonTemporaryEvents(ped, true)
|
||
|
|
||
|
if Config.Interaction == 'target' then
|
||
|
if PlayerJob.name == Config.JobName then
|
||
|
exports['qb-target']:AddTargetEntity(ped, {
|
||
|
options = {
|
||
|
{
|
||
|
icon = 'fas fa-circle',
|
||
|
label = 'Gå på arbejde',
|
||
|
canInteract = function()
|
||
|
if not GotJob then return true end
|
||
|
return false
|
||
|
end,
|
||
|
action = function()
|
||
|
Checkin()
|
||
|
end,
|
||
|
},
|
||
|
{
|
||
|
icon = 'fas fa-circle',
|
||
|
label = 'Få løn',
|
||
|
canInteract = function()
|
||
|
if VehicleReturned then return true end
|
||
|
return false
|
||
|
end,
|
||
|
action = function()
|
||
|
JobFinish()
|
||
|
end,
|
||
|
},
|
||
|
{
|
||
|
type = 'client',
|
||
|
icon = 'fas fa-circle',
|
||
|
label = 'Returner køretøj',
|
||
|
event = 'kevin-deliveries:Return',
|
||
|
canInteract = function()
|
||
|
if PackageDelivered then return true end
|
||
|
return false
|
||
|
end,
|
||
|
},
|
||
|
},
|
||
|
distance = 2.0
|
||
|
})
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('kevin-deliveries:start', function ()
|
||
|
Checkin()
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('kevin-deliveries:finish', function ()
|
||
|
JobFinish()
|
||
|
end)
|
||
|
|
||
|
function Checkin()
|
||
|
if Config.JobNeeded == 'true' then
|
||
|
if PlayerJob.name == Config.JobName then
|
||
|
if Config.UseCoolDown == 'true' then
|
||
|
QBCore.Functions.TriggerCallback("kevin-deliveries:coolc",function(isCooldown)
|
||
|
if not isCooldown then
|
||
|
if not GotJob then
|
||
|
StartRun()
|
||
|
end
|
||
|
else
|
||
|
QBCore.Functions.Notify("Der er ikke flere leveringer, kom tilbage senere", 'error')
|
||
|
end
|
||
|
end)
|
||
|
else
|
||
|
if not GotJob then
|
||
|
StartRun()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if Config.UseCoolDown == 'true' then
|
||
|
QBCore.Functions.TriggerCallback("kevin-deliveries:coolc",function(isCooldown)
|
||
|
if not isCooldown then
|
||
|
if not GotJob then
|
||
|
StartRun()
|
||
|
end
|
||
|
else
|
||
|
QBCore.Functions.Notify("Der er ikke flere leveringer, kom tilbage senere", 'error')
|
||
|
end
|
||
|
end)
|
||
|
else
|
||
|
if not GotJob then
|
||
|
StartRun()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SetTrunkItemInfo()
|
||
|
local items = {}
|
||
|
for k, item in pairs(Config.TrunkItems) do
|
||
|
local itemInfo = QBCore.Shared.Items[item.name:lower()]
|
||
|
items[item.slot] = {
|
||
|
name = itemInfo['name'],
|
||
|
amount = givenboxes,
|
||
|
info = item.info,
|
||
|
label = itemInfo['label'],
|
||
|
description = itemInfo['description'] and itemInfo['description'] or '',
|
||
|
weight = itemInfo['weight'],
|
||
|
type = itemInfo['type'],
|
||
|
unique = itemInfo['unique'],
|
||
|
useable = itemInfo['useable'],
|
||
|
image = itemInfo['image'],
|
||
|
slot = item.slot,
|
||
|
}
|
||
|
end
|
||
|
Config.TrunkItems = items
|
||
|
end
|
||
|
|
||
|
function StartRun()
|
||
|
local vehspawn = Config.VehicleSpawn
|
||
|
givenboxes = Config.Packages
|
||
|
if not IsAnyVehicleNearPoint(vehspawn.x, vehspawn.y, vehspawn.z, 3.0) then
|
||
|
GotJob = true
|
||
|
data = Config.ShopLocations[math.random(#Config.ShopLocations)]
|
||
|
TriggerEvent('qb-phone:client:CustomNotification', 'NUVÆRRENDE JOB', 'Du fik '..givenboxes..' pakker der skal leveres', 'fas fa-truck', '#83a9f7', 5500)
|
||
|
QBCore.Functions.LoadModel('mule2')
|
||
|
JobVeh = CreateVehicle('mule2', vehspawn.x, vehspawn.y, vehspawn.z, vehspawn.w, true, true)
|
||
|
SetVehicleLivery(JobVeh, data.VehicleLivery)
|
||
|
SetVehicleDirtLevel(JobVeh, 0)
|
||
|
exports['qb-fuel']:SetFuel(JobVeh, 100)
|
||
|
TaskWarpPedIntoVehicle(PlayerPedId(), JobVeh, -1)
|
||
|
SetTrunkItemInfo()
|
||
|
TriggerEvent('vehiclekeys:client:SetOwner', GetVehicleNumberPlateText(JobVeh))
|
||
|
SetVehicleEngineOn(JobVeh, true, true, false)
|
||
|
SetVehicleDoorsLocked(JobVeh, 1)
|
||
|
|
||
|
TriggerServerEvent('kevin-delivery:server:addTrunkItems', QBCore.Functions.GetPlate(JobVeh), Config.TrunkItems)
|
||
|
TriggerServerEvent("kevin-deliveries:coolout")
|
||
|
else
|
||
|
QBCore.Functions.Notify('Køretøj blokerer garagen', 'error')
|
||
|
end
|
||
|
|
||
|
if DoesEntityExist(JobVeh) and not pedinveh then
|
||
|
Wait(2500)
|
||
|
local dest = data.Zone[math.random(#data.Zone)]
|
||
|
DestBlip = AddBlipForCoord(dest.x, dest.y, dest.y)
|
||
|
SetBlipSprite(DestBlip, 304)
|
||
|
SetBlipColour(DestBlip, 32)
|
||
|
SetBlipRoute(DestBlip, true)
|
||
|
SetBlipRouteColour(DestBlip, 32)
|
||
|
SetBlipAsShortRange(DestBlip, false)
|
||
|
SetBlipScale(DestBlip, 0.75)
|
||
|
pedinveh = true
|
||
|
Deliver(dest)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
CreateThread(function()
|
||
|
while true do
|
||
|
if GotJob then
|
||
|
QBCore.Functions.TriggerCallback('kevin-deliveries:hasPackage', function(Package)
|
||
|
local ped = PlayerPedId()
|
||
|
local boxhash = data.BoxModel[math.random(#data.BoxModel)]
|
||
|
if Package then
|
||
|
if prop == nil then
|
||
|
HasBox = true
|
||
|
CarryAnimation()
|
||
|
prop = CreateObject(boxhash, 0, 0, 0, true, true, true)
|
||
|
AttachEntityToEntity(prop, ped, GetPedBoneIndex(ped, 0xEB95), 0.075, -0.10, 0.255, -130.0, 105.0, 0.0, true, true, false, false, 0, true)
|
||
|
DisableControls()
|
||
|
end
|
||
|
else
|
||
|
if prop ~= nil then
|
||
|
DeleteEntity(prop)
|
||
|
HasBox = false
|
||
|
prop = nil
|
||
|
ClearPedTasks(ped)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
Wait(1000)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
function DisableControls()
|
||
|
while true do
|
||
|
if HasBox then
|
||
|
DisableControlAction(0, 21, true ) -- sprinting
|
||
|
DisableControlAction(0, 22, true) -- Jumping
|
||
|
end
|
||
|
Wait(1)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function CarryAnimation()
|
||
|
LoadAnim('anim@heists@box_carry@')
|
||
|
TaskPlayAnim(PlayerPedId(), 'anim@heists@box_carry@', 'idle', 6.0, -6.0, -1, 49, 0, 0, 0, 0)
|
||
|
CreateThread( function ()
|
||
|
while HasBox do
|
||
|
if not IsEntityPlayingAnim(PlayerPedId(), 'anim@heists@box_carry@', 'idle', 3) then
|
||
|
TaskPlayAnim(PlayerPedId(), 'anim@heists@box_carry@', 'idle', 6.0, -6.0, -1, 49, 0, 0, 0, 0)
|
||
|
end
|
||
|
Wait(1000)
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function LoadAnim(dict)
|
||
|
while not HasAnimDictLoaded(dict) do
|
||
|
RequestAnimDict(dict)
|
||
|
Wait(1)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function Deliver(dest)
|
||
|
if GotJob then
|
||
|
if Config.Interaction == 'target' then
|
||
|
exports['qb-target']:AddBoxZone('BoxZoneName', vector3(dest.x, dest.y, dest.z), 3.5, 2.0, {
|
||
|
name='BoxZoneName',
|
||
|
heading= dest.w,
|
||
|
debugPoly= false,
|
||
|
-- minZ = 6.04,
|
||
|
-- maxZ = 7.64,
|
||
|
}, {
|
||
|
options = {
|
||
|
{
|
||
|
type = 'client',
|
||
|
event = 'kevin-deliveries:Deliver',
|
||
|
icon = 'fas fa-circle',
|
||
|
label = 'Aflever pakke',
|
||
|
canInteract = function()
|
||
|
if not PackageDelivered and HasBox then return true end
|
||
|
return false
|
||
|
end,
|
||
|
},
|
||
|
},
|
||
|
distance = 2.0
|
||
|
})
|
||
|
elseif Config.Interaction == 'radialmenu' then
|
||
|
Zone = BoxZone:Create(vector3(dest.x, dest.y, dest.y), 3.5, 2.0, {
|
||
|
heading = dest.w,
|
||
|
name = 'Shop',
|
||
|
debugPoly = false,
|
||
|
-- minZ = 53.64,
|
||
|
-- maxZ = 56.24
|
||
|
})
|
||
|
Zone:onPlayerInOut(function(isPointInside)
|
||
|
if isPointInside and not PackageDelivered then
|
||
|
if HasBox then
|
||
|
InShopOption = exports['qb-radialmenu']:AddOption({
|
||
|
id = 'deliver-package',
|
||
|
title = 'Lever',
|
||
|
icon = 'box',
|
||
|
type = 'client',
|
||
|
event = 'kevin-deliveries:Deliver',
|
||
|
shouldClose = true
|
||
|
}, InShopOption)
|
||
|
--print('option added')
|
||
|
end
|
||
|
else
|
||
|
if InShopOption ~= nil then
|
||
|
exports['qb-radialmenu']:RemoveOption(InShopOption)
|
||
|
InShopOption = nil
|
||
|
--print('option removed')
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
RegisterNetEvent('kevin-deliveries:Deliver', function ()
|
||
|
if not PackageDelivered then
|
||
|
deliveredboxes = deliveredboxes + 1
|
||
|
--print(deliveredboxes)
|
||
|
TriggerServerEvent('kevin-deliveries:RemovePackage')
|
||
|
TriggerEvent('qb-phone:client:CustomNotification', 'NUVÆRRENDE JOB', deliveredboxes..' / '.. givenboxes..' pakker leveret', 'fas fa-truck', '#83a9f7', 5500)
|
||
|
|
||
|
if deliveredboxes == givenboxes then
|
||
|
PackageDelivered = true
|
||
|
Wait(2000)
|
||
|
TriggerEvent('qb-phone:client:CustomNotification', 'OPGAVE KLARET', givenboxes..' pakker leveret', 'fas fa-truck', '#83a9f7', 5500)
|
||
|
Wait(2000)
|
||
|
TriggerEvent('qb-phone:client:CustomNotification', 'NUVÆRRENDE JOB', 'Kør tilbage til depottet og parker bilen!', 'fas fa-truck', '#83a9f7', 5500)
|
||
|
--print('no more packages')
|
||
|
RemoveBlip(DestBlip)
|
||
|
Return()
|
||
|
end
|
||
|
else
|
||
|
QBCore.Functions.Notify('You have no more packages', 'error', 5000)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
function Return()
|
||
|
local Retarea = Config.VehicleReturnCoords
|
||
|
RetBlip = AddBlipForCoord(Retarea.x, Retarea.y, Retarea.y)
|
||
|
SetBlipSprite(RetBlip, 50)
|
||
|
SetBlipColour(RetBlip, 32)
|
||
|
SetBlipRoute(RetBlip, true)
|
||
|
SetBlipRouteColour(RetBlip, 32)
|
||
|
SetBlipAsShortRange(RetBlip, false)
|
||
|
SetBlipScale(RetBlip, 0.75)
|
||
|
|
||
|
ReturnZone = BoxZone:Create(vector3(Retarea.x, Retarea.y, Retarea.y), 10.5, 35.0, {
|
||
|
heading = Retarea.w,
|
||
|
name = 'Shop',
|
||
|
debugPoly = false,
|
||
|
-- minZ = 53.64,
|
||
|
-- maxZ = 56.24
|
||
|
})
|
||
|
ReturnZone:onPlayerInOut(function(isPointInside)
|
||
|
if isPointInside and PackageDelivered then
|
||
|
InReturn = exports['qb-radialmenu']:AddOption({
|
||
|
id = 'deliver-package',
|
||
|
title = 'Parker',
|
||
|
icon = 'truck',
|
||
|
type = 'client',
|
||
|
event = 'kevin-deliveries:Return',
|
||
|
shouldClose = true
|
||
|
}, InReturn)
|
||
|
else
|
||
|
if InReturn ~= nil then
|
||
|
exports['qb-radialmenu']:RemoveOption(InReturn)
|
||
|
InReturn = nil
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
RegisterNetEvent('kevin-deliveries:Return', function()
|
||
|
if Config.Interaction == 'target' then
|
||
|
doreturn()
|
||
|
elseif Config.Interaction == 'radialmenu' then
|
||
|
if DoesEntityExist(JobVeh) and IsPedInVehicle(PlayerPedId(), JobVeh, true) then
|
||
|
doreturn()
|
||
|
else
|
||
|
QBCore.Functions.Notify('Du er ikke i et køretøj', 'error')
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
function doreturn()
|
||
|
QBCore.Functions.DeleteVehicle(JobVeh)
|
||
|
Wait(1000)
|
||
|
RemoveBlip(RetBlip)
|
||
|
TriggerEvent('qb-phone:client:CustomNotification', 'NUVÆRRENDE JOB', 'Kør tilbage til depottet og parker bilen!', 'fas fa-truck', '#83a9f7', 5500)
|
||
|
VehicleReturned = true
|
||
|
end
|
||
|
|
||
|
function JobFinish()
|
||
|
if Config.Interaction == 'target' then
|
||
|
TriggerServerEvent('kevin-deliveries:Payouts', data)
|
||
|
TriggerEvent('qb-phone:client:CustomNotification', 'OPGAVE KLARET', 'Hop ind i køretøjer og få leveret nogler pakker!', 'fas fa-truck', '#83a9f7', 5500)
|
||
|
InShopOption = nil
|
||
|
pedinveh = false
|
||
|
GotJob = false
|
||
|
prop = nil
|
||
|
PackageDelivered = false
|
||
|
deliveredboxes = 0
|
||
|
InReturn = nil
|
||
|
VehicleReturned = false
|
||
|
deliveredboxes = 0
|
||
|
elseif Config.Interaction == 'radialmenu' then
|
||
|
if not collected then
|
||
|
Zone:destroy()
|
||
|
ReturnZone:destroy()
|
||
|
TriggerServerEvent('kevin-deliveries:Payouts', data)
|
||
|
TriggerEvent('qb-phone:client:CustomNotification', 'OPGAVE KLARET', 'Hop ind i køretøjer og få leveret nogler pakker!', 'fas fa-truck', '#83a9f7', 5500)
|
||
|
InShopOption = nil
|
||
|
pedinveh = false
|
||
|
GotJob = false
|
||
|
prop = nil
|
||
|
PackageDelivered = false
|
||
|
deliveredboxes = 0
|
||
|
InReturn = nil
|
||
|
VehicleReturned = false
|
||
|
deliveredboxes = 0
|
||
|
collected = true
|
||
|
end
|
||
|
end
|
||
|
end
|