Draw items from the submarine for fabricator crafting
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
				
			|||||||
-- luacheck: globals Character Game MyModGlobal
 | 
					-- luacheck: globals Character Game MyModGlobal
 | 
				
			||||||
local utils = require("Cyka.utils")
 | 
					local utils = require("Cyka.utils")
 | 
				
			||||||
 | 
					local dump = require("Cyka.dump")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---@return {item: Barotrauma.Item, fabricator: Barotrauma.FabricatorComponent}, string?
 | 
					---@return {item: Barotrauma.Item, fabricator: Barotrauma.FabricatorComponent}, string?
 | 
				
			||||||
local function getOpenFabricator()
 | 
					local function getOpenFabricator()
 | 
				
			||||||
@@ -115,6 +116,7 @@ local function tryStackFabricator(character)
 | 
				
			|||||||
	local toGet = {}
 | 
						local toGet = {}
 | 
				
			||||||
	---@type fun(item: Barotrauma.Item): boolean, boolean
 | 
						---@type fun(item: Barotrauma.Item): boolean, boolean
 | 
				
			||||||
	local filter = function(item)
 | 
						local filter = function(item)
 | 
				
			||||||
 | 
							-- TODO: Take into account minCondition and maxCondition
 | 
				
			||||||
		local found = false
 | 
							local found = false
 | 
				
			||||||
		-- MyModGlobal.DumpTable(toFind)
 | 
							-- MyModGlobal.DumpTable(toFind)
 | 
				
			||||||
		-- toFind are all items we need to find
 | 
							-- toFind are all items we need to find
 | 
				
			||||||
@@ -141,6 +143,7 @@ local function tryStackFabricator(character)
 | 
				
			|||||||
		-- MyModGlobal.debugPrint(string.format("Found %s %s", item.Prefab.Identifier.Value, tostring(remaining)))
 | 
							-- MyModGlobal.debugPrint(string.format("Found %s %s", item.Prefab.Identifier.Value, tostring(remaining)))
 | 
				
			||||||
		return found, remaining == 0
 | 
							return found, remaining == 0
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
						-- dump(itemsOnSubmarine)
 | 
				
			||||||
	-- MyModGlobal.DumpTable(toGet)
 | 
						-- MyModGlobal.DumpTable(toGet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local items = utils.enqueueInventory(bagItem.OwnInventory, {}, filter)
 | 
						local items = utils.enqueueInventory(bagItem.OwnInventory, {}, filter)
 | 
				
			||||||
@@ -154,14 +157,59 @@ local function tryStackFabricator(character)
 | 
				
			|||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- If we looked at all items we have on person and still are missing some
 | 
				
			||||||
 | 
						-- Look at all the items on the submarine
 | 
				
			||||||
 | 
						local hasAny = false
 | 
				
			||||||
 | 
						for _, itemInfo in pairs(toFind) do
 | 
				
			||||||
 | 
							if itemInfo.amount > 0 then
 | 
				
			||||||
 | 
								hasAny = true
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if hasAny then
 | 
				
			||||||
 | 
							local submarine = character.Submarine
 | 
				
			||||||
 | 
							local found
 | 
				
			||||||
 | 
							if not submarine then
 | 
				
			||||||
 | 
								MyModGlobal.debugPrint("Submarine not found.")
 | 
				
			||||||
 | 
								goto done
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							for item in submarine.GetItems(false) do
 | 
				
			||||||
 | 
								if remaining == 0 then goto done end
 | 
				
			||||||
 | 
								for i, itemInfo in pairs(toFind) do
 | 
				
			||||||
 | 
									found = false
 | 
				
			||||||
 | 
									for _, prefab in ipairs(itemInfo.prefabs) do
 | 
				
			||||||
 | 
										-- MyModGlobal.debugPrint(string.format("Checking %s against %s", item.Prefab.Identifier.Value, prefab))
 | 
				
			||||||
 | 
										if tostring(item.Prefab.Identifier.Value) == prefab then
 | 
				
			||||||
 | 
											-- MyModGlobal.debugPrint(string.format("That'll do %s %s", item.Prefab.Identifier.Value, prefab))
 | 
				
			||||||
 | 
											items[#items + 1] = item
 | 
				
			||||||
 | 
											itemInfo.amount = itemInfo.amount - 1
 | 
				
			||||||
 | 
											found = true
 | 
				
			||||||
 | 
											break
 | 
				
			||||||
 | 
										end
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									if itemInfo.amount <= 0 then
 | 
				
			||||||
 | 
										-- MyModGlobal.debugPrint(string.format("Removing %s from toFind", itemInfo.prefabs[1]))
 | 
				
			||||||
 | 
										toFind[i] = nil
 | 
				
			||||||
 | 
										remaining = remaining - 1
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									if found then break end
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							::done::
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local slot = -1
 | 
						local slot = -1
 | 
				
			||||||
	local previous = nil
 | 
						local previous = nil
 | 
				
			||||||
	for _, item in ipairs(items) do
 | 
						for _, item in ipairs(items) do
 | 
				
			||||||
		if previous ~= item.Prefab.Identifier then slot = slot + 1 end
 | 
							if previous ~= item.Prefab.Identifier then slot = slot + 1 end
 | 
				
			||||||
		inputInventory.TryPutItem(item, slot, false, true, nil)
 | 
							local moved = inputInventory.TryPutItem(item, slot, false, true, nil)
 | 
				
			||||||
 | 
							if not moved then
 | 
				
			||||||
 | 
								MyModGlobal.debugPrint(string.format("Failed to move %s", item.Prefab.Identifier.Value))
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
		previous = item.Prefab.Identifier
 | 
							previous = item.Prefab.Identifier
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	MyModGlobal.DumpTable(items)
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
return {
 | 
					return {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user