332 lines
		
	
	
		
			No EOL
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			332 lines
		
	
	
		
			No EOL
		
	
	
		
			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")
 | |
|     AddTextComponentSubstringPlayerName("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"),'right')
 | |
| 						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"),'right')
 | |
| 			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"),'right')
 | |
| 							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"),'right')
 | |
| 								if IsControlJustPressed(0, 38) and not LocalPlayer.state.inv_busy then
 | |
| 									StartWineProcess()
 | |
| 								end
 | |
| 							else
 | |
| 								exports['qb-core']:DrawText(Lang:t("task.get_wine"),'right')
 | |
| 								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}),'right')
 | |
| 						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"),'right')
 | |
| 					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) | 
