Scripts/resources/[qb]/[qb_crimes]/qb-weed/client/main.lua

313 lines
16 KiB
Lua
Raw Normal View History

2024-12-29 20:03:28 +00:00
local QBCore = exports['qb-core']:GetCoreObject()
local housePlants = {}
local insideHouse = false
local currentHouse = nil
local plantSpawned = false
DrawText3Ds = function(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(1)
SetTextColour(255, 255, 255, 215)
SetTextEntry("STRING")
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x,y,z, 0)
DrawText(0.0, 0.0)
local factor = (string.len(text)) / 370
DrawRect(0.0, 0.0+0.0125, 0.017+ factor, 0.03, 0, 0, 0, 75)
ClearDrawOrigin()
end
RegisterNetEvent('qb-weed:client:getHousePlants', function(house)
QBCore.Functions.TriggerCallback('qb-weed:server:getBuildingPlants', function(plants)
currentHouse = house
housePlants[currentHouse] = plants
insideHouse = true
spawnHousePlants()
end, house)
end)
function spawnHousePlants()
CreateThread(function()
if not plantSpawned then
for k, _ in pairs(housePlants[currentHouse]) do
local plantData = {
["plantCoords"] = {["x"] = json.decode(housePlants[currentHouse][k].coords).x, ["y"] = json.decode(housePlants[currentHouse][k].coords).y, ["z"] = json.decode(housePlants[currentHouse][k].coords).z},
["plantProp"] = GetHashKey(QBWeed.Plants[housePlants[currentHouse][k].sort]["stages"][housePlants[currentHouse][k].stage]),
}
local plantProp = CreateObject(plantData["plantProp"], plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"], false, false, false)
while not plantProp do Wait(0) end
PlaceObjectOnGroundProperly(plantProp)
Wait(10)
FreezeEntityPosition(plantProp, true)
SetEntityAsMissionEntity(plantProp, false, false)
end
plantSpawned = true
end
end)
end
function despawnHousePlants()
CreateThread(function()
if plantSpawned then
for k, _ in pairs(housePlants[currentHouse]) do
local plantData = {
["plantCoords"] = {["x"] = json.decode(housePlants[currentHouse][k].coords).x, ["y"] = json.decode(housePlants[currentHouse][k].coords).y, ["z"] = json.decode(housePlants[currentHouse][k].coords).z},
}
for _, stage in pairs(QBWeed.Plants[housePlants[currentHouse][k].sort]["stages"]) do
local closestPlant = GetClosestObjectOfType(plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"], 3.5, GetHashKey(stage), false, false, false)
if closestPlant ~= 0 then
DeleteObject(closestPlant)
end
end
end
plantSpawned = false
end
end)
end
local ClosestTarget = 0
CreateThread(function()
while true do
Wait(0)
if insideHouse then
if plantSpawned then
local ped = PlayerPedId()
for k, _ in pairs(housePlants[currentHouse]) do
local gender = "M"
if housePlants[currentHouse][k].gender == "woman" then gender = "F" end
local plantData = {
["plantCoords"] = {["x"] = json.decode(housePlants[currentHouse][k].coords).x, ["y"] = json.decode(housePlants[currentHouse][k].coords).y, ["z"] = json.decode(housePlants[currentHouse][k].coords).z},
["plantStage"] = housePlants[currentHouse][k].stage,
["plantProp"] = GetHashKey(QBWeed.Plants[housePlants[currentHouse][k].sort]["stages"][housePlants[currentHouse][k].stage]),
["plantSort"] = {
["name"] = housePlants[currentHouse][k].sort,
["label"] = QBWeed.Plants[housePlants[currentHouse][k].sort]["label"],
},
["plantStats"] = {
["food"] = housePlants[currentHouse][k].food,
["health"] = housePlants[currentHouse][k].health,
["progress"] = housePlants[currentHouse][k].progress,
["stage"] = housePlants[currentHouse][k].stage,
["highestStage"] = QBWeed.Plants[housePlants[currentHouse][k].sort]["highestStage"],
["gender"] = gender,
["plantId"] = housePlants[currentHouse][k].plantid,
}
}
local plyDistance = #(GetEntityCoords(ped) - vector3(plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"]))
if plyDistance < 0.8 then
ClosestTarget = k
if plantData["plantStats"]["health"] > 0 then
if plantData["plantStage"] ~= plantData["plantStats"]["highestStage"] then
DrawText3Ds(plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"], Lang:t('text.sort') .. plantData["plantSort"]["label"]..'~w~ ['..plantData["plantStats"]["gender"]..'] | '..Lang:t('text.nutrition')..' ~b~'..plantData["plantStats"]["food"]..'% ~w~ | '..Lang:t('text.health')..' ~b~'..plantData["plantStats"]["health"]..'%')
else
DrawText3Ds(plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"] + 0.2, Lang:t('text.harvest_plant'))
DrawText3Ds(plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"], Lang:t('text.sort')..' ~g~'..plantData["plantSort"]["label"]..'~w~ ['..plantData["plantStats"]["gender"]..'] | '..Lang:t('text.nutrition')..' ~b~'..plantData["plantStats"]["food"]..'% ~w~ | '..Lang:t('text.health')..' ~b~'..plantData["plantStats"]["health"]..'%')
if IsControlJustPressed(0, 38) then
QBCore.Functions.Progressbar("remove_weed_plant", Lang:t('text.harvesting_plant'), 8000, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "amb@world_human_gardener_plant@male@base",
anim = "base",
flags = 16,
}, {}, {}, function() -- Done
ClearPedTasks(ped)
local amount = math.random(1, 6)
if plantData["plantStats"]["gender"] == "M" then
amount = math.random(1, 2)
end
TriggerServerEvent('qb-weed:server:harvestPlant', currentHouse, amount, plantData["plantSort"]["name"], plantData["plantStats"]["plantId"])
end, function() -- Cancel
ClearPedTasks(ped)
QBCore.Functions.Notify("Process Canceled", "error")
end)
end
end
elseif plantData["plantStats"]["health"] == 0 then
DrawText3Ds(plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"], Lang:t('error.plant_has_died'))
if IsControlJustPressed(0, 38) then
QBCore.Functions.Progressbar("remove_weed_plant", Lang:t('text.removing_the_plant'), 8000, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "amb@world_human_gardener_plant@male@base",
anim = "base",
flags = 16,
}, {}, {}, function() -- Done
ClearPedTasks(ped)
TriggerServerEvent('qb-weed:server:removeDeathPlant', currentHouse, plantData["plantStats"]["plantId"])
end, function() -- Cancel
ClearPedTasks(ped)
QBCore.Functions.Notify( Lang:t('error.process_canceled'), "error")
end)
end
end
end
end
end
end
if not insideHouse then
Wait(5000)
end
end
end)
RegisterNetEvent('qb-weed:client:leaveHouse', function()
despawnHousePlants()
SetTimeout(1000, function()
if currentHouse ~= nil then
insideHouse = false
housePlants[currentHouse] = nil
currentHouse = nil
end
end)
end)
RegisterNetEvent('qb-weed:client:refreshHousePlants', function(house)
if currentHouse ~= nil and currentHouse == house then
despawnHousePlants()
SetTimeout(100, function()
QBCore.Functions.TriggerCallback('qb-weed:server:getBuildingPlants', function(plants)
currentHouse = house
housePlants[currentHouse] = plants
spawnHousePlants()
end, house)
end)
end
end)
RegisterNetEvent('qb-weed:client:refreshPlantStats', function()
if insideHouse then
despawnHousePlants()
SetTimeout(100, function()
QBCore.Functions.TriggerCallback('qb-weed:server:getBuildingPlants', function(plants)
housePlants[currentHouse] = plants
spawnHousePlants()
end, currentHouse)
end)
end
end)
RegisterNetEvent('qb-weed:client:placePlant', function(type, item)
local ped = PlayerPedId()
local plyCoords = GetOffsetFromEntityInWorldCoords(ped, 0, 0.75, 0)
local plantData = {
["plantCoords"] = {["x"] = plyCoords.x, ["y"] = plyCoords.y, ["z"] = plyCoords.z},
["plantModel"] = QBWeed.Plants[type]["stages"]["stage-a"],
["plantLabel"] = QBWeed.Plants[type]["label"]
}
local ClosestPlant = 0
for _, v in pairs(QBWeed.Props) do
if ClosestPlant == 0 then
ClosestPlant = GetClosestObjectOfType(plyCoords.x, plyCoords.y, plyCoords.z, 0.8, GetHashKey(v), false, false, false)
end
end
if currentHouse ~= nil then
if ClosestPlant == 0 then
LocalPlayer.state:set("inv_busy", true, true)
QBCore.Functions.Progressbar("plant_weed_plant", Lang:t('text.planting'), 8000, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "amb@world_human_gardener_plant@male@base",
anim = "base",
flags = 16,
LocalPlayer.state:set("inv_busy", false, true)
}, {}, {}, function() -- Done
ClearPedTasks(ped)
TriggerServerEvent('qb-weed:server:placePlant', json.encode(plantData["plantCoords"]), type, currentHouse)
TriggerServerEvent('qb-weed:server:removeSeed', item.slot, type)
end, function() -- Cancel
ClearPedTasks(ped)
QBCore.Functions.Notify(Lang:t('error.process_canceled'), "error")
LocalPlayer.state:set("inv_busy", false, true)
end)
else
QBCore.Functions.Notify(Lang:t('error.cant_place_here'), 'error', 3500)
end
else
QBCore.Functions.Notify(Lang:t('error.not_safe_here'), 'error', 3500)
end
end)
RegisterNetEvent('qb-weed:client:foodPlant', function()
if currentHouse ~= nil then
if ClosestTarget ~= 0 then
local ped = PlayerPedId()
local gender = "M"
if housePlants[currentHouse][ClosestTarget].gender == "woman" then
gender = "F"
end
local plantData = {
["plantCoords"] = {["x"] = json.decode(housePlants[currentHouse][ClosestTarget].coords).x, ["y"] = json.decode(housePlants[currentHouse][ClosestTarget].coords).y, ["z"] = json.decode(housePlants[currentHouse][ClosestTarget].coords).z},
["plantStage"] = housePlants[currentHouse][ClosestTarget].stage,
["plantProp"] = GetHashKey(QBWeed.Plants[housePlants[currentHouse][ClosestTarget].sort]["stages"][housePlants[currentHouse][ClosestTarget].stage]),
["plantSort"] = {
["name"] = housePlants[currentHouse][ClosestTarget].sort,
["label"] = QBWeed.Plants[housePlants[currentHouse][ClosestTarget].sort]["label"],
},
["plantStats"] = {
["food"] = housePlants[currentHouse][ClosestTarget].food,
["health"] = housePlants[currentHouse][ClosestTarget].health,
["progress"] = housePlants[currentHouse][ClosestTarget].progress,
["stage"] = housePlants[currentHouse][ClosestTarget].stage,
["highestStage"] = QBWeed.Plants[housePlants[currentHouse][ClosestTarget].sort]["highestStage"],
["gender"] = gender,
["plantId"] = housePlants[currentHouse][ClosestTarget].plantid,
}
}
local plyDistance = #(GetEntityCoords(ped) - vector3(plantData["plantCoords"]["x"], plantData["plantCoords"]["y"], plantData["plantCoords"]["z"]))
if plyDistance < 1.0 then
if plantData["plantStats"]["food"] == 100 then
QBCore.Functions.Notify(Lang:t('error.not_need_nutrition'), 'error', 3500)
else
LocalPlayer.state:set("inv_busy", true, true)
QBCore.Functions.Progressbar("plant_weed_plant", Lang:t('text.feeding_plant'), math.random(4000, 8000), false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "timetable@gardener@filling_can",
anim = "gar_ig_5_filling_can",
flags = 16,
LocalPlayer.state:set("inv_busy", false, true)
}, {}, {}, function() -- Done
ClearPedTasks(ped)
local newFood = math.random(40, 60)
TriggerServerEvent('qb-weed:server:foodPlant', currentHouse, newFood, plantData["plantSort"]["name"], plantData["plantStats"]["plantId"])
end, function() -- Cancel
ClearPedTasks(ped)
LocalPlayer.state:set("inv_busy", false, true)
QBCore.Functions.Notify(Lang:t('error.process_canceled'), "error")
end)
end
else
QBCore.Functions.Notify(Lang:t('error.cant_place_here'), "error")
end
else
QBCore.Functions.Notify(Lang:t('error.cant_place_here'), "error")
end
end
end)