Scripts/resources/[qb]/[qb_jobs]/qb-deliveries/client/client.lua

422 lines
14 KiB
Lua
Raw Permalink Normal View History

2024-12-29 20:06:22 +00:00
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