313 lines
16 KiB
Lua
313 lines
16 KiB
Lua
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)
|