Scripts/resources/[qb]/[qb_jobs]/qb-busjob/client/main.lua
2024-12-29 21:06:22 +01:00

344 lines
12 KiB
Lua

-- Variables
local QBCore = exports['qb-core']:GetCoreObject()
local PlayerData = QBCore.Functions.GetPlayerData()
local route = 1
local max = #Config.NPCLocations.Locations
local busBlip = nil
local NpcData = {
Active = false,
CurrentNpc = nil,
LastNpc = nil,
CurrentDeliver = nil,
LastDeliver = nil,
Npc = nil,
NpcBlip = nil,
DeliveryBlip = nil,
NpcTaken = false,
NpcDelivered = false,
CountDown = 180
}
local BusData = {
Active = false,
}
-- Functions
local function resetNpcTask()
NpcData = {
Active = false,
CurrentNpc = nil,
LastNpc = nil,
CurrentDeliver = nil,
LastDeliver = nil,
Npc = nil,
NpcBlip = nil,
DeliveryBlip = nil,
NpcTaken = false,
NpcDelivered = false,
}
end
local function updateBlip()
if PlayerData.job.name == "bus" then
busBlip = AddBlipForCoord(Config.Location)
SetBlipSprite(busBlip, 513)
SetBlipDisplay(busBlip, 4)
SetBlipScale(busBlip, 0.6)
SetBlipAsShortRange(busBlip, true)
SetBlipColour(busBlip, 49)
BeginTextCommandSetBlipName("STRING")
AddTextComponentSubstringPlayerName(Lang:t('info.bus_depot'))
EndTextCommandSetBlipName(busBlip)
elseif busBlip ~= nil then
RemoveBlip(busBlip)
end
end
local function whitelistedVehicle()
local ped = PlayerPedId()
local veh = GetEntityModel(GetVehiclePedIsIn(ped))
local retval = false
for i = 1, #Config.AllowedVehicles, 1 do
if veh == GetHashKey(Config.AllowedVehicles[i].model) then
retval = true
end
end
if veh == GetHashKey("dynasty") then
retval = true
end
return retval
end
local function nextStop()
if route <= (max - 1) then
route = route + 1
else
route = 1
end
end
local function GetDeliveryLocation()
nextStop()
if NpcData.DeliveryBlip ~= nil then
RemoveBlip(NpcData.DeliveryBlip)
end
NpcData.DeliveryBlip = AddBlipForCoord(Config.NPCLocations.Locations[route].x, Config.NPCLocations.Locations[route].y, Config.NPCLocations.Locations[route].z)
SetBlipColour(NpcData.DeliveryBlip, 3)
SetBlipRoute(NpcData.DeliveryBlip, true)
SetBlipRouteColour(NpcData.DeliveryBlip, 3)
NpcData.LastDeliver = route
local inRange = false
local PolyZone = CircleZone:Create(vector3(Config.NPCLocations.Locations[route].x,
Config.NPCLocations.Locations[route].y, Config.NPCLocations.Locations[route].z), 5, {
name = "busjobdeliver",
useZ = true,
-- debugPoly=true
})
PolyZone:onPlayerInOut(function(isPointInside)
if isPointInside then
inRange = true
exports["qb-core"]:DrawText(Lang:t('info.busstop_text'), 'top')
CreateThread(function()
repeat
Wait(0)
if IsControlJustPressed(0, 38) then
local ped = PlayerPedId()
local veh = GetVehiclePedIsIn(ped, 0)
TaskLeaveVehicle(NpcData.Npc, veh, 0)
SetEntityAsMissionEntity(NpcData.Npc, false, true)
SetEntityAsNoLongerNeeded(NpcData.Npc)
local targetCoords = Config.NPCLocations.Locations[NpcData.LastNpc]
TaskGoStraightToCoord(NpcData.Npc, targetCoords.x, targetCoords.y, targetCoords.z, 1.0, -1, 0.0, 0.0)
QBCore.Functions.Notify(Lang:t('success.dropped_off'), 'success')
if NpcData.DeliveryBlip ~= nil then
RemoveBlip(NpcData.DeliveryBlip)
end
local RemovePed = function(pped)
SetTimeout(60000, function()
DeletePed(pped)
end)
end
RemovePed(NpcData.Npc)
resetNpcTask()
nextStop()
TriggerEvent('qb-busjob:client:DoBusNpc')
exports["qb-core"]:HideText()
PolyZone:destroy()
break
end
until not inRange
end)
else
exports["qb-core"]:HideText()
inRange = false
end
end)
end
local function closeMenuFull()
exports['qb-menu']:closeMenu()
end
-- Old Menu Code (being removed)
local function busGarage()
local vehicleMenu = {
{
header = Lang:t('menu.bus_header'),
isMenuHeader = true
}
}
for _, v in pairs(Config.AllowedVehicles) do
vehicleMenu[#vehicleMenu + 1] = {
header = v.label,
params = {
event = "qb-busjob:client:TakeVehicle",
args = {
model = v.model
}
}
}
end
vehicleMenu[#vehicleMenu + 1] = {
header = Lang:t('menu.bus_close'),
params = {
event = "qb-menu:client:closeMenu"
}
}
exports['qb-menu']:openMenu(vehicleMenu)
end
RegisterNetEvent("qb-busjob:client:TakeVehicle", function(data)
local coords = Config.Location
if (BusData.Active) then
QBCore.Functions.Notify(Lang:t('error.one_bus_active'), 'error')
return
else
QBCore.Functions.TriggerCallback('QBCore:Server:SpawnVehicle', function(netId)
local veh = NetToVeh(netId)
SetVehicleNumberPlateText(veh, Lang:t('info.bus_plate') .. tostring(math.random(1000, 9999)))
exports['qb-fuel']:SetFuel(veh, 100.0)
closeMenuFull()
TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(veh))
SetVehicleEngineOn(veh, true, true)
end, data.model, coords, true)
Wait(1000)
TriggerEvent('qb-busjob:client:DoBusNpc')
end
end)
-- Events
AddEventHandler('onResourceStart', function(resourceName)
-- handles script restarts
if GetCurrentResourceName() == resourceName then
updateBlip()
end
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
PlayerData = QBCore.Functions.GetPlayerData()
updateBlip()
end)
RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
PlayerData = {}
end)
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
PlayerData.job = JobInfo
updateBlip()
end)
RegisterNetEvent('qb-busjob:client:DoBusNpc', function()
if whitelistedVehicle() then
if not NpcData.Active then
local Gender = math.random(1, #Config.NpcSkins)
local PedSkin = math.random(1, #Config.NpcSkins[Gender])
local model = GetHashKey(Config.NpcSkins[Gender][PedSkin])
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
NpcData.Npc = CreatePed(3, model, Config.NPCLocations.Locations[route].x, Config.NPCLocations.Locations[route].y, Config.NPCLocations.Locations[route].z - 0.98, Config.NPCLocations.Locations[route].w, false, true)
PlaceObjectOnGroundProperly(NpcData.Npc)
FreezeEntityPosition(NpcData.Npc, true)
if NpcData.NpcBlip ~= nil then
RemoveBlip(NpcData.NpcBlip)
end
QBCore.Functions.Notify(Lang:t('info.goto_busstop'), 'primary')
NpcData.NpcBlip = AddBlipForCoord(Config.NPCLocations.Locations[route].x, Config.NPCLocations.Locations[route].y, Config.NPCLocations.Locations[route].z)
SetBlipColour(NpcData.NpcBlip, 3)
SetBlipRoute(NpcData.NpcBlip, true)
SetBlipRouteColour(NpcData.NpcBlip, 3)
NpcData.LastNpc = route
NpcData.Active = true
local inRange = false
local PolyZone = CircleZone:Create(vector3(Config.NPCLocations.Locations[route].x,
Config.NPCLocations.Locations[route].y, Config.NPCLocations.Locations[route].z), 5, {
name = "busjobdeliver",
useZ = true,
-- debugPoly=true
})
PolyZone:onPlayerInOut(function(isPointInside)
if isPointInside then
inRange = true
exports["qb-core"]:DrawText(Lang:t('info.busstop_text'), 'top')
CreateThread(function()
repeat
Wait(5)
if IsControlJustPressed(0, 38) then
local ped = PlayerPedId()
local veh = GetVehiclePedIsIn(ped, 0)
local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(veh)
for i = maxSeats - 1, 0, -1 do
if IsVehicleSeatFree(veh, i) then
freeSeat = i
break
end
end
ClearPedTasksImmediately(NpcData.Npc)
FreezeEntityPosition(NpcData.Npc, false)
TaskEnterVehicle(NpcData.Npc, veh, -1, freeSeat, 1.0, 0)
QBCore.Functions.Notify(Lang:t('info.goto_busstop'), 'primary')
if NpcData.NpcBlip ~= nil then
RemoveBlip(NpcData.NpcBlip)
end
GetDeliveryLocation()
NpcData.NpcTaken = true
TriggerServerEvent('qb-busjob:server:NpcPay')
exports["qb-core"]:HideText()
PolyZone:destroy()
break
end
until not inRange
end)
else
exports["qb-core"]:HideText()
inRange = false
end
end)
else
QBCore.Functions.Notify(Lang:t('error.already_driving_bus'), 'error')
end
else
QBCore.Functions.Notify(Lang:t('error.not_in_bus'), 'error')
end
end)
-- Threads
CreateThread(function()
local inRange = false
local PolyZone = CircleZone:Create(vector3(Config.Location.x, Config.Location.y, Config.Location.z), 5, {
name = "busMain",
useZ = true,
debugPoly = false
})
PolyZone:onPlayerInOut(function(isPointInside)
local inVeh = whitelistedVehicle()
if PlayerData.job.name == "bus" then
if isPointInside then
inRange = true
CreateThread(function()
repeat
Wait(5)
if not inVeh then
exports["qb-core"]:DrawText(Lang:t('info.busstop_text'), 'top')
if IsControlJustReleased(0, 38) then
busGarage()
exports["qb-core"]:HideText()
break
end
else
exports["qb-core"]:DrawText(Lang:t('info.bus_stop_work'), 'top')
if IsControlJustReleased(0, 38) then
if (not NpcData.Active or NpcData.Active and NpcData.NpcTaken == false) then
if IsPedInAnyVehicle(PlayerPedId(), false) then
BusData.Active = false;
DeleteVehicle(GetVehiclePedIsIn(PlayerPedId()))
RemoveBlip(NpcData.NpcBlip)
exports["qb-core"]:HideText()
resetNpcTask()
break
end
else
QBCore.Functions.Notify(Lang:t('error.drop_off_passengers'), 'error')
end
end
end
until not inRange
end)
else
exports["qb-core"]:HideText()
inRange = false
end
end
end)
end)