From e9c54cbdd4d517afc66de81a98ddad95fcfbd2b8 Mon Sep 17 00:00:00 2001 From: Jim Shield Date: Mon, 5 May 2025 12:24:38 +0100 Subject: [PATCH] `multiCraft()` refactor An attempt to speed up `multiCraft()` function creation logic Before it created a table of items while it was trying to check them I've separated this so it just gets that out of the way and checks items in it's own `for` loop Also added a `maxCreation` variable that users can edit if needed which decides how many of an item can be created (I'll change this soon probably to tie into the config options in scripts for multicraft again soon Also removed a few `Wait()`s that were there to help it not get confused, but after testing I believe this didn't make a difference, let me know if there's any issues with stuff like it saying it can craft when you dont have the items --- shared/crafting.lua | 54 +++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/shared/crafting.lua b/shared/crafting.lua index 2a3fd3d..4b265e2 100644 --- a/shared/crafting.lua +++ b/shared/crafting.lua @@ -80,11 +80,6 @@ function craftingMenu(data) -- Build a table of all required ingredients (default quantity is 1). for i = 1, #Recipes do for k in pairs(Recipes[i]) do - if k == "hasCrafted" and not data.craftable.craftedItems then - -- Retreive list of already crafted items from playermetadata to see if we should class this recipe as "new" - craftedItems = GetMetadata(nil, "craftedItems") or {} - data.craftable.craftedItems = craftedItems - end if k ~= "amount" and k ~= "metadata" and k ~= "job" and k ~= "gang" then tempCarryTable[k] = Recipes[i].amount or 1 end @@ -114,7 +109,7 @@ function craftingMenu(data) settext = settext..(settext ~= "" and br or "")..(Items[l] and Items[l].label or "error - "..l)..(b > 1 and " x"..b or "") metaTable[Items[l] and Items[l].label or "error - "..l] = b itemTable[l] = b - Wait(0) + --Wait(0) end while not canCarryTable do Wait(0) end @@ -122,25 +117,16 @@ function craftingMenu(data) setheader = ((metadata and metadata.label) or (Items[tostring(k)] and Items[tostring(k)].label) or "error - "..tostring(k)) ..(Recipes[i]["amount"] > 1 and " x"..Recipes[i]["amount"] or "") - if not disable then - if not canCarryTable[k] then - setheader = setheader.." 📦" - else - setheader = setheader.." ✔️" - end - elseif not canCarryTable[k] then - setheader = setheader.." 📦" - end - if Recipes[i]["hasCrafted"] ~= nil and craftedItems[k] == nil then - setheader = "✨ "..setheader - end + local statusEmoji = disable and " ❌" or not canCarryTable[k] and " 📦" or " ✔️" + local isNew = (Recipes[i]["hasCrafted"] ~= nil and craftedItems[k] == nil) and "✨ " or "" + setheader = isNew .. setheader .. statusEmoji Menu[#Menu + 1] = { arrow = not disable and canCarryTable[k], isMenuHeader = disable or not canCarryTable[k], icon = invImg((metadata and metadata.image) or tostring(k)), image = invImg((metadata and metadata.image) or tostring(k)), - header = setheader..((disable or not canCarryTable[k]) and " ❌" or ""), + header = setheader, txt = (isStarted(QBMenuExport) or disable) and settext or nil, metadata = metaTable, onSelect = (not disable and canCarryTable[k]) and function() @@ -162,7 +148,7 @@ function craftingMenu(data) } end end - Wait(0) + --Wait(0) end end @@ -208,16 +194,23 @@ end function multiCraft(data) local max = 0 local stashName = nil - for i = 1, 100 do - local itemTable = {} - for l, b in pairs(data.craft[data.item]) do - debugPrint("") - itemTable[l] = (b * i) - end + local maxCreation = 100 + -- Generate item table to check against stash or inventory + -- takes into account the ingredients needed for multiple items + local multiItemTable = {} + + for i = 1, maxCreation do + multiItemTable[i] = {} + for l, b in pairs(data.craft[data.item]) do + multiItemTable[i][l] = (b * i) + end + end + + for i = 1, maxCreation do + -- if its received a stash name, check if the items are in the stash if data.stashName then - debugPrint("") - local hasItems, stashname = checkStashItem(data.stashName, itemTable) + local hasItems, stashname = checkStashItem(data.stashName, multiItemTable[i]) if hasItems == true then max += 1 stashName = stashname @@ -225,15 +218,14 @@ function multiCraft(data) break end else - debugPrint("") - local has, _ = hasItem(itemTable, nil, nil) + -- if not check the players inventory for the items + local has, _ = hasItem(multiItemTable[i], nil, nil) if has then max += 1 else break end end - Wait(10) end local dialog = createInput(data.craftable.Header, {