SHOW:
|
|
- or go back to the newest paste.
| 1 | -- Adapted from Marval's pastebin b2fc4912 but converted to English via ChatGPT | |
| 2 | - | Z = {1,2,3,5,6,7,9,10,11}
|
| 2 | + | -- All credit goes to Marval. This v.5 is untested as of yet, and likely needs some post-AI tweaking. |
| 3 | - | x={}
|
| 3 | + | |
| 4 | - | tCraft={}
|
| 4 | + | -- Initialize the peripheral analyzer on the right side of the turtle |
| 5 | - | function oddaj() |
| 5 | + | |
| 6 | - | for i=1,16 do |
| 6 | + | |
| 7 | -- Define crafting slot positions | |
| 8 | - | if turtle.getItemCount(i)>0 then |
| 8 | + | local craftingSlots = {1,2,3,5,6,7,9,10,11}
|
| 9 | - | turtle.select(i) |
| 9 | + | |
| 10 | - | turtle.drop() |
| 10 | + | -- Initialize the tables |
| 11 | local x = {}
| |
| 12 | local tCraft = {}
| |
| 13 | ||
| 14 | - | function zlicz(recka2) |
| 14 | + | -- Function to drop all items from the turtle's inventory |
| 15 | - | ZLICZ={}
|
| 15 | + | local function dropAllItems() |
| 16 | - | for i=1,9 do |
| 16 | + | for i = 1, 16 do |
| 17 | - | ZLICZ[i]={ID,META,COUNT}
|
| 17 | + | if turtle.getItemCount(i) > 0 then |
| 18 | turtle.select(i) | |
| 19 | - | for i=1,9 do |
| 19 | + | turtle.drop() |
| 20 | - | if recka2[i][1] == nil then |
| 20 | + | end |
| 21 | - | else |
| 21 | + | end |
| 22 | - | ZLICZ[1].ID = recka2[i][1] |
| 22 | + | |
| 23 | - | ZLICZ[1].META = recka2[i][2] |
| 23 | + | |
| 24 | - | ZLICZ[1].COUNT = 1 |
| 24 | + | -- Function to count items in the crafting grid |
| 25 | - | w = i |
| 25 | + | local function countItems(craftingGrid) |
| 26 | - | break |
| 26 | + | local countList = {}
|
| 27 | for i = 1, 9 do | |
| 28 | countList[i] = {ID = nil, META = nil, COUNT = 0}
| |
| 29 | - | k = 1 |
| 29 | + | end |
| 30 | - | for i = w+1,9 do |
| 30 | + | |
| 31 | - | check = false |
| 31 | + | -- Find the first non-empty slot |
| 32 | - | if recka2[i][1] == nil then |
| 32 | + | local startIndex = 0 |
| 33 | - | else |
| 33 | + | for i = 1, 9 do |
| 34 | - | X = recka2[i][1] |
| 34 | + | if craftingGrid[i][1] ~= nil then |
| 35 | - | Y = recka2[i][2] |
| 35 | + | countList[1].ID = craftingGrid[i][1] |
| 36 | - | --print("Wyraz nr " ..i.. " wynosi " ..X.."")
|
| 36 | + | countList[1].META = craftingGrid[i][2] |
| 37 | - | for j = 1,k do |
| 37 | + | countList[1].COUNT = 1 |
| 38 | - | if X == ZLICZ[j].ID and Y == ZLICZ[j].META then |
| 38 | + | startIndex = i |
| 39 | - | ZLICZ[j].COUNT = ZLICZ[j].COUNT + 1 |
| 39 | + | break |
| 40 | - | --print("Zwiekszam ilosc liczb "..X.." o jeden")
|
| 40 | + | end |
| 41 | - | check = true |
| 41 | + | end |
| 42 | - | end |
| 42 | + | |
| 43 | - | |
| 43 | + | -- Count the rest of the items |
| 44 | - | end |
| 44 | + | local itemCount = 1 |
| 45 | - | if check == false then |
| 45 | + | for i = startIndex + 1, 9 do |
| 46 | - | k = k+1 |
| 46 | + | local itemFound = false |
| 47 | - | ZLICZ[k].ID = X |
| 47 | + | if craftingGrid[i][1] ~= nil then |
| 48 | - | ZLICZ[k].META = Y |
| 48 | + | local itemId = craftingGrid[i][1] |
| 49 | - | --print("Dopisuje element o nr " ..k.. " o wartosci "..X.."")
|
| 49 | + | local itemMeta = craftingGrid[i][2] |
| 50 | - | ZLICZ[k].COUNT = 1 |
| 50 | + | |
| 51 | - | |
| 51 | + | for j = 1, itemCount do |
| 52 | - | end |
| 52 | + | if itemId == countList[j].ID and itemMeta == countList[j].META then |
| 53 | - | end |
| 53 | + | countList[j].COUNT = countList[j].COUNT + 1 |
| 54 | itemFound = true | |
| 55 | - | return ZLICZ,k |
| 55 | + | break |
| 56 | end | |
| 57 | - | function sprawdz(dane,rekordy) |
| 57 | + | end |
| 58 | - | sprawdzenie = true |
| 58 | + | |
| 59 | - | for i=1,rekordy do |
| 59 | + | if not itemFound then |
| 60 | - | slot = 0 |
| 60 | + | itemCount = itemCount + 1 |
| 61 | - | X = 0 |
| 61 | + | countList[itemCount].ID = itemId |
| 62 | - | Y = 0 |
| 62 | + | countList[itemCount].META = itemMeta |
| 63 | - | ilosc = 0 |
| 63 | + | countList[itemCount].COUNT = 1 |
| 64 | - | --print("Poszukuje bloku o ID rownym " ..dane[i].ID.. "")
|
| 64 | + | end |
| 65 | - | repeat |
| 65 | + | end |
| 66 | - | slot = slot + 1 |
| 66 | + | end |
| 67 | - | X = analyzer.getBlockIdAt(slot) |
| 67 | + | |
| 68 | - | Y = analyzer.getBlockMetadataAt(slot) |
| 68 | + | return countList, itemCount |
| 69 | - | if X == dane[i].ID and dane[i].META == nil then |
| 69 | + | |
| 70 | - | ilosc = ilosc + analyzer.getBlockCountAt(slot) |
| 70 | + | -- Function to check if all required items are available |
| 71 | - | elseif X == dane[i].ID and Y == dane[i].META then |
| 71 | + | local function checkAvailability(items, recordCount) |
| 72 | - | --print("znalazlem w slocie "..slot.." blok o ID rownym "..ID.."")
|
| 72 | + | local isAvailable = true |
| 73 | - | ilosc = ilosc + analyzer.getBlockCountAt(slot) |
| 73 | + | local missingItem = nil |
| 74 | ||
| 75 | - | until slot == 109 |
| 75 | + | for i = 1, recordCount do |
| 76 | - | if ilosc < dane[i].COUNT then |
| 76 | + | local slot = 0 |
| 77 | - | sprawdzenie = false |
| 77 | + | local itemId = 0 |
| 78 | - | if dane[i].META == nil then |
| 78 | + | local itemMeta = 0 |
| 79 | - | brak = dane[i].ID |
| 79 | + | local itemCount = 0 |
| 80 | - | else |
| 80 | + | |
| 81 | - | brak = ""..dane[i].ID..":"..dane[i].META.."" |
| 81 | + | repeat |
| 82 | slot = slot + 1 | |
| 83 | - | print("braklo itemu o ID: "..dane[i].ID.." w liczbie: "..dane[i].COUNT - ilosc.."")
|
| 83 | + | itemId = analyzer.getBlockIdAt(slot) |
| 84 | itemMeta = analyzer.getBlockMetadataAt(slot) | |
| 85 | ||
| 86 | - | return sprawdzenie, brak |
| 86 | + | if itemId == items[i].ID and (items[i].META == nil or itemMeta == items[i].META) then |
| 87 | itemCount = itemCount + analyzer.getBlockCountAt(slot) | |
| 88 | - | function craft(recka3) |
| 88 | + | end |
| 89 | - | for i=1,9 do |
| 89 | + | until slot == 109 |
| 90 | - | if recka3[i][1] == nil then |
| 90 | + | |
| 91 | - | else |
| 91 | + | if itemCount < items[i].COUNT then |
| 92 | - | slot = 0 |
| 92 | + | isAvailable = false |
| 93 | - | repeat |
| 93 | + | missingItem = items[i].META == nil and items[i].ID or (items[i].ID .. ":" .. items[i].META) |
| 94 | - | slot = slot +1 |
| 94 | + | print("Missing item ID: " .. missingItem .. " in quantity: " .. items[i].COUNT - itemCount)
|
| 95 | - | X = analyzer.getBlockIdAt(slot) |
| 95 | + | break |
| 96 | - | Y = analyzer.getBlockMetadataAt(slot) |
| 96 | + | end |
| 97 | - | until (X == recka3[i][1] and recka3[i][2] == nil) or (X == recka3[i][1] and Y == recka3[i][2]) |
| 97 | + | end |
| 98 | - | --print("Znalazlem w slocie "..slot.."")
|
| 98 | + | |
| 99 | - | ilosc = analyzer.getBlockCountAt(slot) |
| 99 | + | return isAvailable, missingItem |
| 100 | - | turtle.select(Z[i]) |
| 100 | + | |
| 101 | - | analyzer.takeAt(slot) |
| 101 | + | |
| 102 | - | turtle.drop(ilosc - 1) |
| 102 | + | -- Function to perform the crafting operation |
| 103 | local function craft(items) | |
| 104 | for i = 1, 9 do | |
| 105 | - | turtle.craft() |
| 105 | + | if items[i][1] ~= nil then |
| 106 | - | oddaj() |
| 106 | + | local slot = 0 |
| 107 | repeat | |
| 108 | - | function craftuj(recka) |
| 108 | + | slot = slot + 1 |
| 109 | - | print("craftuje "..b.."")
|
| 109 | + | local itemId = analyzer.getBlockIdAt(slot) |
| 110 | - | a = false |
| 110 | + | local itemMeta = analyzer.getBlockMetadataAt(slot) |
| 111 | - | while not a do |
| 111 | + | until (itemId == items[i][1] and (items[i][2] == nil or itemMeta == items[i][2])) |
| 112 | - | a,b = sprawdz(zlicz(recka)) |
| 112 | + | |
| 113 | - | if a == false then |
| 113 | + | local itemCount = analyzer.getBlockCountAt(slot) |
| 114 | - | print("braklo "..b.."")
|
| 114 | + | turtle.select(craftingSlots[i]) |
| 115 | - | b = tostring(b) |
| 115 | + | analyzer.takeAt(slot) |
| 116 | - | crafting() |
| 116 | + | turtle.drop(itemCount - 1) |
| 117 | - | a = false |
| 117 | + | end |
| 118 | - | else |
| 118 | + | end |
| 119 | - | craft(recka) |
| 119 | + | |
| 120 | turtle.craft() | |
| 121 | dropAllItems() | |
| 122 | end | |
| 123 | - | function crafting() |
| 123 | + | |
| 124 | - | if tCraft[b] then |
| 124 | + | -- Function to manage the crafting process |
| 125 | - | craftuj(tCraft[b]) |
| 125 | + | local function manageCrafting(recipe) |
| 126 | - | else |
| 126 | + | print("Crafting " .. b)
|
| 127 | - | print("Braklo: "..b.."") os.pullEvent()
|
| 127 | + | local isReadyToCraft = false |
| 128 | - | end |
| 128 | + | |
| 129 | while not isReadyToCraft do | |
| 130 | - | function craftujemy() |
| 130 | + | local countList, _ = countItems(recipe) |
| 131 | - | odczyt = io.open ("receptury","r")
|
| 131 | + | isReadyToCraft, missingItem = checkAvailability(countList) |
| 132 | - | while true do -- odczyt recek |
| 132 | + | |
| 133 | - | tekst=odczyt:read() |
| 133 | + | if not isReadyToCraft then |
| 134 | - | if tekst == nil then break end |
| 134 | + | print("Missing " .. missingItem)
|
| 135 | - | item1, x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9] = string.match(tekst, "([%w%:]+)=([%w%:]+);([%w%:]+);([%w%:]+);([%w%:]+);([%w%:]+);([%w%:]+);([%w%:]+);([%w%:]+);([%w%:]+)") |
| 135 | + | missingItem = tostring(missingItem) |
| 136 | - | tCraft[item1]={}
|
| 136 | + | -- Assuming 'crafting' is a function that handles missing items |
| 137 | - | for i=1,9 do |
| 137 | + | crafting() |
| 138 | - | if(x[i] == "0") then |
| 138 | + | else |
| 139 | - | tCraft[item1][i]={nil}
|
| 139 | + | craft(recipe) |
| 140 | - | elseif(string.find(x[i],":")) then |
| 140 | + | end |
| 141 | - | id,meta = string.match(x[i],"(%d+):(%d+)") |
| 141 | + | end |
| 142 | - | tCraft[item1][i]={tonumber(id),tonumber(meta)}
|
| 142 | + | |
| 143 | - | else |
| 143 | + | |
| 144 | - | tCraft[item1][i]={tonumber(x[i])}
|
| 144 | + | -- Function to handle crafting based on user input |
| 145 | local function crafting() | |
| 146 | if tCraft[b] then | |
| 147 | manageCrafting(tCraft[b]) | |
| 148 | - | odczyt:close() |
| 148 | + | else |
| 149 | - | print("Co mam craftowac? Podaj ID lub ID:META")
|
| 149 | + | print("Missing: " .. b)
|
| 150 | - | b = read() |
| 150 | + | os.pullEvent() -- Wait for an event, possibly user input |
| 151 | - | b1 = b |
| 151 | + | end |
| 152 | - | print("ile? ")
|
| 152 | + | |
| 153 | - | c = read() |
| 153 | + | |
| 154 | - | for zz=1,c do |
| 154 | + | -- Function to start the crafting process |
| 155 | - | crafting() |
| 155 | + | local function startCrafting() |
| 156 | - | b = b1 |
| 156 | + | local file = io.open("receptury", "r") -- Open the recipe file
|
| 157 | while true do | |
| 158 | local line = file:read() | |
| 159 | - | function menu() |
| 159 | + | if line == nil then break end |
| 160 | - | term.clear() |
| 160 | + | |
| 161 | - | opcja = 2 |
| 161 | + | -- Parse the recipe line |
| 162 | - | term.setCursorPos(1,1) |
| 162 | + | local item, recipeParts = string.match(line, "([%w%:]+)=(.+)") |
| 163 | - | term.write("Ultimate Crafting Program")
|
| 163 | + | |
| 164 | - | term.setCursorPos(1,2) |
| 164 | + | -- Store the parsed recipe |
| 165 | - | term.write("[ ] Craftuj")
|
| 165 | + | tCraft[item] = {}
|
| 166 | - | term.setCursorPos(1,3) |
| 166 | + | for i = 1, 9 do |
| 167 | - | term.write("[ ] Dodaj recepture przez skanowanie")
|
| 167 | + | local part = select(i, string.match(recipeParts, "([^;]+)")) |
| 168 | - | term.setCursorPos(1,4) |
| 168 | + | if part == "0" then |
| 169 | - | term.write("[ ] Dodaj recepture przez wpisanie")
|
| 169 | + | tCraft[item][i] = {nil}
|
| 170 | elseif string.find(part, ":") then | |
| 171 | - | function odswiez() |
| 171 | + | local id, meta = string.match(part, "(%d+):(%d+)") |
| 172 | - | for i=2,10 do |
| 172 | + | tCraft[item][i] = {tonumber(id), tonumber(meta)}
|
| 173 | - | term.setCursorPos(2,i) |
| 173 | + | else |
| 174 | - | term.write(" ")
|
| 174 | + | tCraft[item][i] = {tonumber(part)}
|
| 175 | end | |
| 176 | - | term.setCursorPos(2,opcja) |
| 176 | + | end |
| 177 | - | term.write("X")
|
| 177 | + | end |
| 178 | file:close() | |
| 179 | - | function zapisz() |
| 179 | + | |
| 180 | - | print("Uloz recepture w inventory turtla")
|
| 180 | + | -- Ask user for the item to craft and the quantity |
| 181 | - | os.pullEvent() |
| 181 | + | print("What to craft? Enter ID or ID:META")
|
| 182 | - | x={}
|
| 182 | + | b = read() |
| 183 | - | for i=1,9 do |
| 183 | + | local originalItem = b |
| 184 | - | turtle.select(Z[i]) -- wybierz slot |
| 184 | + | print("How many?")
|
| 185 | - | x[i] = {} -- stworz tablice
|
| 185 | + | local quantity = tonumber(read()) |
| 186 | - | id=analyzer.getBlockId() -- pobierz id |
| 186 | + | |
| 187 | - | if(id == false) then -- jesli nie ma nic |
| 187 | + | -- Craft the specified quantity of the item |
| 188 | - | x[i].ID = nil -- przypisz nil |
| 188 | + | for zz = 1, quantity do |
| 189 | - | else |
| 189 | + | crafting() |
| 190 | - | x[i].ID = id -- przypisz id |
| 190 | + | b = originalItem |
| 191 | - | x[i].META = analyzer.getBlockMetadata() -- przypisz meta |
| 191 | + | end |
| 192 | end | |
| 193 | ||
| 194 | - | z={}
|
| 194 | + | -- Function to display the main menu |
| 195 | - | for i=1,9 do |
| 195 | + | local function displayMenu() |
| 196 | - | if x[i].ID == nil then -- jezli id = nil |
| 196 | + | term.clear() -- Clear the terminal screen |
| 197 | - | z[i] = 0; -- przypisz 0 |
| 197 | + | local option = 2 -- Initialize the default selected option |
| 198 | - | elseif x[i].META == nil then -- jezeli meta = nil |
| 198 | + | |
| 199 | - | z[i] = x[i].ID -- przypisz samo id |
| 199 | + | -- Set the cursor position and write menu options |
| 200 | - | else -- w przeciwnym wypadku |
| 200 | + | term.setCursorPos(1, 1) |
| 201 | - | z[i] = ""..x[i].ID..":"..x[i].META.."" -- wpisz ID:META |
| 201 | + | term.write("Ultimate Crafting Program")
|
| 202 | term.setCursorPos(1, 2) | |
| 203 | term.write("[ ] Start Crafting") -- "Craftuj" translates to "Start Crafting"
| |
| 204 | - | turtle.craft() |
| 204 | + | term.setCursorPos(1, 3) |
| 205 | - | turtle.select(11) |
| 205 | + | term.write("[ ] Add Recipe by Scanning") -- "Dodaj recepture przez skanowanie"
|
| 206 | - | item = analyzer.getBlockId()..":"..analyzer.getBlockMetadata() |
| 206 | + | term.setCursorPos(1, 4) |
| 207 | - | zapis = io.open ("receptury","a") -- otworz plik
|
| 207 | + | term.write("[ ] Add Recipe Manually") -- "Dodaj recepture przez wpisanie"
|
| 208 | - | zapis:write(string.format("%s=%s;%s;%s;%s;%s;%s;%s;%s;%s\n",item,z[1],z[2],z[3],z[4],z[5],z[6],z[7],z[8],z[9]))
|
| 208 | + | |
| 209 | - | zapis:close() |
| 209 | + | |
| 210 | -- Function to refresh the menu display | |
| 211 | - | function podaj() |
| 211 | + | local function refreshMenu() |
| 212 | - | term.clear() |
| 212 | + | -- Assume 'option' is a global or externally managed variable |
| 213 | - | print("podaj recepture wedlug skladni: ")
|
| 213 | + | for i = 2, 10 do |
| 214 | - | print("ID:META=ID:META;ID:META; ... ;ID:META")
|
| 214 | + | term.setCursorPos(2, i) |
| 215 | - | print("mozna podawac rowniez ID bez podania Metadanych")
|
| 215 | + | term.write(" ")
|
| 216 | - | nowa=read() |
| 216 | + | end |
| 217 | - | zapis = io.open ("receptury","a") -- otworz plik
|
| 217 | + | term.setCursorPos(2, option) -- Update the display to show the selected option |
| 218 | - | zapis:write(nowa.."\n") |
| 218 | + | term.write("X")
|
| 219 | - | zapis:close() |
| 219 | + | |
| 220 | ||
| 221 | - | menu() |
| 221 | + | -- Function to scan and save a new crafting recipe |
| 222 | - | odswiez() |
| 222 | + | local function saveScannedRecipe() |
| 223 | print("Arrange the recipe in the turtle's inventory")
| |
| 224 | - | przycisk,kod = os.pullEvent() |
| 224 | + | os.pullEvent() -- Wait for an event, likely user arrangement of items |
| 225 | - | if przycisk == "key" and kod == 208 and opcja < 4 then |
| 225 | + | local recipe = {}
|
| 226 | - | opcja=opcja+1 |
| 226 | + | |
| 227 | for i = 1, 9 do | |
| 228 | - | if przycisk == "key" and kod == 200 and opcja > 2 then |
| 228 | + | turtle.select(craftingSlots[i]) -- Select slot |
| 229 | - | opcja = opcja - 1 |
| 229 | + | local id = analyzer.getBlockId() -- Get block id |
| 230 | if id then | |
| 231 | - | if przycisk == "key" and kod == 28 then |
| 231 | + | recipe[i] = {ID = id, META = analyzer.getBlockMetadata()} -- Assign id and meta
|
| 232 | - | term.clear() |
| 232 | + | else |
| 233 | - | term.setCursorPos(1,1) |
| 233 | + | recipe[i] = {ID = nil} -- Assign nil if empty
|
| 234 | - | if opcja == 2 then |
| 234 | + | end |
| 235 | - | craftujemy() |
| 235 | + | end |
| 236 | - | elseif opcja == 3 then |
| 236 | + | |
| 237 | - | zapisz() |
| 237 | + | -- Convert the recipe to a string format |
| 238 | - | elseif opcja == 4 then |
| 238 | + | local recipeString = {}
|
| 239 | - | podaj() |
| 239 | + | for i = 1, 9 do |
| 240 | - | end |
| 240 | + | if recipe[i].ID == nil then |
| 241 | - | menu() |
| 241 | + | recipeString[i] = "0" |
| 242 | - | end |
| 242 | + | elseif recipe[i].META == nil then |
| 243 | - | odswiez() |
| 243 | + | recipeString[i] = tostring(recipe[i].ID) |
| 244 | - | end |
| 244 | + | else |
| 245 | recipeString[i] = recipe[i].ID .. ":" .. recipe[i].META | |
| 246 | end | |
| 247 | end | |
| 248 | ||
| 249 | turtle.craft() | |
| 250 | turtle.select(11) | |
| 251 | local craftedItem = analyzer.getBlockId() .. ":" .. analyzer.getBlockMetadata() | |
| 252 | local file = io.open("receptury", "a") -- Open file for appending
| |
| 253 | file:write(string.format("%s=%s;%s;%s;%s;%s;%s;%s;%s;%s\n", craftedItem, unpack(recipeString)))
| |
| 254 | file:close() | |
| 255 | end | |
| 256 | ||
| 257 | -- Function to manually input and save a new recipe | |
| 258 | local function inputAndSaveRecipe() | |
| 259 | term.clear() | |
| 260 | print("Enter the recipe in the format: ")
| |
| 261 | print("ID:META=ID:META;ID:META; ... ;ID:META")
| |
| 262 | print("You can also input IDs without metadata")
| |
| 263 | local newRecipe = read() | |
| 264 | ||
| 265 | local file = io.open("receptury", "a") -- Open file for appending
| |
| 266 | file:write(newRecipe .. "\n") | |
| 267 | file:close() | |
| 268 | end | |
| 269 | ||
| 270 | -- Main loop for menu navigation and action selection | |
| 271 | displayMenu() | |
| 272 | refreshMenu() | |
| 273 | ||
| 274 | while true do | |
| 275 | local event, keyCode = os.pullEvent("key")
| |
| 276 | ||
| 277 | -- Navigate through the menu | |
| 278 | if keyCode == 208 and option < 4 then -- Arrow Down | |
| 279 | option = option + 1 | |
| 280 | elseif keyCode == 200 and option > 2 then -- Arrow Up | |
| 281 | option = option - 1 | |
| 282 | end | |
| 283 | ||
| 284 | -- Select a menu option | |
| 285 | if keyCode == 28 then -- Enter key | |
| 286 | term.clear() | |
| 287 | term.setCursorPos(1, 1) | |
| 288 | if option == 2 then | |
| 289 | startCrafting() | |
| 290 | elseif option == 3 then | |
| 291 | saveScannedRecipe() | |
| 292 | elseif option == 4 then | |
| 293 | inputAndSaveRecipe() | |
| 294 | end | |
| 295 | displayMenu() | |
| 296 | refreshMenu() | |
| 297 | end | |
| 298 | end | |
| 299 |