Scripts/resources/[jims]/jim-mining/client.lua

748 lines
41 KiB
Lua
Raw Normal View History

2024-12-29 19:49:12 +00:00
local QBCore = exports['qb-core']:GetCoreObject()
RegisterNetEvent('QBCore:Client:UpdateObject', function() QBCore = exports['qb-core']:GetCoreObject() end)
local PlayerJob = {}
local Props = {}
local Targets = {}
local Peds = {}
local Blip = {}
local soundId = GetSoundId()
------------------------------------------------------------
--Hide the mineshaft doors
CreateModelHide(vector3(-596.04, 2089.01, 131.41), 10.5, -1241212535, true)
--Attempts to disable header icons if JimMenu is enabled
if Config.JimMenu then Config.img = "" end
function removeJob()
for k in pairs(Targets) do exports['qb-target']:RemoveZone(k) end
for _, v in pairs(Peds) do unloadModel(GetEntityModel(v)) DeletePed(v) end
for i = 1, #Props do unloadModel(GetEntityModel(Props[i])) DeleteObject(Props[i]) end
for i = 1, #Blip do RemoveBlip(Blip[i]) end
end
function makeJob()
removeJob()
if not Config.K4MB1Only then
if Config.propSpawn then
--Quickly add outside lighting
Props[#Props+1] = makeProp({coords = vector4(-593.29, 2093.22, 131.7, 110.0), prop = `prop_worklight_02a`}, 1, false) -- Mineshaft door
Props[#Props+1] = makeProp({coords = vector4(-604.55, 2089.74, 131.15, 300.0), prop = `prop_worklight_02a`}, 1, false) -- Mineshaft door 2
Props[#Props+1] = makeProp({coords = vector4(2991.59, 2758.07, 42.68, 250.85), prop = `prop_worklight_02a`}, 1, false) -- Quarry Light
Props[#Props+1] = makeProp({coords = vector4(2991.11, 2758.02, 42.66, 194.6), prop = `prop_worklight_02a`}, 1, false) -- Quarry Light
Props[#Props+1] = makeProp({coords = vector4(2971.78, 2743.33, 43.29, 258.54), prop = `prop_worklight_02a`}, 1, false) -- Quarry Light
Props[#Props+1] = makeProp({coords = vector4(3000.72, 2777.08, 43.08, 211.7), prop = `prop_worklight_02a`}, 1, false) -- Quarry Light
Props[#Props+1] = makeProp({coords = vector4(2998.0, 2767.45, 42.71, 249.22), prop = `prop_worklight_02a`}, 1, false) -- Quarry Light
Props[#Props+1] = makeProp({coords = vector4(2959.93, 2755.26, 43.71, 164.24), prop = `prop_worklight_02a`}, 1, false) -- Quarry Light
Props[#Props+1] = makeProp({coords = vector4(1106.46, -1991.44, 31.49, 185.78), prop = `prop_worklight_02a`}, 1, false) -- Foundary Light
if Config.HangingLights then
for k, v in pairs(Config.MineLights) do
if Config.propSpawn then Props[#Props+1] = makeProp({coords = v, prop = `xs_prop_arena_lights_ceiling_l_c`}, 1, false) end
end
end
if not Config.HangingLights then
for k, v in pairs(Config.WorkLights) do
if Config.propSpawn then Props[#Props+1] = makeProp({coords = v, prop = `prop_worklight_03a`}, 1, false) end
end
end
end
for k, v in pairs(Config.Locations["MineStore"]) do
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
Peds[#Peds+1] = makePed(v.model, v.coords, 1, 1, v.scenario)
Targets["Mine"..k] =
exports['qb-target']:AddCircleZone("Mine"..k, v.coords.xyz, 1.0, { name="Mine"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:openShop", icon = "fas fa-store", label = Loc[Config.Lan].info["browse_store"], job = Config.Job }, },
distance = 2.0 })
end
--Smelter to turn stone into ore
for k, v in pairs(Config.Locations["Smelter"]) do
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
Targets["Smelter"..k] =
exports['qb-target']:AddCircleZone("Smelter"..k, v.coords.xyz, 3.0, { name="Smelter"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:CraftMenu", icon = "fas fa-fire-burner", label = Loc[Config.Lan].info["use_smelter"], craftable = Crafting.SmeltMenu, job = Config.Job }, },
distance = 10.0
})
end
--Ore Buying Ped
for k, v in pairs(Config.Locations["OreBuyer"]) do
Peds[#Peds+1] = makePed(v.model, v.coords, 1, 1, v.scenario)
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
local name = "OreBuyer"..k
Targets[name] =
exports['qb-target']:AddCircleZone(name, v.coords.xyz, 0.9, { name=name, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:SellOre", icon = "fas fa-sack-dollar", label = Loc[Config.Lan].info["sell_ores"], ped = Peds[#Peds], job = Config.Job }, },
distance = 2.0
})
end
--Jewel Cutting Bench
for k, v in pairs(Config.Locations["JewelCut"]) do
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
Props[#Props+1] = makeProp(v, 1, false)
Targets["JewelCut"..k] =
exports['qb-target']:AddCircleZone("JewelCut"..k, v.coords.xyz, 2.0,{ name="JewelCut"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:JewelCut", icon = "fas fa-gem", label = Loc[Config.Lan].info["jewelcut"], bench = Props[#Props], job = Config.Job }, },
distance = 2.0
})
end
--Cracking Bench
for k, v in pairs(Config.Locations["Cracking"]) do
Props[#Props+1] = makeProp(v, 1, false)
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
Targets["Cracking"..k] =
exports['qb-target']:AddCircleZone("Cracking"..k, v.coords.xyz, 1.2, {name="Cracking"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:CrackStart", icon = "fas fa-compact-disc", item = "stone", label = Loc[Config.Lan].info["crackingbench"], bench = Props[#Props] }, },
distance = 2.0
})
end
--Stone Washing
--Ore Spawning
for k, v in pairs(Config.OrePositions) do
Props[#Props+1] = makeProp({coords = v, prop = `cs_x_rubweec`}, 1, false)
Targets["Ore"..k] =
exports['qb-target']:AddCircleZone("Ore"..k, vector3(v.x, v.y, v.z-1.03), 1.2, { name="Ore"..k, debugPoly=Config.Debug, useZ=true, },
{ options = {
{ event = "jim-mining:MineOre:Pick", icon = "fas fa-hammer", item = "pickaxe", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["pickaxe"].label..")", job = Config.Job, name = "Ore"..k, stone = Props[#Props] },
{ event = "jim-mining:MineOre:Drill", icon = "fas fa-screwdriver", item = "miningdrill", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["miningdrill"].label..")", job = Config.Job, name = "Ore"..k, stone = Props[#Props] },
{ event = "jim-mining:MineOre:Laser", icon = "fas fa-screwdriver-wrench", item = "mininglaser", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["mininglaser"].label..")", job = Config.Job, name = "Ore"..k, stone = Props[#Props] },
}, distance = 1.3 })
Props[#Props+1] = makeProp({coords = vector4(v.x, v.y, v.z+0.25, v[4]), prop = `prop_rock_5_a`}, 1, false)
end
else Config.K4MB1 = true end
if Config.K4MB1 then
for k, v in pairs(K4MB1["MineStore"]) do
Targets["K4MB1Mine"..k] =
exports['qb-target']:AddCircleZone("K4MB1Mine"..k, v.coords.xyz, 1.0, { name="K4MB1Mine"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:openShop", icon = "fas fa-store", label = Loc[Config.Lan].info["browse_store"], job = Config.Job }, },
distance = 2.0 })
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
Peds[#Peds+1] = makePed(v.model, v.coords, 1, 1, v.scenario)
end
--Smelter to turn stone into ore
for k, v in pairs(K4MB1["Smelter"]) do
Targets["K4MB1Smelter"..k] =
exports['qb-target']:AddCircleZone("K4MB1Smelter"..k, v.coords.xyz, 1.5, { name="K4MB1Smelter"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:CraftMenu", icon = "fas fa-fire-burner", label = Loc[Config.Lan].info["use_smelter"], craftable = Crafting.SmeltMenu, job = Config.Job }, },
distance = 10.0
})
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
end
--Ore Buying Ped
for k, v in pairs(K4MB1["OreBuyer"]) do
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
Peds[#Peds+1] = makePed(v.model, v.coords, 1, 1, v.scenario)
Targets["K4MB1OreBuyer"..k] =
exports['qb-target']:AddCircleZone("K4MB1OreBuyer"..k, v.coords.xyz, 0.9, { name="K4MB1OreBuyer"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:SellOre", icon = "fas fa-sack-dollar", label = Loc[Config.Lan].info["sell_ores"], ped = Peds[#Peds], job = Config.Job }, },
distance = 2.0
})
end
--Jewel Cutting Bench
for k, v in pairs(K4MB1["JewelCut"]) do
Props[#Props+1] = makeProp(v, 1, false)
Targets["K4MB1JewelCut"..k] =
exports['qb-target']:AddCircleZone("K4MB1JewelCut"..k, v.coords.xyz, 2.0,{ name="K4MB1JewelCut"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:JewelCut", icon = "fas fa-gem", label = Loc[Config.Lan].info["jewelcut"], job = Config.Job, bench = Props[#Props]}, },
distance = 2.0
})
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
end
--Cracking Bench
for k, v in pairs(K4MB1["Cracking"]) do
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
Props[#Props+1] = makeProp(v, 1, false)
Targets["K4MB1Cracking"..k] =
exports['qb-target']:AddCircleZone("K4MB1Cracking"..k, v.coords.xyz, 1.2, {name="K4MB1Cracking"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:CrackStart", icon = "fas fa-compact-disc", item = "stone", label = Loc[Config.Lan].info["crackingbench"], bench = Props[#Props] }, },
distance = 2.0
})
end
--Ore Spawning
for k, v in pairs(K4MB1["OrePositions"]) do
Props[#Props+1] = makeProp({coords = v, prop = `cs_x_rubweec`}, 1, false)
Targets["K4MB1Ore"..k] =
exports['qb-target']:AddCircleZone("K4MB1Ore"..k, vector3(v.x, v.y, v.z-1.03), 1.2, { name="K4MB1Ore"..k, debugPoly=Config.Debug, useZ=true, },
{ options = {
{ event = "jim-mining:MineOre:Pick", icon = "fas fa-hammer", item = "pickaxe", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["pickaxe"].label..")", job = Config.Job, name = "K4MB1Ore"..k, stone = Props[#Props] },
{ event = "jim-mining:MineOre:Drill", icon = "fas fa-screwdriver", item = "miningdrill", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["miningdrill"].label..")", job = Config.Job, name = "K4MB1Ore"..k, stone = Props[#Props] },
{ event = "jim-mining:MineOre:Laser", icon = "fas fa-screwdriver-wrench", item = "mininglaser", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["mininglaser"].label..")", job = Config.Job, name = "K4MB1Ore"..k, stone = Props[#Props] },
},
distance = 1.3
})
Props[#Props+1] = makeProp({coords = vector4(v.x, v.y, v.z+0.25, v[4]), prop = `prop_rock_5_a`}, 1, false)
end
end
for k, v in pairs(Config.Locations["Washing"]) do
Targets["Washing"..k] =
exports['qb-target']:AddCircleZone("Washing"..k, v.coords.xyz, 9.0, {name="Washing"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:WashStart", icon = "fas fa-hands-bubbles", item = "stone", label = Loc[Config.Lan].info["washstone"], coords = v.coords }, },
distance = 2.0
})
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
end
--Panning
for k, v in pairs(Config.Locations["Panning"]) do
Targets["Panning"..k] =
exports['qb-target']:AddCircleZone("Panning"..k, v.coords.xyz, 9.0, {name="Panning"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:PanStart", icon = "fas fa-ring", item = "goldpan", label = Loc[Config.Lan].info["goldpan"], coords = v.coords }, },
distance = 2.0
})
if Config.Blips and v.blipTrue then Blip[#Blip+1] = makeBlip(v) end
end
--Jewel Buyer
for k, v in pairs(Config.Locations["JewelBuyer"]) do
Peds[#Peds+1] = makePed(v.model, v.coords, 1, 1, v.scenario)
Targets["JewelBuyer"..k] =
exports['qb-target']:AddCircleZone("JewelBuyer"..k, v.coords.xyz, 1.2, { name="JewelBuyer"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-mining:JewelSell", icon = "fas fa-gem", label = Loc[Config.Lan].info["jewelbuyer"], ped = Peds[#Peds], job = Config.Job }, },
distance = 2.0
})
end
end
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job end)
if Config.Job then if PlayerJob.name == Config.Job then makeJob() else removeJob() end else makeJob() end
end)
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
PlayerJob = JobInfo
if Config.Job then if PlayerJob.name == Config.Job then makeJob() else removeJob() end end
end)
AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName() ~= resource then return end
QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job end)
if Config.Job then if PlayerJob.name == Config.Job then makeJob() else removeJob() end else makeJob() end
end)
--------------------------------------------------------
RegisterNetEvent('jim-mining:openShop', function()
if Config.JimShops then event = "jim-shops:ShopOpen" else event = "inventory:server:OpenInventory" end
TriggerServerEvent(event, "shop", "mine", Config.Items)
end)
function stoneBreak(name, stone)
local rockcoords = GetEntityCoords(stone)
if Config.Debug then print("^5Debug^7: ^2Hiding prop and target^7: '^6"..name.."^7' ^2at coords^7: ^6"..rockcoords) end
--Stone CoolDown + Recreation
SetEntityAlpha(stone, 0)
--CreateModelHide(rockcoords, 1.0, `cs_x_rubweec`, true)
exports['qb-target']:RemoveZone(name) Targets[name] = nil
Wait(Config.Timings["OreRespawn"])
--Unhide Stone and create a new target location
SetEntityAlpha(stone, 255)
--RemoveModelHide(rockcoords, 1.0, `cs_x_rubweec`, true)
Targets[name] =
exports['qb-target']:AddCircleZone(name, vector3(rockcoords.x, rockcoords.y, rockcoords.z), 1.2, { name=name, debugPoly=Config.Debug, useZ=true, },
{ options = {
{ event = "jim-mining:MineOre:Pick", icon = "fas fa-hammer", item = "pickaxe", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["pickaxe"].label..")", job = Config.Job, name = name, stone = stone },
{ event = "jim-mining:MineOre:Drill", icon = "fas fa-screwdriver", item = "miningdrill", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["miningdrill"].label..")", job = Config.Job, name = name, stone = stone },
{ event = "jim-mining:MineOre:Laser", icon = "fas fa-screwdriver-wrench", item = "mininglaser", label = Loc[Config.Lan].info["mine_ore"].." ("..QBCore.Shared.Items["mininglaser"].label..")", job = Config.Job, name = name, stone = stone },
}, distance = 1.3 })
end
local isMining = false
RegisterNetEvent('jim-mining:MineOre:Drill', function(data)
if isMining then return else isMining = true end -- Stop players from doubling up the event
if HasItem("drillbit", 1) then
-- Sounds & Anim loading
loadDrillSound()
local dict = "anim@heists@fleeca_bank@drilling"
local anim = "drill_straight_fail"
loadAnimDict(tostring(dict))
--Create Drill and Attach
local DrillObject = CreateObject(`hei_prop_heist_drill`, GetEntityCoords(PlayerPedId(), true), true, true, true)
AttachEntityToEntity(DrillObject, PlayerPedId(), GetPedBoneIndex(PlayerPedId(), 57005), 0.14, 0, -0.01, 90.0, -90.0, 180.0, true, true, false, true, 1, true)
local IsDrilling = true
local rockcoords = GetEntityCoords(data.stone)
--Calculate if you're heading is within 20.0 degrees -
lookEnt(data.stone)
if #(rockcoords - GetEntityCoords(PlayerPedId())) > 1.5 then TaskGoStraightToCoord(PlayerPedId(), rockcoords, 0.5, 400, 0.0, 0) Wait(400) end
TaskPlayAnim(PlayerPedId(), tostring(dict), tostring(anim), 3.0, 3.0, -1, 1, 0, false, false, false)
Wait(200)
PlaySoundFromEntity(soundId, "Drill", DrillObject, "DLC_HEIST_FLEECA_SOUNDSET", 1, 0)
CreateThread(function() -- Dust/Debris Animation
loadPtfxDict("core")
while IsDrilling do
UseParticleFxAssetNextCall("core")
local dust = StartNetworkedParticleFxNonLoopedAtCoord("ent_dst_rocks", rockcoords.x, rockcoords.y, rockcoords.z, 0.0, 0.0, GetEntityHeading(PlayerPedId())-180.0, 1.0, 0.0, 0.0, 0.0)
Wait(600)
end
end)
QBCore.Functions.Progressbar("open_locker_drill", Loc[Config.Lan].info["drilling_ore"], Config.Timings["Mining"], false, true, {
disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), "anim@heists@fleeca_bank@drilling", "drill_straight_fail", 1.0)
destroyProp(DrillObject)
unloadPtfxDict("core")
unloadAnimDict(dict)
TriggerServerEvent('jim-mining:MineReward')
--Destroy drill bit chances
if math.random(1,10) >= 8 then
local breakId = GetSoundId()
PlaySoundFromEntity(breakId, "Drill_Pin_Break", PlayerPedId(), "DLC_HEIST_FLEECA_SOUNDSET", 1, 0)
toggleItem(0, "drillbit", 1)
end
unloadDrillSound()
StopSound(soundId)
IsDrilling = false
isMining = false
stoneBreak(data.name, data.stone)
end, function() -- Cancel
StopAnimTask(PlayerPedId(), "anim@heists@fleeca_bank@drilling", "drill_straight_idle", 1.0)
unloadDrillSound()
StopSound(soundId)
destroyProp(DrillObject)
unloadPtfxDict("core")
unloadAnimDict(dict)
IsDrilling = false
isMining = false
end, "miningdrill")
else
triggerNotify(nil, Loc[Config.Lan].error["no_drillbit"], nil) isMining = false return
end
end)
RegisterNetEvent('jim-mining:MineOre:Pick', function(data)
if isMining then return else isMining = true end -- Stop players from doubling up the event
-- Anim Loading
local dict = "amb@world_human_hammering@male@base"
local anim = "base"
loadAnimDict(tostring(dict))
loadDrillSound()
--Create Pickaxe and Attach
local PickAxe = CreateObject(`prop_tool_pickaxe`, GetEntityCoords(PlayerPedId(), true), true, true, true)
DisableCamCollisionForObject(PickAxe)
DisableCamCollisionForEntity(PickAxe)
AttachEntityToEntity(PickAxe, PlayerPedId(), GetPedBoneIndex(PlayerPedId(), 57005), 0.09, -0.53, -0.22, 252.0, 180.0, 0.0, false, true, true, true, 0, true)
local IsDrilling = true
local rockcoords = GetEntityCoords(data.stone)
--Calculate if you're facing the stone--
lookEnt(data.stone)
if #(rockcoords - GetEntityCoords(PlayerPedId())) > 1.5 then TaskGoStraightToCoord(PlayerPedId(), rockcoords, 0.5, 400, 0.0, 0) Wait(400) end
loadPtfxDict("core")
CreateThread(function()
while IsDrilling do
UseParticleFxAssetNextCall("core")
TaskPlayAnim(PlayerPedId(), tostring(dict), tostring(anim), 8.0, -8.0, -1, 2, 0, false, false, false)
Wait(200)
local pickcoords = GetOffsetFromEntityInWorldCoords(PickAxe, -0.4, 0.0, 0.7)
local dust = StartNetworkedParticleFxNonLoopedAtCoord("ent_dst_rocks", pickcoords.x, pickcoords.y, pickcoords.z, 0.0, 0.0, 0.0, 0.4, 0.0, 0.0, 0.0)
Wait(350)
end
end)
QBCore.Functions.Progressbar("open_locker_drill", Loc[Config.Lan].info["drilling_ore"], Config.Timings["Pickaxe"], false, true, {
disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), tostring(dict), tostring(anim), 1.0)
destroyProp(PickAxe)
unloadPtfxDict("core")
unloadAnimDict(dict)
TriggerServerEvent('jim-mining:MineReward')
if math.random(1,10) >= 9 then
local breakId = GetSoundId()
PlaySoundFromEntity(breakId, "Drill_Pin_Break", PlayerPedId(), "DLC_HEIST_FLEECA_SOUNDSET", 1, 0)
toggleItem(false, "pickaxe", 1)
end
unloadDrillSound()
StopSound(soundId)
IsDrilling = false
isMining = false
stoneBreak(data.name, data.stone)
end, function() -- Cancel
StopAnimTask(PlayerPedId(), tostring(dict), tostring(anim), 1.0)
destroyProp(PickAxe)
unloadPtfxDict("core")
unloadAnimDict(dict)
unloadDrillSound()
StopSound(soundId)
IsDrilling = false
isMining = false
end, "pickaxe")
end)
RegisterNetEvent('jim-mining:MineOre:Laser', function(data)
if isMining then return else isMining = true end -- Stop players from doubling up the event
-- Sounds & Anim Loading
RequestAmbientAudioBank("DLC_HEIST_BIOLAB_DELIVER_EMP_SOUNDS", 0)
RequestAmbientAudioBank("dlc_xm_silo_laser_hack_sounds", 0)
local dict = "anim@heists@fleeca_bank@drilling"
local anim = "drill_straight_fail"
loadAnimDict(tostring(dict))
--Create Drill and Attach
local DrillObject = CreateObject(`ch_prop_laserdrill_01a`, GetEntityCoords(PlayerPedId(), true), true, true, true)
AttachEntityToEntity(DrillObject, PlayerPedId(), GetPedBoneIndex(PlayerPedId(), 57005), 0.14, 0, -0.01, 90.0, -90.0, 180.0, true, true, false, true, 1, true)
local IsDrilling = true
local rockcoords = GetEntityCoords(data.stone)
--Calculate if you're facing the stone--
lookEnt(data.stone)
--Activation noise & Anims
TaskPlayAnim(PlayerPedId(), tostring(dict), 'drill_straight_idle' , 3.0, 3.0, -1, 1, 0, false, false, false)
PlaySoundFromEntity(soundId, "Pass", DrillObject, "dlc_xm_silo_laser_hack_sounds", 1, 0) Wait(1000)
TaskPlayAnim(PlayerPedId(), tostring(dict), tostring(anim), 3.0, 3.0, -1, 1, 0, false, false, false)
PlaySoundFromEntity(soundId, "EMP_Vehicle_Hum", DrillObject, "DLC_HEIST_BIOLAB_DELIVER_EMP_SOUNDS", 1, 0) --Not sure about this sound, best one I could find as everything else wouldn't load
--Laser & Debris Effect
local lasercoords = GetOffsetFromEntityInWorldCoords(DrillObject, 0.0,-0.5, 0.02)
CreateThread(function()
loadPtfxDict("core")
while IsDrilling do
UseParticleFxAssetNextCall("core")
local laser = StartNetworkedParticleFxNonLoopedAtCoord("muz_railgun", lasercoords.x, lasercoords.y, lasercoords.z, 0, -10.0, GetEntityHeading(DrillObject)+270, 1.0, 0.0, 0.0, 0.0)
UseParticleFxAssetNextCall("core")
local dust = StartNetworkedParticleFxNonLoopedAtCoord("ent_dst_rocks", rockcoords.x, rockcoords.y, rockcoords.z, 0.0, 0.0, GetEntityHeading(PlayerPedId())-180.0, 1.0, 0.0, 0.0, 0.0)
Wait(60)
end
end)
QBCore.Functions.Progressbar("open_locker_drill", Loc[Config.Lan].info["drilling_ore"], (Config.Timings["Laser"]), false, true, {
disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function() -- Done
IsDrilling = false
isMining = false
StopAnimTask(PlayerPedId(), tostring(dict), tostring(anim), 1.0)
ReleaseAmbientAudioBank("DLC_HEIST_BIOLAB_DELIVER_EMP_SOUNDS")
ReleaseAmbientAudioBank("dlc_xm_silo_laser_hack_sounds")
StopSound(soundId)
destroyProp(DrillObject)
unloadPtfxDict("core")
unloadAnimDict(dict)
TriggerServerEvent('jim-mining:MineReward')
stoneBreak(data.name, data.stone)
end, function() -- Cancel
IsDrilling = false
isMining = false
StopAnimTask(PlayerPedId(), tostring(dict), tostring(anim), 1.0)
ReleaseAmbientAudioBank("DLC_HEIST_BIOLAB_DELIVER_EMP_SOUNDS")
ReleaseAmbientAudioBank("dlc_xm_silo_laser_hack_sounds")
StopSound(soundId)
destroyProp(DrillObject)
unloadPtfxDict("core")
unloadAnimDict(dict)
stoneBreak(data.name, data.stone)
IsDrilling = false
isMining = false
end, "mininglaser")
end)
------------------------------------------------------------
-- Cracking Command / Animations
local Cracking = false
RegisterNetEvent('jim-mining:CrackStart', function(data)
if Cracking then return end
local cost = 1
if HasItem("stone", cost) then
Cracking = true
LocalPlayer.state:set("inv_busy", true, true) TriggerEvent('inventory:client:busy:status', true) TriggerEvent('canUseInventoryAndHotbar:toggle', false)
-- Sounds & Anim Loading
local dict ="amb@prop_human_parking_meter@male@idle_a"
local anim = "idle_a"
loadAnimDict(dict)
loadDrillSound()
local benchcoords = GetOffsetFromEntityInWorldCoords(data.bench, 0.0, -0.2, 2.08)
--Calculate if you're facing the bench--
lookEnt(data.bench)
if #(benchcoords - GetEntityCoords(PlayerPedId())) > 1.5 then TaskGoStraightToCoord(PlayerPedId(), benchcoords, 0.5, 400, 0.0, 0) Wait(400) end
local Rock = CreateObject(`prop_rock_5_smash1`, vector3(benchcoords.x, benchcoords.y, benchcoords.z-1.03), true, true, true)
PlaySoundFromCoord(soundId, "Drill", benchcoords, "DLC_HEIST_FLEECA_SOUNDSET", 0, 4.5, 0)
loadPtfxDict("core")
CreateThread(function()
while Cracking do
UseParticleFxAssetNextCall("core")
local dust = StartNetworkedParticleFxNonLoopedAtCoord("ent_dst_rocks", benchcoords.x, benchcoords.y, benchcoords.z-0.9, 0.0, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0)
Wait(400)
end
end)
TaskPlayAnim(PlayerPedId(), dict, anim, 3.0, 3.0, -1, 1, 0, false, false, false)
QBCore.Functions.Progressbar("open_locker_drill", Loc[Config.Lan].info["cracking_stone"], Config.Timings["Cracking"], false, true, {
disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), dict, anim, 1.0)
unloadDrillSound()
StopSound(soundId)
unloadPtfxDict("core")
unloadAnimDict(dict)
destroyProp(Rock)
TriggerServerEvent('jim-mining:CrackReward', cost)
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
Cracking = false
end, function() -- Cancel
StopAnimTask(PlayerPedId(), dict, anim, 1.0)
unloadDrillSound()
StopSound(soundId)
unloadPtfxDict("core")
unloadAnimDict(dict)
destroyProp(Rock)
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
Cracking = false
end, "stone")
else
triggerNotify(nil, Loc[Config.Lan].error["no_stone"], 'error')
end
end)
------------------------------------------------------------
-- Washing Command / Animations
local Washing = false
RegisterNetEvent('jim-mining:WashStart', function(data)
if Washing then return end
local cost = 1
if HasItem("stone", cost) then
Washing = true
LocalPlayer.state:set("inv_busy", true, true) TriggerEvent('inventory:client:busy:status', true) TriggerEvent('canUseInventoryAndHotbar:toggle', false)
--Create Rock and Attach
local Rock = CreateObject(`prop_rock_5_smash1`, GetEntityCoords(PlayerPedId()), true, true, true)
local rockcoords = GetEntityCoords(Rock)
AttachEntityToEntity(Rock, PlayerPedId(), GetPedBoneIndex(PlayerPedId(), 60309), 0.1, 0.0, 0.05, 90.0, -90.0, 90.0, true, true, false, true, 1, true)
TaskStartScenarioInPlace(PlayerPedId(), "PROP_HUMAN_BUM_BIN", 0, true)
local water
CreateThread(function()
Wait(3000)
loadPtfxDict("core")
while Washing do
UseParticleFxAssetNextCall("core")
water = StartNetworkedParticleFxLoopedOnEntity("water_splash_veh_out", PlayerPedId(), 0.0, 1.0, -0.2, 0.0, 0.0, 0.0, 2.0, 0, 0, 0)
Wait(500)
end
end)
QBCore.Functions.Progressbar("open_locker_drill", Loc[Config.Lan].info["washing_stone"], Config.Timings["Washing"], false, true, {
disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function() -- Done
TriggerServerEvent('jim-mining:WashReward', cost)
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
StopParticleFxLooped(water, 0)
destroyProp(Rock)
unloadPtfxDict("core")
Washing = false
end, function() -- Cancel
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
StopParticleFxLooped(water, 0)
destroyProp(Rock)
unloadPtfxDict("core")
Washing = false
end, "stone")
else
triggerNotify(nil, Loc[Config.Lan].error["no_stone"], 'error')
end
end)
------------------------------------------------------------
-- Gold Panning Command / Animations
local Panning = false
RegisterNetEvent('jim-mining:PanStart', function(data)
if IsEntityInWater(PlayerPedId()) then
if Panning then return else Panning = true end
LocalPlayer.state:set("inv_busy", true, true) TriggerEvent('inventory:client:busy:status', true) TriggerEvent('canUseInventoryAndHotbar:toggle', false)
--Create Rock and Attach
local trayCoords = GetOffsetFromEntityInWorldCoords(PlayerPedId(), 0.0, 0.5, -0.9)
Props[#Props+1] = makeProp({ coords = vector4(trayCoords.x, trayCoords.y, trayCoords.z+1.03, GetEntityHeading(PlayerPedId())), prop = `bkr_prop_meth_tray_01b`} , 1, 1)
CreateThread(function()
loadPtfxDict("core")
while Panning do
UseParticleFxAssetNextCall("core")
local water = StartNetworkedParticleFxLoopedOnEntity("water_splash_veh_out", Props[#Props], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0, 0, 0)
Wait(100)
end
end)
--Start Anim
TaskStartScenarioInPlace(PlayerPedId(), "CODE_HUMAN_MEDIC_KNEEL", 0, true)
QBCore.Functions.Progressbar("open_locker_drill", Loc[Config.Lan].info["goldpanning"], Config.Timings["Panning"], false, true, {
disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function() -- Done
TriggerServerEvent('jim-mining:PanReward')
ClearPedTasksImmediately(PlayerPedId())
TaskGoStraightToCoord(PlayerPedId(), trayCoords, 4.0, 100, GetEntityHeading(PlayerPedId()), 0)
destroyProp(Props[#Props])
unloadPtfxDict("core")
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
Panning = false
end, function() -- Cance
ClearPedTasksImmediately(PlayerPedId())
TaskGoStraightToCoord(PlayerPedId(), trayCoords, 4.0, 100, GetEntityHeading(PlayerPedId()), 0)
destroyProp(Props[#Props])
unloadPtfxDict("core")
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
Panning = false
end, "goldpan")
end
end)
RegisterNetEvent('jim-mining:MakeItem', function(data)
if data.ret then
if not HasItem("drillbit", 1) then triggerNotify(nil, Loc[Config.Lan].error["no_drillbit"], 'error') TriggerEvent('jim-mining:JewelCut') return end
end
itemProgress(data)
end)
function itemProgress(data)
if data.craftable then
if not data.ret then bartext = Loc[Config.Lan].info["smelting"]..QBCore.Shared.Items[data.item].label
else bartext = Loc[Config.Lan].info["cutting"]..QBCore.Shared.Items[data.item].label end
end
LocalPlayer.state:set("inv_busy", true, true) TriggerEvent('inventory:client:busy:status', true) TriggerEvent('canUseInventoryAndHotbar:toggle', false)
local isDrilling = true
if data.ret then -- If jewelcutting
local drillcoords
local scene
local dict = "anim@amb@machinery@speed_drill@"
local anim = "operate_02_hi_amy_skater_01"
loadAnimDict(tostring(dict))
for _, v in pairs(Props) do
if #(GetEntityCoords(v) - GetEntityCoords(PlayerPedId())) <= 2.0 and GetEntityModel(v) == `gr_prop_gr_speeddrill_01c` then
loadDrillSound()
PlaySoundFromEntity(soundId, "Drill", v, "DLC_HEIST_FLEECA_SOUNDSET", 0.5, 0)
drillcoords = GetOffsetFromEntityInWorldCoords(v, 0.0, -0.15, 0.0)
scene = NetworkCreateSynchronisedScene(GetEntityCoords(v), GetEntityRotation(v), 2, false, false, 1065353216, 0, 1.3)
NetworkAddPedToSynchronisedScene(PlayerPedId(), scene, tostring(dict), tostring(anim), 0, 0, 0, 16, 1148846080, 0)
NetworkStartSynchronisedScene(scene)
break
end
end
CreateThread(function()
loadPtfxDict("core")
while isDrilling do
UseParticleFxAssetNextCall("core")
local dust = StartNetworkedParticleFxNonLoopedAtCoord("glass_side_window", drillcoords.x, drillcoords.y, drillcoords.z+1.1, 0.0, 0.0, GetEntityHeading(PlayerPedId())+math.random(0, 359), 0.2, 0.0, 0.0, 0.0)
Wait(100)
end
end)
else -- If not Jewel Cutting, you'd be smelting (need to work out what is possible for this)
animDictNow = "amb@prop_human_parking_meter@male@idle_a"
animNow = "idle_a"
end
QBCore.Functions.Progressbar('making_food', bartext, Config.Timings["Crafting"], false, true, { disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, },
{ animDict = animDictNow, anim = animNow, flags = 8, }, {}, {}, function()
TriggerServerEvent('jim-mining:GetItem', data)
if data.ret then
if math.random(1,10) >= 8 then
local breakId = GetSoundId()
PlaySoundFromEntity(breakId, "Drill_Pin_Break", PlayerPedId(), "DLC_HEIST_FLEECA_SOUNDSET", 1, 0)
toggleItem(false, "drillbit", 1)
end
end
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
unloadDrillSound()
StopSound(soundId)
unloadPtfxDict("core")
isDrilling = false
NetworkStopSynchronisedScene(scene)
end, function() -- Cancel
triggerNotify(nil, Loc[Config.Lan].error["cancelled"], 'error')
StopAnimTask(PlayerPedId(), animDictNow, animNow, 1.0)
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true)
unloadDrillSound()
StopSound(soundId)
unloadPtfxDict("core")
unloadAnimDict(dict)
isDrilling = false
NetworkStopSynchronisedScene(scene)
end, data.item)
end
------------------------------------------------------------
--Selling animations are simply a pass item to seller animation
RegisterNetEvent('jim-mining:SellAnim', function(data)
if not HasItem(data.item, 1) then triggerNotify(nil, Loc[Config.Lan].error["dont_have"].." "..QBCore.Shared.Items[data.item].label, "error") return end
loadAnimDict("mp_common")
TriggerServerEvent('jim-mining:Selling', data) -- Had to slip in the sell command during the animation command
loadAnimDict("mp_common")
lookEnt(data.ped)
TaskPlayAnim(PlayerPedId(), "mp_common", "givetake2_a", 100.0, 200.0, 0.3, 1, 0.2, 0, 0, 0) --Start animations
TaskPlayAnim(data.ped, "mp_common", "givetake2_b", 100.0, 200.0, 0.3, 1, 0.2, 0, 0, 0)
Wait(2000)
StopAnimTask(PlayerPedId(), "mp_common", "givetake2_a", 1.0)
StopAnimTask(data.ped, "mp_common", "givetake2_b", 1.0)
unloadAnimDict("mp_common")
if data.sub then TriggerEvent('jim-mining:JewelSell:Sub', { sub = data.sub, ped = data.ped }) return
else TriggerEvent('jim-mining:SellOre', data) return end
end)
------------------------------------------------------------
RegisterNetEvent('jim-mining:SellOre', function(data)
local list = {"goldingot", "silveringot", "copperore", "ironore", "goldore", "silverore", "carbon"}
local sellMenu = {
{ header = Loc[Config.Lan].info["header_oresell"], txt = Loc[Config.Lan].info["oresell_txt"], isMenuHeader = true },
{ icon = "fas fa-circle-xmark", header = "", txt = Loc[Config.Lan].info["close"], params = { event = "jim-mining:CraftMenu:Close" } } }
for _, v in pairs(list) do
local setheader = "<img src=nui://"..Config.img..QBCore.Shared.Items[v].image.." width=30px onerror='this.onerror=null; this.remove();'>"..QBCore.Shared.Items[v].label
local disable = true
if HasItem(v, 1) then setheader = setheader.." 💰" disable = false end
sellMenu[#sellMenu+1] = { icon = v, disabled = disable, header = setheader, txt = Loc[Config.Lan].info["sell_all"].." "..Config.SellItems[v].." "..Loc[Config.Lan].info["sell_each"], params = { event = "jim-mining:SellAnim", args = { item = v, ped = data.ped } } }
Wait(0)
end
exports['qb-menu']:openMenu(sellMenu)
end)
------------------------
--Jewel Selling Main Menu
RegisterNetEvent('jim-mining:JewelSell', function(data)
exports['qb-menu']:openMenu({
{ header = Loc[Config.Lan].info["jewel_buyer"], txt = Loc[Config.Lan].info["sell_jewel"], isMenuHeader = true },
{ icon = "fas fa-circle-xmark", header = "", txt = Loc[Config.Lan].info["close"], params = { event = "jim-mining:CraftMenu:Close" } },
{ header = QBCore.Shared.Items["emerald"].label, txt = Loc[Config.Lan].info["see_options"], params = { event = "jim-mining:JewelSell:Sub", args = { sub = "emerald", ped = data.ped } } },
{ header = QBCore.Shared.Items["ruby"].label, txt = Loc[Config.Lan].info["see_options"], params = { event = "jim-mining:JewelSell:Sub", args = { sub = "ruby", ped = data.ped } } },
{ header = QBCore.Shared.Items["diamond"].label, txt = Loc[Config.Lan].info["see_options"], params = { event = "jim-mining:JewelSell:Sub", args = { sub = "diamond", ped = data.ped } } },
{ header = QBCore.Shared.Items["sapphire"].label, txt = Loc[Config.Lan].info["see_options"], params = { event = "jim-mining:JewelSell:Sub", args = { sub = "sapphire", ped = data.ped } } },
{ header = Loc[Config.Lan].info["rings"], txt = Loc[Config.Lan].info["see_options"], params = { event = "jim-mining:JewelSell:Sub", args = { sub = "rings", ped = data.ped } } },
{ header = Loc[Config.Lan].info["necklaces"], txt = Loc[Config.Lan].info["see_options"], params = { event = "jim-mining:JewelSell:Sub", args = { sub = "necklaces", ped = data.ped } } },
{ header = Loc[Config.Lan].info["earrings"], txt = Loc[Config.Lan].info["see_options"], params = { event = "jim-mining:JewelSell:Sub", args = { sub = "earrings", ped = data.ped } } },
})
end)
--Jewel Selling - Sub Menu Controller
RegisterNetEvent('jim-mining:JewelSell:Sub', function(data)
local list = {}
local sellMenu = {
{ header = Loc[Config.Lan].info["jewel_buyer"], txt = Loc[Config.Lan].info["sell_jewel"], isMenuHeader = true },
{ icon = "fas fa-circle-arrow-left", header = "", txt = Loc[Config.Lan].info["return"], params = { event = "jim-mining:JewelSell", args = data } }, }
if data.sub == "emerald" then list = {"emerald", "uncut_emerald"} end
if data.sub == "ruby" then list = {"ruby", "uncut_ruby"} end
if data.sub == "diamond" then list = {"diamond", "uncut_diamond"} end
if data.sub == "sapphire" then list = {"sapphire", "uncut_sapphire"} end
if data.sub == "rings" then list = {"gold_ring", "silver_ring", "diamond_ring", "emerald_ring", "ruby_ring", "sapphire_ring", "diamond_ring_silver", "emerald_ring_silver", "ruby_ring_silver", "sapphire_ring_silver"} end
if data.sub == "necklaces" then list = {"goldchain", "silverchain", "diamond_necklace", "emerald_necklace", "ruby_necklace", "sapphire_necklace", "diamond_necklace_silver", "emerald_necklace_silver", "ruby_necklace_silver", "sapphire_necklace_silver"} end
if data.sub == "earrings" then list = {"goldearring", "silverearring", "diamond_earring", "emerald_earring", "ruby_earring", "sapphire_earring", "diamond_earring_silver", "emerald_earring_silver", "ruby_earring_silver", "sapphire_earring_silver"} end
for _, v in pairs(list) do
local disable = true
local setheader = "<img src=nui://"..Config.img..QBCore.Shared.Items[v].image.." width=30px onerror='this.onerror=null; this.remove();'>"..QBCore.Shared.Items[v].label
if HasItem(v, 1) then setheader = setheader.." 💰" disable = false end
sellMenu[#sellMenu+1] = { disabled = disable, icon = v, header = setheader, txt = Loc[Config.Lan].info["sell_all"].." "..Config.SellItems[v].." "..Loc[Config.Lan].info["sell_each"], params = { event = "jim-mining:SellAnim", args = { item = v, sub = data.sub, ped = data.ped } } }
Wait(0)
end
exports['qb-menu']:openMenu(sellMenu)
end)
--Cutting Jewels
RegisterNetEvent('jim-mining:JewelCut', function()
exports['qb-menu']:openMenu({
{ header = Loc[Config.Lan].info["craft_bench"], txt = Loc[Config.Lan].info["req_drill_bit"], isMenuHeader = true },
{ icon = "fas fa-circle-xmark", header = "", txt = Loc[Config.Lan].info["close"], params = { event = "jim-mining:CraftMenu:Close" } },
{ header = Loc[Config.Lan].info["gem_cut"], txt = Loc[Config.Lan].info["gem_cut_section"], params = { event = "jim-mining:CraftMenu", args = { craftable = Crafting.GemCut, ret = true } } },
{ header = Loc[Config.Lan].info["make_ring"], txt = Loc[Config.Lan].info["ring_craft_section"], params = { event = "jim-mining:CraftMenu", args = { craftable = Crafting.RingCut, ret = true } } },
{ header = Loc[Config.Lan].info["make_neck"], txt = Loc[Config.Lan].info["neck_craft_section"], params = { event = "jim-mining:CraftMenu", args = { craftable = Crafting.NeckCut, ret = true } } },
{ header = Loc[Config.Lan].info["make_ear"], txt = Loc[Config.Lan].info["ear_craft_section"], params = { event = "jim-mining:CraftMenu", args = { craftable = Crafting.EarCut, ret = true } } },
})
end)
RegisterNetEvent('jim-mining:CraftMenu', function(data)
local CraftMenu = {}
if data.ret then
CraftMenu[#CraftMenu + 1] = { header = Loc[Config.Lan].info["craft_bench"], txt = Loc[Config.Lan].info["req_drill_bit"], isMenuHeader = true }
CraftMenu[#CraftMenu + 1] = { icon = "fas fa-circle-arrow-left", header = "", txt = Loc[Config.Lan].info["return"], params = { event = "jim-mining:JewelCut" } }
else
CraftMenu[#CraftMenu + 1] = { header = Loc[Config.Lan].info["smelter"], txt = Loc[Config.Lan].info["smelt_ores"], isMenuHeader = true }
CraftMenu[#CraftMenu + 1] = { icon = "fas fa-circle-xmark", header = "", txt = Loc[Config.Lan].info["close"], params = { event = "jim-mining:CraftMenu:Close" } }
end
for i = 1, #data.craftable do
for k in pairs(data.craftable[i]) do
if k ~= "amount" then
local text = ""
if data.craftable[i]["amount"] then amount = " x"..data.craftable[i]["amount"] else amount = "" end
setheader = "<img src=nui://"..Config.img..QBCore.Shared.Items[k].image.." width=30px onerror='this.onerror=null; this.remove();'>"..QBCore.Shared.Items[k].label..tostring(amount)
local disable = false
local checktable = {}
for l, b in pairs(data.craftable[i][tostring(k)]) do
if b == 1 then number = "" else number = " x"..b end
text = text.."- "..QBCore.Shared.Items[l].label..number.."<br>"
settext = text
checktable[l] = HasItem(l, b)
end
for _, v in pairs(checktable) do if v == false then disable = true break end end
if not disable then setheader = setheader.." ✔️" end
CraftMenu[#CraftMenu + 1] = { isMenuHeader = disable, icon = k, header = setheader, txt = settext, params = { event = "jim-mining:MakeItem", args = { item = k, tablenumber = i, craftable = data.craftable, ret = data.ret } } }
settext, amount, setheader = nil
end
end
end
exports['qb-menu']:openMenu(CraftMenu)
end)
AddEventHandler('onResourceStop', function(resource) if resource == GetCurrentResourceName() then removeJob() end end)