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

332 lines
9.4 KiB
Lua

local QBCore = exports['qb-core']:GetCoreObject()
local PlayerJob = {}
AddEventHandler('onResourceStart', function(resourceName)
if resourceName == GetCurrentResourceName() then
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
end)
end
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
end)
end)
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
PlayerJob = JobInfo
end)
local tasking = false
local startVineyard = false
local random = 0
local pickedGrapes = 0
local blip = 0
local winetimer = Config.wineTimer
local loadIngredients = false
local wineStarted = false
local finishedWine = false
local grapeLocations = {
[1] = vector3(-1875.41, 2100.37, 138.86),
[2] = vector3(-1908.69, 2107.48, 131.31),
[3] = vector3(-1866.04, 2112.64, 134.41),
[4] = vector3(-1907.76, 2125.35, 124.03),
[5] = vector3(-1850.31, 2142.95, 122.30),
[6] = vector3(-1888.22, 2164.51, 114.81),
[7] = vector3(-1835.52, 2180.59, 104.88),
[8] = vector3(-1891.98, 2208.35, 94.56),
[9] = vector3(-1720.37, 2182.03, 106.18),
[10] = vector3(-1808.52, 2173.14, 107.63),
[11] = vector3(-1784.22, 2222.80, 92.86),
[12] = vector3(-1889.13, 2250.05, 79.63),
[13] = vector3(-1861.16, 2254.32, 81.04),
[14] = vector3(-1886.75, 2272.45, 70.81),
[15] = vector3(-1845.49, 2274.63, 73.33),
[16] = vector3(-1687.28, 2195.76, 97.87),
[17] = vector3(-1741.18, 2173.22, 114.39),
[18] = vector3(-1743.17, 2141.11, 121.18),
[19] = vector3(-1813.84, 2089.57, 134.21),
[20] = vector3(-1698.71, 2150.65, 110.41),
}
local function log(debugMessage)
print(('^6[^3qb-vineyard^6]^0 %s'):format(debugMessage))
end
local function CreateBlip()
if tasking then
blip = AddBlipForCoord(grapeLocations[random].x,grapeLocations[random].y,grapeLocations[random].z)
end
SetBlipSprite(blip, 465)
SetBlipScale(blip, 1.0)
SetBlipAsShortRange(blip, false)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("Drop Off")
EndTextCommandSetBlipName(blip)
end
local function nextTask()
if tasking then
return
end
random = math.random(#grapeLocations)
tasking = true
CreateBlip()
end
local function startVinyard()
local amount = math.random(Config.PickAmount.min, Config.PickAmount.max)
QBCore.Functions.Notify(Lang:t("text.start_shift"))
while startVineyard do
if tasking then
Wait(5000)
else
nextTask()
pickedGrapes = pickedGrapes + 1
if pickedGrapes == amount then
nextTask()
Wait(20000)
startVineyard = false
pickedGrapes = 0
QBCore.Functions.Notify(Lang:t("text.end_shift"))
end
end
Wait(5)
end
end
local function DeleteBlip()
if DoesBlipExist(blip) then
RemoveBlip(blip)
end
end
local function pickProcess()
QBCore.Functions.Progressbar("pick_grape", Lang:t("progress.pick_grapes"), math.random(6000,8000), false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {}, {}, {}, function() -- Done
tasking = false
TriggerServerEvent("qb-vineyard:server:getGrapes")
DeleteBlip()
ClearPedTasks(PlayerPedId())
end, function() -- Cancel
ClearPedTasks(PlayerPedId())
QBCore.Functions.Notify(Lang:t("task.cancel_task"), "error")
end)
end
local function LoadAnim(dict)
while not HasAnimDictLoaded(dict) do
RequestAnimDict(dict)
Wait(1)
end
end
local function PickAnim()
local ped = PlayerPedId()
LoadAnim('amb@prop_human_bum_bin@idle_a')
TaskPlayAnim(ped, 'amb@prop_human_bum_bin@idle_a', 'idle_a', 6.0, -6.0, -1, 47, 0, 0, 0, 0)
end
local grapeZones = {}
for k=1, #grapeLocations do
local label = ("GrapeZone-%s"):format(k)
grapeZones[k] = {
isInside = false,
zone = BoxZone:Create(grapeLocations[k], 1.75, 3, {
name=label,
minZ = grapeLocations[k].z-1.0,
maxZ = grapeLocations[k].z+1.0,
debugPoly=Config.Debug,
})
}
grapeZones[k].zone:onPlayerInOut(function(isPointInside)
grapeZones[k].isInside = isPointInside
if grapeZones[k].isInside then
if Config.Debug then
log(Lang:t("text.zone_entered",{zone=label}))
if k == random then log(Lang:t("text.valid_zone")) else log(Lang:t("text.invalid_zone")) end
end
if k==random then
CreateThread(function()
while grapeZones[k].isInside and k==random do
exports['qb-core']:DrawText(Lang:t("task.start_task"), 'top')
if not IsPedInAnyVehicle(PlayerPedId()) and IsControlJustReleased(0,38) then
PickAnim()
pickProcess()
exports['qb-core']:HideText()
random = 0
end
Wait(1)
end
end)
end
else
if Config.Debug then log(Lang:t("text.zone_exited",{zone=label})) end
exports['qb-core']:HideText()
end
end)
end
local function StartWineProcess()
CreateThread(function()
wineStarted = true
while winetimer > 0 do
winetimer = winetimer - 1
Wait(1000)
end
wineStarted = false
finishedWine = true
winetimer = Config.wineTimer
end)
end
local function PrepareAnim()
local ped = PlayerPedId()
LoadAnim('amb@code_human_wander_rain@male_a@base')
TaskPlayAnim(ped, 'amb@code_human_wander_rain@male_a@base', 'static', 6.0, -6.0, -1, 47, 0, 0, 0, 0)
end
local function grapeJuiceProcess()
QBCore.Functions.Progressbar("grape_juice", Lang:t("progress.process_grapes"), math.random(15000,20000), false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {}, {}, {}, function() -- Done
TriggerServerEvent("qb-vineyard:server:receiveGrapeJuice")
ClearPedTasks(PlayerPedId())
end, function() -- Cancel
ClearPedTasks(PlayerPedId())
QBCore.Functions.Notify(Lang:t("task.cancel_task"), "error")
end)
end
local Zones = {}
Zones[1] = {
isInside = false,
zone = PolyZone:Create(Config.Vineyard.start.zones, {
name="Vineyard-Start",
minZ = Config.Vineyard.start.minZ,
maxZ = Config.Vineyard.start.maxZ,
debugPoly = Config.Debug
})
}
Zones[1].zone:onPlayerInOut(function(isPointInside)
Zones[1].isInside = isPointInside
if isPointInside then
if Config.Debug then log(Lang:t("text.zone_entered",{zone="Start"})) end
if not startVineyard and PlayerJob.name == "vineyard" then
exports['qb-core']:DrawText(Lang:t("task.start_task"), 'top')
CreateThread(function()
while Zones[1].isInside do
if IsControlJustReleased(0,38) and not startVineyard then
startVineyard = true
startVinyard()
end
Wait(1)
end
end)
end
else
if Config.Debug then log(Lang:t("text.zone_exited",{zone="Start"})) end
exports['qb-core']:HideText()
end
end)
Zones[2] = {
isInside = false,
zone = PolyZone:Create(Config.Vineyard.wine.zones, {
name="Vineyard-Wine",
minZ = Config.Vineyard.wine.minZ,
maxZ = Config.Vineyard.wine.maxZ,
debugPoly = Config.Debug
})
}
Zones[2].zone:onPlayerInOut(function(isPointInside)
Zones[2].isInside = isPointInside
if isPointInside then
if Config.Debug then log(Lang:t("text.zone_entered",{zone="Wine"})) end
if not startVineyard and PlayerJob.name == "vineyard" then
CreateThread(function()
while Zones[2].isInside do
if not wineStarted then
if not loadIngredients then
exports['qb-core']:DrawText(Lang:t("task.load_ingrediants"), 'top')
if IsControlJustPressed(0, 38) and not LocalPlayer.state.inv_busy then
QBCore.Functions.TriggerCallback('qb-vineyard:server:loadIngredients', function(result)
if result then loadIngredients = true end
end)
end
else
if not finishedWine then
exports['qb-core']:DrawText(Lang:t("task.wine_process"), 'top')
if IsControlJustPressed(0, 38) and not LocalPlayer.state.inv_busy then
StartWineProcess()
end
else
exports['qb-core']:DrawText(Lang:t("task.get_wine"), 'top')
if IsControlJustPressed(0, 38) and not LocalPlayer.state.inv_busy then
TriggerServerEvent("qb-vineyard:server:receiveWine")
finishedWine = false
loadIngredients = false
wineStarted = false
end
end
end
else
exports['qb-core']:DrawText(Lang:t("task.countdown",{time=winetimer}), 'top')
Wait(999)
end
Wait(1)
end
end)
end
else
if Config.Debug then log(Lang:t("text.zone_exited",{zone="Wine"})) end
exports['qb-core']:HideText()
end
end)
Zones[3] = {
isInside = false,
zone = PolyZone:Create(Config.Vineyard.grapejuice.zones, {
name="Vineyard-GrapeJuice",
minZ = Config.Vineyard.grapejuice.minZ,
maxZ = Config.Vineyard.grapejuice.maxZ,
debugPoly = Config.Debug
})
}
Zones[3].zone:onPlayerInOut(function(isPointInside)
Zones[3].isInside = isPointInside
if isPointInside then
if Config.Debug then log(Lang:t("text.zone_entered",{zone="Juice"})) end
if not startVineyard and PlayerJob.name == "vineyard" then
CreateThread(function()
while Zones[3].isInside do
exports['qb-core']:DrawText(Lang:t("task.make_grape_juice"), 'top')
if IsControlJustPressed(0, 38) and not LocalPlayer.state.inv_busy then
QBCore.Functions.TriggerCallback('qb-vineyard:server:grapeJuice', function(result)
if result then PrepareAnim() grapeJuiceProcess() end
end)
end
Wait(1)
end
end)
end
else
if Config.Debug then log(Lang:t("text.zone_exited",{zone="Juice"})) end
exports['qb-core']:HideText()
end
end)