332 lines
9.4 KiB
Lua
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) |