diff --git a/.github/scripts/gen_recipes.py b/.github/scripts/gen_recipes.py new file mode 100644 index 0000000..5105d10 --- /dev/null +++ b/.github/scripts/gen_recipes.py @@ -0,0 +1,249 @@ +import zipfile +import json +import struct +import os +import io +import urllib.request + +def download_latest_server(): + print("Locating latest Minecraft server jar...") + manifest_url = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json" + + try: + # 1. Fetch version manifest to find the latest version ID + with urllib.request.urlopen(manifest_url) as response: + manifest = json.loads(response.read().decode('utf-8')) + + latest_version = manifest['latest']['release'] + print(f"Latest release version: {latest_version}") + + # 2. Find the URL for the specific version package JSON + version_url = None + for version in manifest['versions']: + if version['id'] == latest_version: + version_url = version['url'] + break + + if not version_url: + print("Error: Could not find version details.") + return False + + # 3. Fetch version details to get the actual download link + with urllib.request.urlopen(version_url) as response: + version_data = json.loads(response.read().decode('utf-8')) + + server_url = version_data['downloads']['server']['url'] + print(f"Downloading server.jar from {server_url}...") + + # 4. Download the file + urllib.request.urlretrieve(server_url, "server.jar") + print("Download complete!") + return True + + except Exception as e: + print(f"Failed to download server.jar: {e}") + return False + +def process_tags(zip_obj, tags_map): + # Scan for item tags + # Path format in jar: data//tags/item/.json + tag_files = [f for f in zip_obj.namelist() if '/tags/item/' in f and f.endswith('.json')] + + # First pass: Load all raw tags + raw_tags = {} + + for file_path in tag_files: + try: + with zip_obj.open(file_path) as file: + data = json.load(file) + + # Derive tag name from path + # data/minecraft/tags/item/logs.json -> minecraft:logs + parts = file_path.split('/') + # parts usually: ['data', 'minecraft', 'tags', 'item', 'logs.json'] + if len(parts) >= 5: + namespace = parts[1] + name = os.path.splitext(parts[-1])[0] + tag_key = f"{namespace}:{name}" # e.g. "minecraft:logs" + # Add # prefix to match how recipe inputs look + full_key = f"#{tag_key}" + + values = [] + raw_values = data.get("values", []) + for v in raw_values: + if isinstance(v, str): + values.append(v) + elif isinstance(v, dict) and "id" in v: + values.append(v["id"]) + + raw_tags[full_key] = values + except Exception: + continue + + # Second pass: Resolve tags within tags (basic flattening) + # We loop a few times to resolve nested tags like #minecraft:logs containing #minecraft:oak_logs + for _ in range(3): + for tag, values in raw_tags.items(): + new_values = [] + for v in values: + if v.startswith('#'): + # It's a reference to another tag, expand it if we know it + if v in raw_tags: + new_values.extend(raw_tags[v]) + else: + new_values.append(v) # Keep it if we can't resolve it + else: + new_values.append(v) + # Remove duplicates + raw_tags[tag] = list(set(new_values)) + + # Copy to the output map + for k, v in raw_tags.items(): + # Remove the # prefix for the key in the aliases table if preferred, + # but keeping it makes lookup easier for exact matches on inputs like "#minecraft:logs" + tags_map[k] = v + + return len(raw_tags) + +def process_recipes(zip_obj, furnace_list, crafting_set, crafting_recipes): + # 1.21 changed folder from 'recipes' to 'recipe' + recipe_files = [f for f in zip_obj.namelist() if f.startswith('data/minecraft/recipe/') and f.endswith('.json')] + count = 0 + for file_path in recipe_files: + try: + with zip_obj.open(file_path) as file: + data = json.load(file) + rtype = data.get("type", "") + + # --- Furnace / Smelting Logic --- + if rtype in ["minecraft:smelting", "minecraft:blasting"]: + ing = data.get("ingredient") + # Handle 1.21 list or single string/dict + if isinstance(ing, list): ing = ing[0] + item_in = ing if isinstance(ing, str) else ing.get("item") or ing.get("tag") + # Ensure tags start with # + if item_in and not item_in.startswith('#') and ':' in item_in and not item_in.startswith('minecraft:'): + # Heuristic: if it's a tag in the json but just a string here, we might miss the # + # But standard JSON reader usually sees "tag": "minecraft:logs" + pass + + if isinstance(ing, dict) and "tag" in ing: + item_in = "#" + ing["tag"] + + # 1.21 result uses 'id' instead of 'item' + res = data.get("result") + item_out = res if isinstance(res, str) else res.get("id") or res.get("item") + + if item_in and item_out: + furnace_list.append((item_in, item_out)) + + # --- Crafting Logic (Grid / Crafting) --- + if "crafting" in rtype: + res = data.get("result", {}) + # 1.21 result uses 'id' instead of 'item' + out = res if isinstance(res, str) else res.get("id") or res.get("item") + if out: + crafting_set.add(out) + + # Process crafting recipes + if rtype in ["minecraft:crafting_shaped", "minecraft:crafting_shapeless"]: + recipe = { + "type": rtype, + "result": { + "item": out, + "count": data.get("result", {}).get("count", 1) + } + } + + if rtype == "minecraft:crafting_shaped": + recipe["pattern"] = data.get("pattern", []) + recipe["key"] = data.get("key", {}) + else: + recipe["ingredients"] = data.get("ingredients", []) + + crafting_recipes.append(recipe) + count += 1 + except Exception: + continue + return count + +def generate_bins(): + # Automatically download the latest server jar + if not download_latest_server(): + print("Aborting generation due to download failure.") + return + + jar_path = "server.jar" + furnace_data = [] + crafting_items = set() + crafting_recipes = [] + tags_map = {} + + if not os.path.exists(jar_path): + print("server.jar not found.") + return + + with zipfile.ZipFile(jar_path, 'r') as outer_zip: + # Check for nested Bundler JAR first (standard for 1.21) + is_bundler = False + for name in outer_zip.namelist(): + if name.startswith("META-INF/versions/") and name.endswith(".jar"): + print(f"Detected Bundler. Processing inner JAR: {name}") + with outer_zip.open(name) as inner_file: + inner_data = io.BytesIO(inner_file.read()) + with zipfile.ZipFile(inner_data) as inner_zip: + process_recipes(inner_zip, furnace_data, crafting_items, crafting_recipes) + process_tags(inner_zip, tags_map) + is_bundler = True + break + + # If not a bundler, try the root + if not is_bundler: + process_recipes(outer_zip, furnace_data, crafting_items, crafting_recipes) + process_tags(outer_zip, tags_map) + + # Create unified JSON structure + recipes = { + "recipes": { + "furnace": [], + "crafting": [] + }, + "itemLookup": {}, + "aliases": tags_map # Add the aliases/tags table here + } + + # Add furnace recipes + for item_in, item_out in furnace_data: + recipes["recipes"]["furnace"].append({ + "type": "minecraft:smelting", + "ingredient": item_in, + "result": item_out, + "experience": 0.7, + "cookingtime": 200 + }) + + # Add crafting recipes + for recipe in crafting_recipes: + recipes["recipes"]["crafting"].append(recipe) + + # Add item lookup + item_index = 1 + for item in sorted(list(crafting_items)): + recipes["itemLookup"][item] = item_index + item_index += 1 + + # Write to JSON file + if not os.path.exists("recipes"): + os.makedirs("recipes") + + with open("recipes/recipes.json", "w") as f: + json.dump(recipes, f, indent=2) + + print(f"Success! Generated JSON:") + print(f" - {len(tags_map)} tags/aliases processed") + print(f" - {len(furnace_data)} furnace recipes") + print(f" - {len(crafting_recipes)} crafting recipes") + print(f" - {len(crafting_items)} items") + +if __name__ == "__main__": + generate_bins() \ No newline at end of file diff --git a/.github/workflows/gen_recipes.yml b/.github/workflows/gen_recipes.yml new file mode 100644 index 0000000..1dda645 --- /dev/null +++ b/.github/workflows/gen_recipes.yml @@ -0,0 +1,34 @@ +name: Generate Recipes + +on: + workflow_dispatch: + +jobs: + generate: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Run Recipe Generator Script + run: python .github/scripts/gen_recipes.py + + - name: Commit and Push changes + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git add recipes/recipes.json + if git diff --staged --quiet; then + echo "No changes to recipes.json detected." + else + git commit -m "Auto-update recipes.json from latest server jar" + git push + fi diff --git a/.gitignore b/.gitignore index 7c553b5..dd52666 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,10 @@ log.txt config.lua basalt.lua stone.json +server.jar # Jekyll junk files .jekyll-metadata .jekyll-cache/ _site/ + diff --git a/README.md b/README.md index b2a2268..2ef239f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # MISC - Modular Inventory Storage and Crafting -TEST -PRs are welcome to this project, I hope the documentation is clear enough, but if you have any questions feel free to ask. +TEST PRs are welcome to this project, we hope the documentation is clear enough, but if you have any questions feel free to ask. This documentation is also available at misc.madefor.cc @@ -28,6 +27,8 @@ The client can be advanced or basic, it supports both mouse and keyboard. On both your server and all your clients simply run `wget run https://raw.githubusercontent.com/Storehaus/CC-MISC/master/installer.lua`. +To install a version from another repository pass the repo as an argument, for example: `wget run https://raw.githubusercontent.com/Storehaus/CC-MISC/master/installer.lua 40476/CC-MISC`. + On your server select the base MISC system option. On your client select the access terminal option. @@ -38,7 +39,7 @@ Reboot both, the server will ask for a modem, simply input the side your wired m The access terminal is simple and fast to navigate. Across the top bar is a list of screens, you may click one to jump to it, or press tab to cycle between. Type to enter characters into the search bar, use `^u` (ctrl+u) to clear the search bar. Use up/down to navigate and push enter to select, or use mouse wheel and click. -While on a screen with a search bar you may press `^c` to change theme. +While on a screen with a search bar you may press `ctrl` + `shift` + `c` to change theme. ![Themes](docs/assets/themes.png) diff --git a/bfile.lua b/bfile.lua deleted file mode 100644 index fd5cedf..0000000 --- a/bfile.lua +++ /dev/null @@ -1,650 +0,0 @@ ---[[ -This is a library to make custom binary data file formats incredibly easy to develop. -To get started, you'll need to create a new struct. - -local bfile = require("bfile") -local myStruct = bfile.newStruct("myStruct") - -Now this alone isn't much help, you've created an empty struct. Time to add some data! - -myStruct:constant("myStruct"):add("uint8", "myValue") - -Here we add two elements to our struct, first a constant. -This constant will write the string literal "myStruct" to the file, -this literal will also be loaded back and asserted to match when loading. - -The second element we added is data. We specifically added an 8 bit unsigned integer. -Look at structReaders and structWriters to see supported primative data types. -The string passed in ("myValue") is the index into the table we want to write/load. -If we want to write this struct to a file now we should do something like the following. - -myStruct:writeFile("myStructFile.bin", {myValue=100}) - -As you can see, the uint8 we are writing is at the index "myValue". -You can use any type here (that can be used to index tables). - -Now this alone is a little usable, but what happens when you wanna store an array of objects? -Well, you can do that too! - -local newStruct = bfile.newStruct("newStruct"):add("myStruct[]", "myStructs") - -Simply by adding [] to the end of the type name you can convert it into an array. -There's some special syntax here, specifically there's 4 usages of this: -* [] - write the length of the table using the defaultArrayLength type -* [*] - the array runs out the length of the file. This HAS to be the last type in a struct if you use it. -* [12] - use a literal integer for the length of the array, this doesn't get written to disk, so you have to know it to read it back. -* [uint8] - use an integer type name to specify what type to use to write the array length. - -If you didn't notice above you can use structs in structs. The struct will be loaded as a table at the key you give. - -One more thing, if you want a map of one type to another type, of any size, there's a syntax for that too. - -newStruct:add("map", "lotsOfStructs") - -There's no additional rules to that other than map. Yes you can have an array of maps. Multidimensional arrays also work. - -If you need to unpack a type table so it's in the parent table, set the key to "^". -]] ----Create a rudamentary emulator of a file handle from a string. ----@return handle -local function stringHandle(str) - local pointer = 0 - - local function limitPointer(modifier) - pointer = math.max(0, math.min(pointer + (modifier or 0), str:len())) - return pointer - end - - local handle = {} - - function handle.read(count) - local start = pointer + 1 - local finish = limitPointer(count or 1) - local retStr = str:sub(start, finish) - if start - 1 == finish then - -- end of string - return - end - if count then - return retStr - else - return retStr:byte() - end - end - - function handle.seek(whence, offset) - whence = whence or "cur" - offset = offset or 0 - if whence == "cur" then - pointer = pointer + offset - elseif whence == "set" then - pointer = offset - elseif whence == "end" then - pointer = str:len() - 1 + offset - else - error("Invalid whence option") - end - limitPointer() - return pointer - end - - function handle.write(value) - if type(value) == "number" then - value = string.char(value) - end - local start = pointer + 1 - pointer = pointer + value:len() - str = str:sub(1, start - 1) .. value .. str:sub(pointer + 1) - end - - function handle.getString() - return str - end - - return handle -end - -local aliases = {} - -local structReaders = { - uint8 = function(f) - return select(1, string.unpack("I1", f.read(1))) - end, - uint16 = function(f) - return select(1, string.unpack(">I2", f.read(2))) - end, - string = function(f) - local length = string.unpack(">I2", f.read(2)) - local str = f.read(length) - return str - end, - char = function(f) - return f.read(1) - end, - uint32 = function(f) - return select(1, string.unpack(">I4", f.read(4))) - end, - number = function(f) - return select(1, string.unpack("n", f.read(8))) - end -} - -local structWriters = { - uint8 = function(f, value) - f.write(string.pack("I1", value)) - end, - uint16 = function(f, value) - f.write(string.pack(">I2", value)) - end, - string = function(f, value) - f.write(string.pack(">I2", value:len())) - f.write(value) - end, - char = function(f, value) - f.write(value) - end, - uint32 = function(f, value) - f.write(string.pack(">I4", value)) - end, - number = function(f, value) - f.write(string.pack("n", value)) - end -} - -local defaultArrayLength = "uint32" - -local getReaderWriter - ----@type table -local structs = {} - -local function arrayReaderGen(arrayDatatype, lengthDatatype, fixedLength) - local dataReader = getReaderWriter(arrayDatatype) - if lengthDatatype == "*" then - -- read until file runs out - return function(f) - local t = {} - while f.read(1) do - f.seek(nil, -1) - t[#t + 1] = dataReader(f) - end - return t - end - end - if lengthDatatype == "" then - lengthDatatype = defaultArrayLength - end - local lengthReader = getReaderWriter(lengthDatatype) - return function(f) - local length - if fixedLength then - length = fixedLength - else - length = lengthReader(f) - end - local t = {} - for i = 1, length do - t[i] = dataReader(f) - end - return t - end -end - -local function arrayWriterGen(arrayDatatype, lengthDatatype, fixedLength) - local lengthWriter - if lengthDatatype == "" then - _, lengthWriter = getReaderWriter("uint32") - elseif lengthDatatype ~= "*" then - _, lengthWriter = getReaderWriter(lengthDatatype) - end - local _, dataWriter = getReaderWriter(arrayDatatype) - return function(f, value) - if lengthDatatype ~= "*" and not fixedLength then - -- this has a defined length, without one we can't read it back unless it's the whole file. - lengthWriter(f, #value) - end - for _, v in ipairs(value) do - dataWriter(f, v) - end - end -end - -local function mapReaderGen(keyType, valueType) - local keyReader = getReaderWriter(keyType) - local valueReader = getReaderWriter(valueType) - return function(f) - local t = {} - while true do - local key = assert(keyReader(f), "Got nil from reader") - local value = valueReader(f) - t[key] = value - local char = f.read(1) - if char == ";" then - return t - end - assert(char == ",", "Invalid map separator") - end - end -end - -local function mapWriterGen(keyType, valueType) - local _, keyWriter = getReaderWriter(keyType) - local _, valueWriter = getReaderWriter(valueType) - return function(f, value) - local start = true - for k, v in pairs(value) do - if not start then - f.write(",") - end - start = false - keyWriter(f, k) - valueWriter(f, v) - end - f.write(";") - end -end - ----Get a reader and writer for any supported datatype ----@param datatype string ----@generic T : any ----@return fun(f: handle): T ----@return fun(f: handle, v: T) -function getReaderWriter(datatype) - local reader, writer - if aliases[datatype] then - datatype = aliases[datatype] - end - local lengthDatatype = datatype:match("%[([%a%d*]-)%]$") - local keyType, valueType = datatype:match("^map<([%S]+),([%S]+)>") - if lengthDatatype then - local arrayDatatype = datatype:sub(1, -lengthDatatype:len() - 3) - local fixedLength - if tonumber(lengthDatatype) then - -- this is a number literal, this array is a fixed size - fixedLength = tonumber(lengthDatatype) - end - reader = arrayReaderGen(arrayDatatype, lengthDatatype, fixedLength) - writer = arrayWriterGen(arrayDatatype, lengthDatatype, fixedLength) - elseif keyType then - reader = mapReaderGen(keyType, valueType) - writer = mapWriterGen(keyType, valueType) - elseif structs[datatype] then - local structDatatype = structs[datatype] - reader = function(f) return structDatatype:readHandle(f) end - writer = function(f, value) structDatatype:writeHandle(f, value) end - else - reader = structReaders[datatype] - writer = structWriters[datatype] - end - assert(reader, "No reader for " .. datatype) - assert(writer, "No writer for " .. datatype) - return reader, writer -end - ----Add a datatype to the struct ----@param self Struct ----@param datatype string ----@param key string|integer ----@return Struct -local function add(self, datatype, key) - local reader, writer = getReaderWriter(datatype) - table.insert(self.structure, { - type = datatype, - reader = reader, - writer = writer, - key = key, - mode = "data" - }) - ---@type Struct - return self -end - ----Add a constant to the struct ----These are written directly to the file in this position. ----When read back they are asserted to be the same as written. ----@param self Struct ----@param value string ----@return Struct -local function constant(self, value) - table.insert(self.structure, { - mode = "constant", - value = value, - }) - return self -end - ----Add a conditional to the struct ----Basically, dynamically choose a datatype based on the read character/written data ----@param self any ----@param key any ----@param loadCondition fun(ch: string): string datatype to load ----@param writeCondition fun(value: table): string, string character indicating condition, datatype to save -local function conditional(self, key, loadCondition, writeCondition) - table.insert(self.structure, { - mode = "conditional", - key = key, - loadCondition = loadCondition, - writeCondition = writeCondition - }) -end - ----Read the struct from the given file handle ----@param self Struct ----@param handle handle ----@return table -local function readHandle(self, handle) - local t = {} - for k, v in ipairs(self.structure) do - if v.mode == "data" then - t[v.key] = v.reader(handle) - elseif v.mode == "constant" then - local readConstant = handle.read(v.value:len()) - assert(readConstant == v.value, ("Constant does not match. Expected %s, got %s."):format(v.value, readConstant)) - elseif v.mode == "conditional" then - local datatype = v.loadCondition(handle.read(1)) - local reader = getReaderWriter(datatype) - t[v.key] = reader(handle) - else - error("Invalid mode " .. v.mode) - end - - if v.key == "^" then - -- unpack this table onto the parent table - for k2, v2 in pairs(t[v.key]) do - t[k2] = v2 - end - t[v.key] = nil - end - end - return t -end - ----Read the struct from a given file ----@param self Struct ----@param filename string ----@return table|nil -local function readFile(self, filename) - local f = fs.open(filename, "rb") - if not f then - return - end - local t = readHandle(self, f) - f.close() - return t -end - ----Read the struct from a given string ----@param self Struct ----@param str string ----@return table -local function readString(self, str) - return readHandle(self, stringHandle(str)) -end - ----Write the struct to a given handle ----@param self Struct ----@param handle handle ----@param t table -local function writeHandle(self, handle, t) - for k, v in ipairs(self.structure) do - local valueToWrite = t[v.key] - if v.key == "^" then - valueToWrite = t - elseif v.key then - assert(valueToWrite ~= nil, "No value at key=" .. v.key) - end - if v.mode == "data" then - v.writer(handle, valueToWrite) - elseif v.mode == "constant" then - handle.write(v.value) - elseif v.mode == "conditional" then - local ch, datatype = v.writeCondition(valueToWrite) - handle.write(ch) - local _, writer = getReaderWriter(datatype) - writer(handle, valueToWrite) - else - error("Invalid mode " .. v.mode) - end - end -end - ----Write the struct to a given file ----@param self Struct ----@param filename string ----@param t table -local function writeFile(self, filename, t) - local f = assert(fs.open(filename, "wb")) - writeHandle(self, f, t) - f.close() -end - ----Write the struct to a string ----@param self Struct ----@param t table ----@return string -local function writeString(self, t) - local handle = stringHandle("") - writeHandle(self, handle, t) - return handle.getString() -end - ----Start creating a struct ----@param name string ----@return Struct -local function newStruct(name) - ---@class Struct - local struct = {} - struct.add = add - struct.constant = constant - struct.readFile = readFile - struct.readHandle = readHandle - struct.readString = readString - struct.writeFile = writeFile - struct.writeHandle = writeHandle - struct.writeString = writeString - struct.conditional = conditional - struct.name = name - struct.structure = {} - structs[name] = struct - return struct -end - ----Get a created struct by name ----@param name string ----@return Struct -local function getStruct(name) - return structs[name] -end - ----Add a primative type ----@param type string ----@generic T : any ----@param reader fun(f: handle): T ----@param writer fun(f: handle, v: T) -local function addType(type, reader, writer) - structReaders[type] = reader - structWriters[type] = writer -end - ----Get a reader for a datatype ----@param datatype string ----@generic T : any ----@return fun(f: handle): T -local function getReader(datatype) - return select(1, getReaderWriter(datatype)) -end - ----Get a writer for a datatype ----@param datatype string ----@generic T : any ----@return fun(f: handle, v: T) -local function getWriter(datatype) - return select(2, getReaderWriter(datatype)) -end - ----Add an alias for a type ----@param alias string ----@param t string -local function addAlias(alias, t) - aliases[alias] = t -end - -local CONTROL = { - START_STRING_KEY = "$", -- Strings are null terminated - START_INT_KEY = "#", -- Null terminated string representation to allow infinite indicies - END = "\25" -} - -local START_DATA = { - string = "s", - number = "n", - booleanTrue = "B", - booleanFalse = "b", - table = "\24", - int = "i", -- This is a number in the range [0,65535] that has been converted to 2 bytes -} - --- An example table serialized with this library would look something like --- {1,hello="test",[3]={"another table!"}} -> 39 bytes - --- START_DATA.table --- START_DATA.int \01 -- 2 byte representation -- --- CONTROL.START_STRING_KEY hello\0 START_DATA.string test\0 --- CONTROL.START_INT_KEY 3\0 START_DATA - -local t0 -local function serialize(T) - local isRoot = false - if not t0 then - isRoot = true - t0 = os.epoch("utc") - elseif os.epoch("utc") - t0 > 3000 then - t0 = os.epoch("utc") - sleep() - end - local serializedT = "" - local keyNum = 0 - for k, v in pairs(T) do - if type(k) == "number" and k ~= keyNum + 1 then -- this is a numeric key, but not an implicit one - serializedT = serializedT .. CONTROL.START_INT_KEY .. tostring(k) .. "\0" - elseif type(k) == "string" then -- this is a string key - serializedT = serializedT .. CONTROL.START_STRING_KEY .. k .. "\0" - end - keyNum = keyNum + 1 - local valueType = type(v) - assert(valueType ~= "function", "Cannot serialize function @ " .. tostring(k)) - if valueType == "number" then - if math.floor(v) == v and v >= 0 and v <= 65535 then - -- number is an int [0,65535] - -- Store in big endian - serializedT = serializedT .. START_DATA.int .. string.char(bit.brshift(v, 8), bit.band(v, 0xFF)) - else - serializedT = serializedT .. START_DATA.number .. tostring(v) .. "\0" - end - elseif valueType == "boolean" then - if valueType then - serializedT = serializedT .. START_DATA.booleanTrue - else - serializedT = serializedT .. START_DATA.booleanFalse - end - elseif valueType == "table" then - serializedT = serializedT .. START_DATA.table .. serialize(v) - else -- the only (accepted) possibility left is that this is a string - serializedT = serializedT .. START_DATA.string .. v .. "\0" - end - end - if isRoot then - t0 = nil - end - return serializedT .. CONTROL.END -end - --- Return a string decoded from an input string --- takes a pointer into a larger string --- returns the decoded string and an end pointer -local function decodeString(s, pointer, limiter, incLevelChar) - limiter = limiter or "\0" - local decodedString = "" - local level = 0 - while (s:sub(pointer, pointer) ~= limiter) or level > 0 do - if s:sub(pointer, pointer) == limiter then - level = level - 1 - elseif s:sub(pointer, pointer) == incLevelChar then - level = level + 1 - end - decodedString = decodedString .. s:sub(pointer, pointer) - pointer = pointer + 1 - end - return decodedString, pointer -end - -local function unserialize(s) - local isRoot = false - if not t0 then - t0 = os.epoch("utc") - isRoot = true - elseif os.epoch("utc") - t0 > 3000 then - t0 = os.epoch("utc") - sleep() - end - local pointer = 1 - local T = {} - local key - while (s:sub(pointer, pointer) ~= CONTROL.END) and pointer < s:len() do - local char = s:sub(pointer, pointer) - if char == CONTROL.START_INT_KEY then - key, pointer = decodeString(s, pointer + 1) - key = tonumber(key) - elseif char == CONTROL.START_STRING_KEY then - key, pointer = decodeString(s, pointer + 1) - else - if char == START_DATA.booleanFalse then - T[key or #T + 1] = false - elseif char == START_DATA.booleanTrue then - T[key or #T + 1] = true - elseif char == START_DATA.string then - local str = "" - str, pointer = decodeString(s, pointer + 1) - T[key or #T + 1] = str - elseif char == START_DATA.number then - local str = "" - str, pointer = decodeString(s, pointer + 1) - T[key or #T + 1] = tonumber(str) - elseif char == START_DATA.table then - local str = "" - local pointer2 = 1 - str, pointer2 = decodeString(s, pointer + 1, CONTROL.END, START_DATA.table) - str = s:sub(pointer + 1, pointer2 - 1) - pointer = pointer2 - T[key or #T + 1] = unserialize(str) - elseif char == START_DATA.int then - local str1 = s:sub(pointer + 1, pointer + 1) - local str2 = s:sub(pointer + 2, pointer + 2) - pointer = pointer + 1 - local int = bit.blshift(string.byte(str1), 8) + string.byte(str2) - T[key or #T + 1] = int - end - key = nil - end - pointer = pointer + 1 - end - if isRoot then - t0 = nil - end - return T -end - -return { - newStruct = newStruct, - getStruct = getStruct, - addType = addType, - getReaderWriter = getReaderWriter, - getReader = getReader, - getWriter = getWriter, - stringHandle = stringHandle, - addAlias = addAlias, - serialize = serialize, - serialise = serialize, - unserialize = unserialize, - unserialise = unserialize, -} diff --git a/clients/farmer.lua b/clients/farmer.lua new file mode 100644 index 0000000..e895ddc --- /dev/null +++ b/clients/farmer.lua @@ -0,0 +1,619 @@ +--[[ + CC:Tweaked Farmer Turtle + Integrates natively with CC-MISC modems/inventories. + Features: Disk persistence, auto-tilling, infinite GPS retry, obstacle avoidance limits, and 100% crash-proof pcall wrapping. +]]-- + +local modemLib = require("modemLib") + +local STATE_FILE = "farmer_state.dat" + +-- Global States +local myNetworkName = nil +local isRefueling = false +local posX, posY = 0, 0 +local facing = 0 -- 0: +x (forward), 1: +y (right), 2: -x (back), 3: -y (left) + +-- Forward declarations +local checkFuel, goRefuelAndReturn, moveForward + +-- Save internal position state to disk +local function saveState() + local data = { + posX = posX, + posY = posY, + facing = facing + } + local file = fs.open(STATE_FILE, "w") + if file then + file.write(textutils.serialize(data)) + file.close() + end +end + +-- Load internal position state from disk +local function loadState() + if fs.exists(STATE_FILE) then + local file = fs.open(STATE_FILE, "r") + if file then + local content = file.readAll() + file.close() + local data = textutils.unserialize(content) + if data then + posX = data.posX or 0 + posY = data.posY or 0 + facing = data.facing or 0 + return true + end + end + end + return false +end + +-- Initialize or load settings interactively +local function initSettings() + settings.load() + local updated = false + + if settings.get("farmer.length") == nil then + settings.define("farmer.length", { description = "How many blocks long each row is", type = "number" }) + print("Enter farm length (default: 10):") + local s = read() + if s == "" then s = "10" end + settings.set("farmer.length", tonumber(s) or 10) + updated = true + end + + if settings.get("farmer.width") == nil then + settings.define("farmer.width", { description = "How many rows total", type = "number" }) + print("Enter farm width (default: 5):") + local s = read() + if s == "" then s = "5" end + settings.set("farmer.width", tonumber(s) or 5) + updated = true + end + + if settings.get("farmer.start_right") == nil then + settings.define("farmer.start_right", { description = "Start by turning right? (true/false)", type = "boolean" }) + print("Start by turning right? (true/false, default: true):") + local s = read() + if s == "" or s:lower() == "true" then + settings.set("farmer.start_right", true) + else + settings.set("farmer.start_right", false) + end + updated = true + end + + if settings.get("farmer.sleep_timer") == nil then + settings.define("farmer.sleep_timer", { description = "Time to wait between harvests in seconds", type = "number" }) + print("Enter sleep timer in seconds (default: 600):") + local s = read() + if s == "" then s = "600" end + settings.set("farmer.sleep_timer", tonumber(s) or 600) + updated = true + end + + if settings.get("farmer.min_fuel") == nil then + settings.define("farmer.min_fuel", { description = "Extra buffer fuel to maintain", type = "number" }) + print("Enter minimum fuel buffer (default: 100):") + local s = read() + if s == "" then s = "100" end + settings.set("farmer.min_fuel", tonumber(s) or 100) + updated = true + end + + if settings.get("farmer.fuel_item") == nil then + settings.define("farmer.fuel_item", { description = "Item to request from CC-MISC for fuel", type = "string" }) + print("Enter fuel item ID (default: minecraft:coal):") + local s = read() + if s == "" then s = "minecraft:coal" end + settings.set("farmer.fuel_item", s) + updated = true + end + + if updated then + settings.save() + print("Settings saved successfully!") + os.sleep(2) + end +end + +-- GPS setup that retries forever if GPS is not found +local function setupGPS() + if settings.get("farmer.home_x") == nil then + print("\n--- First Time GPS Setup ---") + print("Please ensure the turtle is resting on its docking modem, facing the first crop.") + print("Press Enter to begin auto-detection...") + read() + + local x, y, z + print("Waiting for GPS signal...") + while not x do + x, y, z = gps.locate(5) + if not x then + print("GPS not found. Retrying in 5 seconds...") + os.sleep(5) + end + end + + settings.set("farmer.home_x", x) + settings.set("farmer.home_y", y) + settings.set("farmer.home_z", z) + print("Home docked at: "..math.floor(x)..", "..math.floor(y)..", "..math.floor(z)) + + print("Detecting forward direction...") + while true do + if turtle.up() then + if turtle.forward() then + local nx, ny, nz + while not nx do + nx, ny, nz = gps.locate(5) + if not nx then os.sleep(2) end + end + settings.set("farmer.home_dir_x", math.floor((nx - x) + 0.5)) + settings.set("farmer.home_dir_z", math.floor((nz - z) + 0.5)) + turtle.back() + turtle.down() + print("Forward direction registered!") + settings.save() + break + else + turtle.down() + print("Blocked forward! Please clear the block in front (1 block up). Retrying in 3s...") + os.sleep(3) + end + else + print("Blocked above! Please clear the block above turtle. Retrying in 3s...") + os.sleep(3) + end + end + end +end + +-- Movement wrappers with tracking and persistence +local function turnRight() + turtle.turnRight() + facing = (facing + 1) % 4 + saveState() +end + +local function turnLeft() + turtle.turnLeft() + facing = (facing - 1) % 4 + if facing < 0 then facing = facing + 4 end + saveState() +end + +local function turnToFacing(targetFacing) + local diff = (targetFacing - facing) % 4 + if diff < 0 then diff = diff + 4 end + + if diff == 1 then turnRight() + elseif diff == 2 then turnRight(); turnRight() + elseif diff == 3 then turnLeft() + end +end + +-- Move forward with obstacle avoidance limit and alternate routing +moveForward = function() + -- Mid-cycle fuel check + if not isRefueling and turtle.getFuelLevel() ~= "unlimited" then + local distToHome = math.abs(posX) + math.abs(posY) + if turtle.getFuelLevel() <= (distToHome + 5) then + isRefueling = true + goRefuelAndReturn() + isRefueling = false + end + end + + local max_detour_attempts = 5 + local attempts = 0 + + while not turtle.forward() do + if turtle.getFuelLevel() == 0 then + print("Out of fuel! Waiting...") + os.sleep(5) + else + local has_block, _ = turtle.inspect() + if has_block then + attempts = attempts + 1 + if attempts > max_detour_attempts then + print("Exceeded max detour attempts ("..max_detour_attempts.."). Trying alternate route maneuver...") + turnRight() + turnRight() + turtle.forward() + turnRight() + attempts = 0 + else + print("Obstacle encountered. Detour attempt " .. attempts .. "/" .. max_detour_attempts) + turnRight() + if turtle.forward() then + turnLeft() + if turtle.forward() then + turnLeft() + turtle.forward() + turnRight() + else + turnRight() + turtle.back() + end + else + turnLeft() + end + end + os.sleep(1) + else + -- Entity in the way (e.g. mob/animal) + turtle.attack() + os.sleep(0.5) + end + end + end + + if facing == 0 then posX = posX + 1 + elseif facing == 1 then posY = posY + 1 + elseif facing == 2 then posX = posX - 1 + elseif facing == 3 then posY = posY - 1 + end + saveState() +end + +-- Reusable grid navigation +local function navigateTo(targetX, targetY) + if posX < targetX then + turnToFacing(0) + while posX < targetX do moveForward() end + elseif posX > targetX then + turnToFacing(2) + while posX > targetX do moveForward() end + end + + if posY < targetY then + turnToFacing(1) + while posY < targetY do moveForward() end + elseif posY > targetY then + turnToFacing(3) + while posY > targetY do moveForward() end + end +end + +local function returnHome() + navigateTo(0, 0) + turnToFacing(0) + saveState() +end + +goRefuelAndReturn = function() + print("\n[!] Fuel critically low! Pausing to refuel...") + local savedX, savedY, savedFacing = posX, posY, facing + + returnHome() + turtle.down() + os.sleep(2) + + if peripheral.getType("bottom") == "modem" then + modemLib.connect("bottom") + myNetworkName = peripheral.call("bottom", "getNameLocal") or myNetworkName + end + + checkFuel() + + print("[!] Resuming cycle...") + turtle.up() + navigateTo(savedX, savedY) + turnToFacing(savedFacing) +end + +-- Position recovery with infinite GPS retry +local function recoverPosition() + local hx = settings.get("farmer.home_x") + local hy = settings.get("farmer.home_y") + local hz = settings.get("farmer.home_z") + local hfx = settings.get("farmer.home_dir_x") + local hfz = settings.get("farmer.home_dir_z") + + if not (hx and hy and hz and hfx and hfz) then + print("Home coordinates not set. Cannot auto-recover.") + return false + end + + print("Attempting GPS recovery (will retry infinitely until GPS found)...") + local cx, cy, cz + while not cx do + cx, cy, cz = gps.locate(5) + if not cx then + print("GPS signal not found. Retrying in 5 seconds...") + os.sleep(5) + end + end + + if cx == hx and cy == hy and cz == hz then + print("Turtle is at home dock.") + posX, posY, facing = 0, 0, 0 + saveState() + return true + end + + print("Calculating orientation...") + local cfx, cfz + local moved = false + for i = 1, 4 do + if turtle.forward() then + local nx, ny, nz + while not nx do + nx, ny, nz = gps.locate(5) + if not nx then os.sleep(2) end + end + cfx = math.floor((nx - cx) + 0.5) + cfz = math.floor((nz - cz) + 0.5) + turtle.back() + + for j = 1, i - 1 do turtle.turnLeft() end + for j = 1, i - 1 do + local tmp = cfx + cfx = cfz + cfz = -tmp + end + moved = true + break + else + turtle.turnRight() + end + end + + if not moved then + print("Turtle is stuck and cannot move to determine facing!") + return false + end + + local hrx, hrz = -hfz, hfx + posX = math.floor((cx - hx) * hfx + (cz - hz) * hfz + 0.5) + posY = math.floor((cx - hx) * hrx + (cz - hz) * hrz + 0.5) + + if cfx == hfx and cfz == hfz then facing = 0 + elseif cfx == hrx and cfz == hrz then facing = 1 + elseif cfx == -hfx and cfz == -hfz then facing = 2 + elseif cfx == -hrx and cfz == -hrz then facing = 3 + else + facing = 0 + end + + saveState() + print("State recovered: X="..posX..", Y="..posY..", Facing="..facing) + + local targetY = hy + 1 + while cy < targetY do + if not turtle.up() then turtle.digUp(); turtle.up() end + cy = cy + 1 + end + while cy > targetY do + if not turtle.down() then turtle.digDown(); turtle.down() end + cy = cy - 1 + end + + isRefueling = true + returnHome() + turtle.down() + isRefueling = false + return true +end + +-- Refueling function updated to block departure until fuel requirement is met +checkFuel = function() + if turtle.getFuelLevel() == "unlimited" then return end + + local farm_len = settings.get("farmer.length") + local farm_wid = settings.get("farmer.width") + local min_fuel = settings.get("farmer.min_fuel") + local fuel_item_name = settings.get("farmer.fuel_item") + + local required_fuel = (farm_len * farm_wid) + farm_len + farm_wid + min_fuel + + while turtle.getFuelLevel() < required_fuel do + print("Low fuel (" .. turtle.getFuelLevel() .. "/" .. required_fuel .. "). Requesting " .. fuel_item_name .. "...") + modemLib.pushItems(false, myNetworkName, fuel_item_name, 64) + os.sleep(0.5) + + for i = 1, 16 do + local item = turtle.getItemDetail(i) + if item and item.name == fuel_item_name then + turtle.select(i) + turtle.refuel() + end + end + + for i = 1, 16 do + local item = turtle.getItemDetail(i) + if item and item.name == fuel_item_name then + modemLib.pullItems(false, myNetworkName, i, item.count) + os.sleep(0.2) + end + end + + -- If fuel is still below the threshold, pause before checking again + if turtle.getFuelLevel() < required_fuel then + print("Fuel threshold not met. Waiting 10s for fuel supply...") + os.sleep(10) + end + end + turtle.select(1) +end + +local function dumpInventory() + local valid_seeds = { + ["minecraft:wheat_seeds"] = true, + ["minecraft:carrot"] = true, + ["minecraft:potato"] = true, + ["minecraft:beetroot_seeds"] = true + } + local kept_slots = {} + + print("Checking inventory for items to dump...") + for i = 1, 16 do + local item = turtle.getItemDetail(i) + if item then + if valid_seeds[item.name] and not kept_slots[item.name] then + kept_slots[item.name] = true + else + modemLib.pullItems(false, myNetworkName, i, item.count) + os.sleep(0.2) + end + end + end + turtle.select(1) +end + +-- Auto-till dirt and harvest/plant crops +local function harvestAndPlant() + local has_block, data = turtle.inspectDown() + + -- Auto-till if block below is standard dirt + if has_block and data.name == "minecraft:dirt" then + print("Found un-tilled dirt. Equipping hoe and tilling...") + for i = 1, 16 do + local item = turtle.getItemDetail(i) + if item and item.name:find("hoe") then + turtle.select(i) + turtle.equipLeft() + break + end + end + turtle.placeDown() + has_block, data = turtle.inspectDown() + end + + if has_block then + local is_mature = false + if data.state and data.state.age then + local age = data.state.age + if (data.name:find("wheat") or data.name:find("carrots") or data.name:find("potatoes")) and age == 7 then + is_mature = true + elseif data.name:find("beetroots") and age == 3 then + is_mature = true + end + end + + if is_mature then + turtle.digDown() + end + end + + has_block, _ = turtle.inspectDown() + if not has_block then + for i = 1, 16 do + local item = turtle.getItemDetail(i) + if item and (item.name:find("seeds") or item.name:find("carrot") or item.name:find("potato")) then + turtle.select(i) + turtle.placeDown() + break + end + end + end +end + +-- Farm cycle visiting every spot including the back-most edge +local function doFarmCycle() + local turnRightNext = settings.get("farmer.start_right") + local farm_width = settings.get("farmer.width") + local farm_length = settings.get("farmer.length") + + for row = 1, farm_width do + for col = 1, farm_length do + harvestAndPlant() + if col < farm_length then + moveForward() + end + end + + if row < farm_width then + if turnRightNext then + turnRight() + moveForward() + turnRight() + else + turnLeft() + moveForward() + turnLeft() + end + turnRightNext = not turnRightNext + end + end +end + +-- Main function +local function main() + print("Initializing Farmer Turtle...") + + initSettings() + + if loadState() then + print("Loaded previous position from disk: X="..posX..", Y="..posY) + end + + if peripheral.getType("bottom") ~= "modem" then + print("Turtle not docked! Attempting GPS recovery...") + if not recoverPosition() then + error("Recovery failed!") + end + os.sleep(2) + else + posX, posY, facing = 0, 0, 0 + saveState() + end + + if peripheral.getType("bottom") == "modem" then + modemLib.connect("bottom") + else + error("No wired modem found on bottom!") + end + + myNetworkName = peripheral.call("bottom", "getNameLocal") + if not myNetworkName then + error("Could not get local network name from modem.") + end + print("Connected to network: " .. myNetworkName) + + checkFuel() + setupGPS() + + while true do + print("Checking fuel and organizing inventory...") + checkFuel() + dumpInventory() + + print("Starting farm cycle...") + turtle.up() + moveForward() + + doFarmCycle() + + print("Returning home...") + returnHome() + turtle.down() + + os.sleep(2) + + if peripheral.getType("bottom") == "modem" then + modemLib.connect("bottom") + myNetworkName = peripheral.call("bottom", "getNameLocal") or myNetworkName + end + + print("Emptying harvest into storage...") + dumpInventory() + + local sleep_timer = settings.get("farmer.sleep_timer") + print("Cycle complete. Sleeping for " .. (sleep_timer / 60) .. " minutes.") + os.sleep(sleep_timer) + end +end + +-- Bulletproof pcall wrapper that never exits the program on errors +while true do + local ok, err = pcall(main) + if not ok then + print("\n[ERROR CAUGHT]: " .. tostring(err)) + print("The program encountered an error. Restarting in 10 seconds...") + os.sleep(10) + end +end diff --git a/clients/secure_terminal.lua b/clients/secure_terminal.lua new file mode 100644 index 0000000..83a0d49 --- /dev/null +++ b/clients/secure_terminal.lua @@ -0,0 +1,210 @@ +local lib = require("modemLib") + +-- 1. Initialize +local parentTerm = term.current() +local w, h = parentTerm.getSize() +parentTerm.clear() +parentTerm.setCursorPos(1, 1) +print("Starting strict secure terminal wrapper...") + +local modem = peripheral.find("modem") +if not modem then + error("Security Fault: Modem missing!", 0) +end + +lib.connect(peripheral.getName(modem)) + +local config = nil + +while not config do + parentTerm.clear() + parentTerm.setCursorPos(1, 1) + print("Fetching secure login settings from server...") + + local serverConfig = lib.getConfig() + + -- Verify we got a real table back from the server with actual data + if serverConfig and type(serverConfig) == "table" then + -- Case 1: The server returned the full raw config dump with .value fields + if serverConfig.passwordProtection and serverConfig.passwordProtection.timeout then + config = { + enabled = serverConfig.passwordProtection.enabled.value, + timeout = serverConfig.passwordProtection.timeout.value, + password = serverConfig.passwordProtection.password.value + } + print("Server settings verified and loaded.") + -- Case 2: The server returned the simplified config table + elseif type(serverConfig.timeout) == "number" then + config = { + enabled = serverConfig.enabled, + timeout = serverConfig.timeout, + password = serverConfig.password + } + print("Server settings verified and loaded.") + else + print("Security Lockdown: Invalid config format received.") + print("Retrying in 3 seconds...") + os.sleep(3) + end + else + print("Security Lockdown: Server unreachable or spoofed data received.") + print("Retrying in 3 seconds...") + os.sleep(3) + end +end + +os.sleep(1) + +-- 3. State Variables +local isLocked = false +local enteredPass = "" +local wrongPass = false + +-- Create a dedicated virtual window for the application +local appWin = window.create(parentTerm, 1, 1, w, h, true) + +-- 4. Lock Screen Renderer +local function drawLockScreen() + parentTerm.setBackgroundColor(colors.black) + parentTerm.clear() + + local boxW, boxH = 26, 9 + local x = math.floor((w - boxW) / 2) + 1 + local y = math.floor((h - boxH) / 2) + 1 + + -- Draw popup window body + for i = 0, boxH - 1 do + parentTerm.setCursorPos(x, y + i) + parentTerm.setBackgroundColor(colors.gray) + parentTerm.write(string.rep(" ", boxW)) + end + + -- Draw text + parentTerm.setCursorPos(x + 4, y + 1) + parentTerm.setTextColor(colors.white) + parentTerm.write(" TERMINAL LOCKED ") + + parentTerm.setCursorPos(x + 2, y + 3) + parentTerm.write("Password:") + + -- Draw password field + parentTerm.setCursorPos(x + 2, y + 4) + parentTerm.setBackgroundColor(colors.black) + local passStr = string.rep("*", #enteredPass) + parentTerm.write(passStr .. string.rep(" ", 22 - #enteredPass)) + + -- Draw error message if needed + if wrongPass then + parentTerm.setCursorPos(x + 2, y + 6) + parentTerm.setBackgroundColor(colors.gray) + parentTerm.setTextColor(colors.red) + parentTerm.write("Incorrect Password!") + end + + parentTerm.setCursorPos(x + 2 + #enteredPass, y + 4) + parentTerm.setCursorBlink(true) +end + +-- 5. Application Coroutine Manager +local timeoutTimer = os.startTimer(config.timeout) + +-- Start the terminal in an isolated coroutine +local co = coroutine.create(function() + shell.run("terminal.lua") +end) + +-- These events will be blocked from reaching the app while the terminal is locked +local blockedEvents = { + key = true, key_up = true, char = true, + mouse_click = true, mouse_up = true, mouse_drag = true, mouse_scroll = true, + terminate = true +} + +term.redirect(appWin) +local ok, filter = coroutine.resume(co) +if not ok then + term.redirect(parentTerm) + error(filter) +end + +-- Main Event Loop +while coroutine.status(co) ~= "dead" do + local ev = { os.pullEventRaw() } + local evType = ev[1] + + -- Update activity timer on physical inputs + if blockedEvents[evType] and evType ~= "terminate" then + if config.enabled and not isLocked then + os.cancelTimer(timeoutTimer) + timeoutTimer = os.startTimer(config.timeout) + end + elseif evType == "timer" and ev[2] == timeoutTimer then + if config.enabled then + isLocked = true + appWin.setVisible(false) -- Hide the application window cleanly + drawLockScreen() + end + end + + if isLocked then + -- Handle lock screen inputs exclusively + if evType == "char" then + if #enteredPass < 22 then + enteredPass = enteredPass .. ev[2] + wrongPass = false + end + drawLockScreen() + elseif evType == "key" then + if ev[2] == keys.backspace and #enteredPass > 0 then + enteredPass = enteredPass:sub(1, -2) + wrongPass = false + drawLockScreen() + elseif ev[2] == keys.enter then + if enteredPass == config.password then + isLocked = false + enteredPass = "" + wrongPass = false + + parentTerm.setCursorBlink(false) + appWin.setVisible(true) + appWin.redraw() + appWin.restoreCursor() + + os.cancelTimer(timeoutTimer) + timeoutTimer = os.startTimer(config.timeout) + else + wrongPass = true + enteredPass = "" + drawLockScreen() + end + end + end + + -- Forward only NON-UI events (modems, redstone, background timers) to the app + if not blockedEvents[evType] then + if filter == nil or filter == evType or evType == "terminate" then + term.redirect(appWin) + ok, filter = coroutine.resume(co, table.unpack(ev)) + if not ok then + term.redirect(parentTerm) + error(filter) + end + end + end + else + -- Terminal is unlocked, forward ALL events normally + if filter == nil or filter == evType or evType == "terminate" then + term.redirect(appWin) + ok, filter = coroutine.resume(co, table.unpack(ev)) + if not ok then + term.redirect(parentTerm) + error(filter) + end + end + end +end + +-- 6. Cleanup when closed +term.redirect(parentTerm) +parentTerm.clear() +parentTerm.setCursorPos(1, 1) \ No newline at end of file diff --git a/clients/usageMonitor.lua b/clients/usageMonitor.lua index 7e8d95a..f9c45c1 100644 --- a/clients/usageMonitor.lua +++ b/clients/usageMonitor.lua @@ -16,16 +16,24 @@ if wirelessMode and not settings.get("misc.websocketURL") then settings.save() end - if not settings.get("misc.style") then - settings.define("misc.style", { description = "Display style: horizontal, vertical, big, text, pie", type = "string" }) - print("Choose display style (horizontal, vertical, big, text, pie):") + settings.define("misc.style", { description = "Display style: horizontal, vertical, big, text, pie, line, list, compact, gauge", type = "string" }) + print("Choose display style (horizontal, vertical, big, text, pie, line, list, compact, gauge):") local s = read() if s == "" then s = "horizontal" end settings.set("misc.style", s) settings.save() end +if not settings.get("misc.lineInterval") and settings.get("misc.style") == "line" then + settings.define("misc.lineInterval", { description = "Interval in seconds for line graph updates", type = "number" }) + print("Enter line graph update interval in seconds (default 30):") + local s = read() + local n = tonumber(s) + if not n then n = 30 end + settings.set("misc.lineInterval", n) + settings.save() +end if not settings.get("misc.scale") then settings.define("misc.scale", { description = "Text scale (0.5 to 5)", type = "number" }) @@ -47,7 +55,6 @@ if not settings.get("misc.percentageCutoff") and settings.get("misc.style") == " settings.save() end - if not settings.get("misc.theme") then settings.define("misc.theme", { description = "Display theme: light, dark", type = "string" }) print("Choose display theme (light, dark):") @@ -81,7 +88,6 @@ local currentTheme = settings.get("misc.theme") or "light" local function setThemeColors() if currentTheme == "dark" then - -- Dark theme: pure black background, light text return { labelFG = colors.white, labelBG = colors.black, @@ -89,10 +95,11 @@ local function setThemeColors() freeBG = colors.gray, alertColor = colors.orange, pieColors = {colors.blue, colors.green, colors.orange, colors.purple, colors.cyan, colors.yellow, colors.lime, colors.pink}, - otherColor = colors.lightGray + otherColor = colors.lightGray, + lineTotalColor = colors.cyan, + lineProcColor = colors.orange } else - -- Light theme: pure white background, dark text return { labelFG = colors.black, labelBG = colors.white, @@ -100,7 +107,9 @@ local function setThemeColors() freeBG = colors.gray, alertColor = colors.orange, pieColors = {colors.blue, colors.green, colors.orange, colors.purple, colors.cyan, colors.yellow, colors.lime, colors.pink}, - otherColor = colors.lightGray + otherColor = colors.lightGray, + lineTotalColor = colors.blue, + lineProcColor = colors.red } end end @@ -113,86 +122,22 @@ local freeBG = colorsConfig.freeBG local alertColor = colorsConfig.alertColor local pieColors = colorsConfig.pieColors local otherColor = colorsConfig.otherColor +local lineTotalColor = colorsConfig.lineTotalColor +local lineProcColor = colorsConfig.lineProcColor -- Custom Font Definition local bigFont = { - ["0"] = { - " ___ ", - " / _ \\ ", - "| | | |", - "| |_| |", - " \\___/ " - }, - ["1"] = { - " _ ", - " / | ", - " | | ", - " | | ", - " |_| " - }, - ["2"] = { - " ____ ", - " |___ \\ ", - " __) | ", - " / __/ ", - "|_____| " - }, - ["3"] = { - " _____ ", - "|___ / ", - " |_ \\ ", - " ___) |", - "|____/ " - }, - ["4"] = { - " _ _ ", - "| || | ", - "| || |_ ", - "|__ _| ", - " |_| " - }, - ["5"] = { - " ____ ", - "| ___| ", - "|___ \\ ", - " ___) |", - "|____/ " - }, - ["6"] = { - " __ ", - " / /_ ", - "| '_ \\ ", - "| (_) |", - " \\___/ " - }, - ["7"] = { - " _____ ", - "|___ |", - " / / ", - " / / ", - "/_/ " - }, - ["8"] = { - " ___ ", - " ( _ ) ", - " / _ \\ ", - "| (_) |", - " \\___/ " - }, - ["9"] = { - " ___ ", - " / _ \\ ", - "| (_) |", - " \\__, |", - " /_/ " - }, - ["%"] = { - " _ __", - "(_)/ /", - " / / ", - " / /_ ", - "/_/(_)" - } + ["0"] = {" ___ ", " / _ \\ ", "| | | |", "| |_| |", " \\___/ "}, + ["1"] = {" _ ", " / | ", " | | ", " | | ", " |_| "}, + ["2"] = {" ____ ", " |___ \\ ", " __) | ", " / __/ ", "|_____| "}, + ["3"] = {" _____ ", "|___ / ", " |_ \\ ", " ___) |", "|____/ "}, + ["4"] = {" _ _ ", "| || | ", "| || |_ ", "|__ _| ", " |_| "}, + ["5"] = {" ____ ", "| ___| ", "|___ \\ ", " ___) |", "|____/ "}, + ["6"] = {" __ ", " / /_ ", "| '_ \\ ", "| (_) |", " \\___/ "}, + ["7"] = {" _____ ", "|___ |", " / / ", " / / ", "/_/ "}, + ["8"] = {" ___ ", " ( _ ) ", " / _ \\ ", "| (_) |", " \\___/ "}, + ["9"] = {" ___ ", " / _ \\ ", "| (_) |", " \\__, |", " /_/ "}, + ["%"] = {" _ __", "(_)/ /", " / / ", " / /_ ", "/_/(_)"} } -- Drawing Helpers @@ -223,7 +168,6 @@ end -- Renders the custom ASCII font local function drawBigNumbers(text, startY, fg, bg) setColors(fg, bg) - -- Calculate total width first to center local totalWidth = 0 local charGrids = {} @@ -234,9 +178,7 @@ local function drawBigNumbers(text, startY, fg, bg) totalWidth = totalWidth + #grid[1] end - -- Add spacing totalWidth = totalWidth + (#charGrids - 1) - local w, _ = monitor.getSize() local startX = math.floor((w - totalWidth) / 2) + 1 @@ -250,21 +192,87 @@ local function drawBigNumbers(text, startY, fg, bg) end end +-- History Tracking State & Persistence +local historyTotal = {} +local historyProcessed = {} +local lastTotal = nil +local historyFilePath = ".line_history.txt" + +local function loadHistory() + if fs.exists(historyFilePath) then + local file = fs.open(historyFilePath, "r") + if file then + local data = textutils.unserialize(file.readAll()) + file.close() + if type(data) == "table" then + historyTotal = data.total or {} + historyProcessed = data.processed or {} + lastTotal = data.lastTotal + end + end + end +end + +local function saveHistory() + local file = fs.open(historyFilePath, "w") + if file then + file.write(textutils.serialize({ + total = historyTotal, + processed = historyProcessed, + lastTotal = lastTotal + })) + file.close() + end +end + +local function trackHistory() + loadHistory() + while true do + local interval = settings.get("misc.lineInterval") or 30 + local ok, usage = pcall(lib.getUsage) + + if ok and usage then + local currentTotal = usage.used or 0 + if not lastTotal then lastTotal = currentTotal end + + -- Calculate absolute change as items processed (in or out) + local processed = math.abs(currentTotal - lastTotal) + + table.insert(historyTotal, currentTotal) + table.insert(historyProcessed, processed) + + -- Dynamically constrain history to monitor width + local w, _ = monitor.getSize() + local maxPoints = w + if maxPoints < 1 then maxPoints = 50 end + + while #historyTotal > maxPoints do table.remove(historyTotal, 1) end + while #historyProcessed > maxPoints do table.remove(historyProcessed, 1) end + + lastTotal = currentTotal + saveHistory() + + -- Force update if we are on the line graph view + if settings.get("misc.style") == "line" then + os.queueEvent("update") + end + end + sleep(interval) + end +end + -- Style Definitions local styles = {} --- 1. Original Horizontal Bar styles.horizontal = function(usage, w, h) local barH = h - 2 if barH < 1 then barH = 1 end - -- Header setColors(labelFG, labelBG) monitor.clear() local slots = string.format("Total %u", usage.total) centerText(1, slots) - -- Footer Stats local used = string.format("Used %u", usage.used) monitor.setCursorPos(1, h) monitor.write(used) @@ -273,7 +281,6 @@ styles.horizontal = function(usage, w, h) monitor.setCursorPos(w - #free + 1, h) monitor.write(free) - -- The Bar local pct = getPercentage(usage) local usedWidth = math.floor(pct * w) @@ -283,7 +290,6 @@ styles.horizontal = function(usage, w, h) fillRect(usedWidth + 1, 2, w - usedWidth, barH) end --- 2. Vertical Bar (Cloned style, vertical graph) styles.vertical = function(usage, w, h) local barH = h - 2 if barH < 1 then barH = 1 end @@ -291,21 +297,18 @@ styles.vertical = function(usage, w, h) setColors(labelFG, labelBG) monitor.clear() - -- Header local slots = string.format("Total %u", usage.total) centerText(1, slots) - -- Footer Stats local used = string.format("Used %u", usage.used) local free = string.format("Free %u", usage.free) - -- If narrow, stack used/free, otherwise put on same line if (w < #used + #free + 2) then monitor.setCursorPos(1, h-1) monitor.write(used) monitor.setCursorPos(1, h) monitor.write(free) - barH = barH - 1 -- Reduce bar height for extra text line + barH = barH - 1 else monitor.setCursorPos(1, h) monitor.write(used) @@ -313,21 +316,17 @@ styles.vertical = function(usage, w, h) monitor.write(free) end - -- The Vertical Bar local pct = getPercentage(usage) local usedHeight = math.floor(pct * barH) local freeHeight = barH - usedHeight - -- Draw Free (Top part of bar) setColors(labelFG, freeBG) fillRect(1, 2, w, freeHeight) - -- Draw Used (Bottom part of bar) setColors(labelFG, usedBG) fillRect(1, 2 + freeHeight, w, usedHeight) end --- 3. Big Text (Custom Font) styles.big = function(usage, w, h) local pct = getPercentage(usage) @@ -335,18 +334,15 @@ styles.big = function(usage, w, h) if pct > 0.75 then bg = usedBG elseif pct > 0.5 then bg = alertColor end - -- Use theme-aware text color local textColor = currentTheme == "dark" and colors.white or colors.black setColors(textColor, bg) monitor.clear() local text = string.format("%d%%", math.floor(pct * 100)) - -- Center vertically (font is 5 high) local fontY = math.floor((h - 5) / 2) + 1 drawBigNumbers(text, fontY, textColor, bg) - -- Subtext monitor.setTextScale(0.5) local w2, h2 = monitor.getSize() setColors(textColor, bg) @@ -354,7 +350,6 @@ styles.big = function(usage, w, h) monitor.setTextScale(textScale) end --- 4. Text List (Detailed info) styles.text = function(usage, w, h) setColors(labelFG, labelBG) monitor.clear() @@ -380,12 +375,10 @@ styles.text = function(usage, w, h) end end --- 5. Pie Chart (Top Items) styles.pie = function(usage, w, h) setColors(labelFG, labelBG) monitor.clear() - -- Draw Header and Footer Stats local slots = string.format("Total %u", usage.total) centerText(1, slots) @@ -402,7 +395,6 @@ styles.pie = function(usage, w, h) return end - -- Calculate Total Item Count from items list for accurate percentages local totalItems = 0 for _, item in ipairs(usage.items) do totalItems = totalItems + (item.count or 0) @@ -413,10 +405,8 @@ styles.pie = function(usage, w, h) return end - -- Sort items by count desc table.sort(usage.items, function(a,b) return (a.count or 0) > (b.count or 0) end) - -- Create Slices (threshold 10%) local slices = {} local otherCount = 0 local colorIdx = 1 @@ -443,40 +433,28 @@ styles.pie = function(usage, w, h) }) end - -- Calculate screen geometry - -- Aspect ratio correction: Circle is drawn 1.5x wider than tall to look round on CC monitors - - -- Constrain by height (leave 1 line top/bottom for header/footer) - -- Usable height = h - 2 local usableH = h - 2 if usableH < 1 then usableH = 1 end local radiusH = usableH / 2 - - -- Constrain by width (use ~50% of width for pie, leave 50% for legend) local radiusW = (w * 0.5) / 3 local radius = math.min(radiusH, radiusW) if radius < 2 then radius = 2 end - local centerX = math.floor(radius * 1.5) + 2 -- Shift right slightly - local centerY = math.floor(usableH / 2) + 2 -- +2 because y starts at 2 (after header) + local centerX = math.floor(radius * 1.5) + 2 + local centerY = math.floor(usableH / 2) + 2 - -- Draw Pie - -- Iterate bounding box of circle for y = centerY - radius, centerY + radius do for x = centerX - (radius*1.5), centerX + (radius*1.5) do - local dx = (x - centerX) / 1.5 -- Correct aspect ratio (CC pixels are tall) + local dx = (x - centerX) / 1.5 local dy = (y - centerY) local dist = math.sqrt(dx*dx + dy*dy) if dist <= radius then - -- Calculate Angle (-pi to pi) local angle = math.atan2(dy, dx) - -- Normalize to 0 to 1 local normalizedAngle = (angle + math.pi) / (2 * math.pi) - -- Find which slice covers this angle local currentPct = 0 local pixelColor = labelBG for _, slice in ipairs(slices) do @@ -487,7 +465,6 @@ styles.pie = function(usage, w, h) currentPct = currentPct + slice.pct end - -- Draw only if inside bounds and not overwriting header/footer if x >= 1 and x <= w and y >= 2 and y <= h - 1 then monitor.setBackgroundColor(pixelColor) monitor.setCursorPos(x, y) @@ -497,7 +474,6 @@ styles.pie = function(usage, w, h) end end - -- Draw Legend (Right side) local legendX = math.floor(centerX + (radius * 1.5)) + 2 local legendY = math.floor((usableH - #slices) / 2) + 2 if legendY < 2 then legendY = 2 end @@ -508,7 +484,7 @@ styles.pie = function(usage, w, h) if yPos <= h - 1 then monitor.setCursorPos(legendX, yPos) monitor.setBackgroundColor(slice.color) - monitor.write(" ") -- Color swatch + monitor.write(" ") monitor.setBackgroundColor(labelBG) monitor.setTextColor(labelFG) local pctStr = math.floor(slice.pct * 100) .. "%" @@ -518,18 +494,213 @@ styles.pie = function(usage, w, h) end end +styles.line = function(usage, w, h) + setColors(labelFG, labelBG) + monitor.clear() + + centerText(1, "Metrics (T: Total, P: Proc)") + + if #historyTotal < 2 then + centerText(math.floor(h/2), "Gathering data...") + return + end + + local graphY = 2 + local graphH = h - 2 + if graphH < 2 then return end + + -- Calculate Auto-Scaling Minimums and Maximums + local maxT, minT = -math.huge, math.huge + local maxP, minP = -math.huge, math.huge + + for _, v in ipairs(historyTotal) do + if v > maxT then maxT = v end + if v < minT then minT = v end + end + for _, v in ipairs(historyProcessed) do + if v > maxP then maxP = v end + if v < minP then minP = v end + end + + -- Scale guards to prevent division by zero + if maxT == minT then maxT = minT + 1 end + if maxP == minP then maxP = minP + 1 end + if minP == math.huge then minP = 0 maxP = 1 end + + local startX = w - #historyTotal + 1 + if startX < 1 then startX = 1 end + + -- Draw the Graph + for i = 1, #historyTotal do + local x = startX + i - 1 + if x >= 1 and x <= w then + + -- Normalize data between 0.0 and 1.0 based on current view bounds + local normT = (historyTotal[i] - minT) / (maxT - minT) + local yT = graphY + graphH - 1 - math.floor(normT * (graphH - 1)) + + local normP = (historyProcessed[i] - minP) / (maxP - minP) + local yP = graphY + graphH - 1 - math.floor(normP * (graphH - 1)) + + -- Render Total Line (Solid Block Background) + monitor.setCursorPos(x, yT) + monitor.setBackgroundColor(lineTotalColor) + monitor.write(" ") + + -- Render Processed Line (Foreground Character Overlay) + monitor.setCursorPos(x, yP) + if yP ~= yT then + monitor.setBackgroundColor(labelBG) + end + monitor.setTextColor(lineProcColor) + monitor.write("x") + end + end + + -- Render Legends + setColors(labelFG, labelBG) + monitor.setCursorPos(1, h) + monitor.write(string.format("T:%d-%d", minT, maxT)) + + local rightText = string.format("P:%d-%d", minP, maxP) + monitor.setCursorPos(w - #rightText + 1, h) + monitor.write(rightText) +end + +-- Item list: shows the top-quantity items that fit on screen, each as a +-- mini proportional bar (relative to the largest item) with name + count. +styles.list = function(usage, w, h) + setColors(labelFG, labelBG) + monitor.clear() + + local slots = string.format("Total %u", usage.total) + centerText(1, slots) + + if not usage.items or #usage.items == 0 then + centerText(math.floor(h / 2), "No item data") + return + end + + table.sort(usage.items, function(a, b) return (a.count or 0) > (b.count or 0) end) + + local headerRows = 1 + local footerRows = 1 + local availableRows = h - headerRows - footerRows + if availableRows < 1 then availableRows = 1 end + + local numToShow = math.min(#usage.items, availableRows) + local maxCount = usage.items[1].count or 1 + if maxCount <= 0 then maxCount = 1 end + + for i = 1, numToShow do + local item = usage.items[i] + local count = item.count or 0 + local name = item.displayName or item.name or "Unknown" + local y = headerRows + i + + local countStr = tostring(count) + local barMaxWidth = w - #countStr - 2 + if barMaxWidth < 1 then barMaxWidth = 1 end + + local barWidth = math.floor((count / maxCount) * barMaxWidth) + if barWidth < 0 then barWidth = 0 end + if barWidth > barMaxWidth then barWidth = barMaxWidth end + + -- Proportional bar background, cycling through the pie palette + local barColor = pieColors[((i - 1) % #pieColors) + 1] + monitor.setCursorPos(1, y) + monitor.setBackgroundColor(barColor) + monitor.write(string.rep(" ", barWidth)) + monitor.setBackgroundColor(labelBG) + monitor.write(string.rep(" ", barMaxWidth - barWidth)) + + -- Item name, truncated to fit inside the bar area + local maxNameWidth = barMaxWidth - 1 + if maxNameWidth < 1 then maxNameWidth = 1 end + if #name > maxNameWidth then + name = string.sub(name, 1, math.max(maxNameWidth - 3, 1)) .. "..." + end + monitor.setCursorPos(2, y) + monitor.setTextColor(labelFG) + monitor.write(name) + + -- Count, right-aligned + setColors(labelFG, labelBG) + monitor.setCursorPos(w - #countStr + 1, y) + monitor.write(countStr) + end + + setColors(labelFG, labelBG) + if #usage.items > numToShow then + local moreStr = string.format("+%d more item%s", #usage.items - numToShow, (#usage.items - numToShow == 1) and "" or "s") + monitor.setCursorPos(1, h) + monitor.write(moreStr) + else + local usedStr = string.format("Used %u / %u", usage.used, usage.total) + monitor.setCursorPos(1, h) + monitor.write(usedStr) + end +end + +-- Compact: a minimal single-line summary, useful for small monitors. +-- Background color shifts with fill level, same thresholds as "big". +styles.compact = function(usage, w, h) + local pct = getPercentage(usage) + + local bg = freeBG + if pct > 0.75 then bg = usedBG + elseif pct > 0.5 then bg = alertColor end + + local textColor = currentTheme == "dark" and colors.white or colors.black + setColors(textColor, bg) + monitor.clear() + + local line = string.format("%u / %u (%d%%)", usage.used, usage.total, math.floor(pct * 100)) + centerText(math.floor(h / 2) + 1, line) +end + +-- Gauge: an ASCII bracket progress bar. Unlike horizontal/vertical this +-- doesn't rely on colored fills, so it reads fine on basic monitors too. +styles.gauge = function(usage, w, h) + setColors(labelFG, labelBG) + monitor.clear() + + local title = string.format("Total %u", usage.total) + centerText(1, title) + + local pct = getPercentage(usage) + local innerWidth = w - 4 + if innerWidth < 1 then innerWidth = 1 end + + local filled = math.floor(pct * innerWidth) + if filled > innerWidth then filled = innerWidth end + local bar = "[" .. string.rep("=", filled) .. string.rep("-", innerWidth - filled) .. "]" + + local barY = math.floor(h / 2) + monitor.setCursorPos(2, barY) + monitor.write(bar) + + local pctStr = string.format("%d%%", math.floor(pct * 100)) + centerText(barY + 2, pctStr) + + local used = string.format("Used %u", usage.used) + monitor.setCursorPos(1, h) + monitor.write(used) + + local free = string.format("Free %u", usage.free) + monitor.setCursorPos(w - #free + 1, h) + monitor.write(free) +end + -- Main Logic local function writeUsage(providedItems) local usage = lib.getUsage() - -- Refresh settings in case they changed while running settings.load() local currentStyle = settings.get("misc.style") local currentScale = settings.get("misc.scale") - local currentTheme = settings.get("misc.theme") or "light" - - -- Update theme colors if theme changed local newTheme = settings.get("misc.theme") or "light" + if newTheme ~= currentTheme then currentTheme = newTheme local colorsConfig = setThemeColors() @@ -540,16 +711,14 @@ local function writeUsage(providedItems) alertColor = colorsConfig.alertColor pieColors = colorsConfig.pieColors otherColor = colorsConfig.otherColor + lineTotalColor = colorsConfig.lineTotalColor + lineProcColor = colorsConfig.lineProcColor end - -- If in pie mode, we need item data. - -- Use providedItems (from update event) or fetch fresh list if missing. - if currentStyle == "pie" then + if currentStyle == "pie" or currentStyle == "list" then if providedItems then usage.items = providedItems elseif lib.list then - -- Fallback for initial render or manual refresh - -- We wrap in pcall just in case lib.list isn't available/fails local ok, res = pcall(lib.list) if ok then usage.items = res end end @@ -560,10 +729,8 @@ local function writeUsage(providedItems) local drawFunc = styles[currentStyle] or styles.horizontal - -- Protected call to prevent crashing on drawing errors local ok, err = pcall(drawFunc, usage, w, h) if not ok then - -- Use theme-aware colors for error display local errorBG = currentTheme == "dark" and colors.black or colors.white local errorFG = currentTheme == "dark" and colors.red or colors.red monitor.setBackgroundColor(errorBG) @@ -587,7 +754,7 @@ writeUsage() -- Loop Setup local watchdogAvaliable = fs.exists("watchdogLib.lua") -local funcs = {lib.subscribe, handleUpdates} +local funcs = {lib.subscribe, handleUpdates, trackHistory} if watchdogAvaliable then local watchdogLib = require '.watchdogLib' @@ -597,4 +764,4 @@ if watchdogAvaliable then end end -parallel.waitForAny(table.unpack(funcs)) \ No newline at end of file +parallel.waitForAny(table.unpack(funcs)) diff --git a/installer.lua b/installer.lua index 7457d79..61de5ff 100644 --- a/installer.lua +++ b/installer.lua @@ -26,6 +26,7 @@ elseif args[1] and args[1]:match("^[%w_-]+/[%w_-]+$") then local chunk = load(installerCode, "installer", "t", _ENV) if chunk then chunk(unpack(newArgs)) + return -- [[ FIXED: Stop this script so we don't run the default menu after the child finishes ]] else print("Error: Failed to load installer from target repository") print("Falling back to default repository") @@ -49,16 +50,14 @@ end local craftInstall = { name = "Crafting Modules", files = { - ["bfile.lua"] = fromRepository "bfile.lua", + ["lib/json.lua"] = fromRepository "lib/json.lua", modules = { ["crafting.lua"] = fromRepository "modules/crafting.lua", ["furnace.lua"] = fromRepository "modules/furnace.lua", ["grid.lua"] = fromRepository "modules/grid.lua", }, recipes = { - ["grid_recipes.bin"] = fromRepository "recipes/grid_recipes.bin", - ["item_lookup.bin"] = fromRepository "recipes/item_lookup.bin", - ["furnace_recipes.bin"] = fromRepository "recipes/furnace_recipes.bin", + ["recipes.json"] = fromRepository "recipes/recipes.json", } } } @@ -99,12 +98,23 @@ local chatboxInstall = { } } +local passwdInstall = { + name = "Password Module", + files = { + modules = { + ["passwd.lua"] = fromRepository "modules/passwd.lua" + } + } +} + + local baseInstall = { name = "Base MISC", files = { ["startup.lua"] = fromRepository "storage.lua", ["abstractInvLib.lua"] = fromRepository "lib/abstractInvLib.lua", ["common.lua"] = fromRepository "common.lua", + ["json.lua"] = fromRepository "lib/json.lua", modules = { ["inventory.lua"] = fromRepository "modules/inventory.lua", ["interface.lua"] = fromRepository "modules/interface.lua", @@ -135,6 +145,7 @@ local watchdogInstall = { local serverInstallOptions = { name = "Server installation options", b = baseInstall, + p = passwdInstall, c = craftInstall, d = disposalInstall, i = introspectionInstall, @@ -152,6 +163,23 @@ local terminalInstall = { } } +local secureTerminalInstall = { + name = "Secure Access Terminal", + files = { + ["startup.lua"] = fromRepository "clients/secure_terminal.lua", + ["terminal.lua"] = fromRepository "clients/terminal.lua", + ["modemLib.lua"] = fromRepository "clients/modemLib.lua" + } +} + +local farmerInstall = { + name = "Farmer Turtle", + files = { + ["startup.lua"] = fromRepository "clients/farmer.lua", + ["modemLib.lua"] = fromRepository "clients/modemLib.lua" + } +} + local introspectionTermInstall = { name = "Access Terminal (Introspection)", files = { @@ -203,6 +231,8 @@ local clientDisposalInstall = { local clientInstallOptions = { name = "Client installation options", t = terminalInstall, + s = secureTerminalInstall, + f = farmerInstall, i = introspectionTermInstall, c = crafterInstall, d = clientDisposalInstall, @@ -287,4 +317,22 @@ local function processOptions(options) end end -processOptions(installOptions) \ No newline at end of file +-- [[ UPDATED: Main Loop for Post-Install Actions ]] +while true do + processOptions(installOptions) + + print("\nInstallation complete.") + write("Would you like to [R]eboot or [I]nstall more components? ") + local input = read() + local char = input and input:sub(1, 1):lower() or "" + + if char == "r" then + os.reboot() + elseif char == "i" then + -- Just loop around. The repositoryUrl is preserved because we are still + -- in the same script execution instance. + else + print("\nExiting installer.") + break + end +end \ No newline at end of file diff --git a/lib/json.lua b/lib/json.lua new file mode 100644 index 0000000..711ef78 --- /dev/null +++ b/lib/json.lua @@ -0,0 +1,388 @@ +-- +-- json.lua +-- +-- Copyright (c) 2020 rxi +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of +-- this software and associated documentation files (the "Software"), to deal in +-- the Software without restriction, including without limitation the rights to +-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +-- of the Software, and to permit persons to whom the Software is furnished to do +-- so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all +-- copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +-- SOFTWARE. +-- + +local json = { _version = "0.1.2" } + +------------------------------------------------------------------------------- +-- Encode +------------------------------------------------------------------------------- + +local encode + +local escape_char_map = { + [ "\\" ] = "\\", + [ "\"" ] = "\"", + [ "\b" ] = "b", + [ "\f" ] = "f", + [ "\n" ] = "n", + [ "\r" ] = "r", + [ "\t" ] = "t", +} + +local escape_char_map_inv = { [ "/" ] = "/" } +for k, v in pairs(escape_char_map) do + escape_char_map_inv[v] = k +end + + +local function escape_char(c) + return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte())) +end + + +local function encode_nil(val) + return "null" +end + + +local function encode_table(val, stack) + local res = {} + stack = stack or {} + + -- Circular reference? + if stack[val] then error("circular reference") end + + stack[val] = true + + if rawget(val, 1) ~= nil or next(val) == nil then + -- Treat as array -- check keys are valid and it is not sparse + local n = 0 + for k in pairs(val) do + if type(k) ~= "number" then + error("invalid table: mixed or invalid key types") + end + n = n + 1 + end + if n ~= #val then + error("invalid table: sparse array") + end + -- Encode + for i, v in ipairs(val) do + table.insert(res, encode(v, stack)) + end + stack[val] = nil + return "[" .. table.concat(res, ",") .. "]" + + else + -- Treat as an object + for k, v in pairs(val) do + if type(k) ~= "string" then + error("invalid table: mixed or invalid key types") + end + table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) + end + stack[val] = nil + return "{" .. table.concat(res, ",") .. "}" + end +end + + +local function encode_string(val) + return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' +end + + +local function encode_number(val) + -- Check for NaN, -inf and inf + if val ~= val or val <= -math.huge or val >= math.huge then + error("unexpected number value '" .. tostring(val) .. "'") + end + return string.format("%.14g", val) +end + + +local type_func_map = { + [ "nil" ] = encode_nil, + [ "table" ] = encode_table, + [ "string" ] = encode_string, + [ "number" ] = encode_number, + [ "boolean" ] = tostring, +} + + +encode = function(val, stack) + local t = type(val) + local f = type_func_map[t] + if f then + return f(val, stack) + end + error("unexpected type '" .. t .. "'") +end + + +function json.encode(val) + return ( encode(val) ) +end + + +------------------------------------------------------------------------------- +-- Decode +------------------------------------------------------------------------------- + +local parse + +local function create_set(...) + local res = {} + for i = 1, select("#", ...) do + res[ select(i, ...) ] = true + end + return res +end + +local space_chars = create_set(" ", "\t", "\r", "\n") +local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") +local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") +local literals = create_set("true", "false", "null") + +local literal_map = { + [ "true" ] = true, + [ "false" ] = false, + [ "null" ] = nil, +} + + +local function next_char(str, idx, set, negate) + for i = idx, #str do + if set[str:sub(i, i)] ~= negate then + return i + end + end + return #str + 1 +end + + +local function decode_error(str, idx, msg) + local line_count = 1 + local col_count = 1 + for i = 1, idx - 1 do + col_count = col_count + 1 + if str:sub(i, i) == "\n" then + line_count = line_count + 1 + col_count = 1 + end + end + error( string.format("%s at line %d col %d", msg, line_count, col_count) ) +end + + +local function codepoint_to_utf8(n) + -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa + local f = math.floor + if n <= 0x7f then + return string.char(n) + elseif n <= 0x7ff then + return string.char(f(n / 64) + 192, n % 64 + 128) + elseif n <= 0xffff then + return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) + elseif n <= 0x10ffff then + return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, + f(n % 4096 / 64) + 128, n % 64 + 128) + end + error( string.format("invalid unicode codepoint '%x'", n) ) +end + + +local function parse_unicode_escape(s) + local n1 = tonumber( s:sub(1, 4), 16 ) + local n2 = tonumber( s:sub(7, 10), 16 ) + -- Surrogate pair? + if n2 then + return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) + else + return codepoint_to_utf8(n1) + end +end + + +local function parse_string(str, i) + local res = "" + local j = i + 1 + local k = j + + while j <= #str do + local x = str:byte(j) + + if x < 32 then + decode_error(str, j, "control character in string") + + elseif x == 92 then -- `\`: Escape + res = res .. str:sub(k, j - 1) + j = j + 1 + local c = str:sub(j, j) + if c == "u" then + local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1) + or str:match("^%x%x%x%x", j + 1) + or decode_error(str, j - 1, "invalid unicode escape in string") + res = res .. parse_unicode_escape(hex) + j = j + #hex + else + if not escape_chars[c] then + decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string") + end + res = res .. escape_char_map_inv[c] + end + k = j + 1 + + elseif x == 34 then -- `"`: End of string + res = res .. str:sub(k, j - 1) + return res, j + 1 + end + + j = j + 1 + end + + decode_error(str, i, "expected closing quote for string") +end + + +local function parse_number(str, i) + local x = next_char(str, i, delim_chars) + local s = str:sub(i, x - 1) + local n = tonumber(s) + if not n then + decode_error(str, i, "invalid number '" .. s .. "'") + end + return n, x +end + + +local function parse_literal(str, i) + local x = next_char(str, i, delim_chars) + local word = str:sub(i, x - 1) + if not literals[word] then + decode_error(str, i, "invalid literal '" .. word .. "'") + end + return literal_map[word], x +end + + +local function parse_array(str, i) + local res = {} + local n = 1 + i = i + 1 + while 1 do + local x + i = next_char(str, i, space_chars, true) + -- Empty / end of array? + if str:sub(i, i) == "]" then + i = i + 1 + break + end + -- Read token + x, i = parse(str, i) + res[n] = x + n = n + 1 + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "]" then break end + if chr ~= "," then decode_error(str, i, "expected ']' or ','") end + end + return res, i +end + + +local function parse_object(str, i) + local res = {} + i = i + 1 + while 1 do + local key, val + i = next_char(str, i, space_chars, true) + -- Empty / end of object? + if str:sub(i, i) == "}" then + i = i + 1 + break + end + -- Read key + if str:sub(i, i) ~= '"' then + decode_error(str, i, "expected string for key") + end + key, i = parse(str, i) + -- Read ':' delimiter + i = next_char(str, i, space_chars, true) + if str:sub(i, i) ~= ":" then + decode_error(str, i, "expected ':' after key") + end + i = next_char(str, i + 1, space_chars, true) + -- Read value + val, i = parse(str, i) + -- Set + res[key] = val + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "}" then break end + if chr ~= "," then decode_error(str, i, "expected '}' or ','") end + end + return res, i +end + + +local char_func_map = { + [ '"' ] = parse_string, + [ "0" ] = parse_number, + [ "1" ] = parse_number, + [ "2" ] = parse_number, + [ "3" ] = parse_number, + [ "4" ] = parse_number, + [ "5" ] = parse_number, + [ "6" ] = parse_number, + [ "7" ] = parse_number, + [ "8" ] = parse_number, + [ "9" ] = parse_number, + [ "-" ] = parse_number, + [ "t" ] = parse_literal, + [ "f" ] = parse_literal, + [ "n" ] = parse_literal, + [ "[" ] = parse_array, + [ "{" ] = parse_object, +} + + +parse = function(str, idx) + local chr = str:sub(idx, idx) + local f = char_func_map[chr] + if f then + return f(str, idx) + end + decode_error(str, idx, "unexpected character '" .. chr .. "'") +end + + +function json.decode(str) + if type(str) ~= "string" then + error("expected argument of type string, got " .. type(str)) + end + local res, idx = parse(str, next_char(str, 1, space_chars, true)) + idx = next_char(str, idx, space_chars, true) + if idx <= #str then + decode_error(str, idx, "trailing garbage") + end + return res +end + + +return json diff --git a/modules/crafting.lua b/modules/crafting.lua index e7b55bc..66cf4da 100644 --- a/modules/crafting.lua +++ b/modules/crafting.lua @@ -3,13 +3,18 @@ local common = require("common") ---@field interface modules.crafting.interface return { id = "crafting", - version = "1.4.1", - config = { + version = "1.4.8", -- Bumped version for fix + config = { tagLookup = { type = "table", description = "Force a given item to be used for a tag lookup. Map from tag->item.", default = {} }, + aliases = { + type = "table", + description = "Manual Table of aliases. Map input -> output (e.g. 'foo' -> 'bar').", + default = {} + }, persistence = { type = "boolean", description = @@ -43,72 +48,73 @@ return { }, init = function(loaded, config) local log = loaded.logger - ---@alias ItemInfo {[1]: string, tag: boolean?} - + + ---@alias ItemInfo {name: string, tag: boolean?} ---@alias ItemIndex integer ---@type ItemInfo[] - -- lookup into an ordered list of item names local itemLookup = {} ---@type table lookup from name -> item_lookup index local itemNameLookup = {} - local bfile = require("bfile") - bfile.addType("tag_boolean", function(f) - if f.read(1) == "T" then - return true - end - return false - end, function(f, v) - if v then - f.write("T") - else - f.write("I") - end - end) - bfile.newStruct("item_lookup_entry"):add("tag_boolean", "tag"):add("string", 1) - bfile.newStruct("item_lookup"):constant("ILUT"):add("item_lookup_entry[*]", "^") - + local json = require("lib/json") local function saveItemLookup() - bfile.getStruct("item_lookup"):writeFile("recipes/item_lookup.bin", itemLookup) + local f = assert(fs.open("recipes/item_lookup.json", "w")) + f.write(json.encode(itemLookup)) + f.close() end + local function loadItemLookup() - itemLookup = bfile.getStruct("item_lookup"):readFile("recipes/item_lookup.bin") or {} - for k, v in pairs(itemLookup) do - itemNameLookup[v[1]] = k + local f = fs.open("recipes/item_lookup.json", "r") + if f then + local contents = f.readAll() or "{}" + f.close() + local decoded = json.decode(contents) + if type(decoded) == "table" then + itemLookup = decoded + for k, v in pairs(itemLookup) do + local name = v.name or v[1] + if name then + itemNameLookup[name] = k + end + end + else + print("Warning: Invalid item lookup JSON format") + end end end - ---Get the index of a string or tag, creating one if one doesn't exist already + ---Get the index of a string or tag ---@param str string ---@param tag boolean|nil ---@return ItemIndex local function getOrCacheString(str, tag) common.enforceType(str, 1, "string") common.enforceType(tag, 2, "boolean", "nil") + + -- Manual Alias Resolution (Config) + local aliases = config.crafting.aliases and config.crafting.aliases.value + if aliases and aliases[str] then + str = aliases[str] + end + if itemNameLookup[str] then return itemNameLookup[str] end local i = #itemLookup + 1 - itemLookup[i] = { str, tag = not not tag } + itemLookup[i] = { name = str, tag = not not tag } itemNameLookup[str] = i - saveItemLookup() -- updated item lookup + saveItemLookup() return i end local jsonLogger = setmetatable({}, { - __index = function() - return function() - end - end + __index = function() return function() end end }) if log then jsonLogger = log.interface.logger("crafting", "json_importing") end local jsonTypeHandlers = {} - ---Add a JSON type handler, this should load a recipe from the given JSON table - ---@param jsonType string - ---@param handler fun(json: table) local function addJsonTypeHandler(jsonType, handler) common.enforceType(jsonType, 1, "string") common.enforceType(handler, 2, "function") @@ -127,48 +133,16 @@ return { ---@alias taskID string uuid foriegn key ---@alias JobId string - - ---@type CraftingNode[] tasks that have unmet dependencies local waitingQueue = {} - ---@type CraftingNode[] tasks that have all dependencies met local readyQueue = {} - ---@type CraftingNode[] tasks that are in progress local craftingQueue = {} - - ---@type table tasks that have been completed, but are still relavant local doneLookup = {} - - ---@type table local transferIdTaskLUT = {} - local tickNode, changeNodeState, deleteTask - - --- ITEM - this node represents a quantity of items from the network - --- ROOT - this node represents the root of a crafting task - - ---@alias NodeState string | "WAITING" | "READY" | "CRAFTING" | "DONE" - - ---@class CraftingNode - ---@field children CraftingNode[]|nil - ---@field parent CraftingNode|nil - ---@field type "ITEM" | "ROOT" | "MISSING" - ---@field name string - ---@field count integer amount of this item to produce - ---@field taskId string - ---@field jobId string - ---@field state NodeState - ---@field priority integer TODO - - ---@type table> item name -> count reserved local reservedItems = {} - bfile.addAlias("string_uint16_map", "map") - bfile.newStruct("reserved_items"):add("map", "^") - local function saveReservedItems() - if not config.crafting.persistence.value then - return - end + if not config.crafting.persistence.value then return end common.saveTableToFile(".cache/reserved_items.txt", reservedItems) end @@ -180,24 +154,15 @@ return { reservedItems = common.loadTableFromFile(".cache/reserved_items.txt") or {} end - ---Get count of item in system, excluding reserved - ---@param name string - ---@return integer local function getCount(name) common.enforceType(name, 1, "string") local reservedCount = 0 for k, v in pairs(reservedItems[name] or {}) do - -- TODO add check to ensure this is not leaked reservedCount = reservedCount + v end return loaded.inventory.interface.getCount(name) - reservedCount end - ---Reserve amount of item name - ---@param name string - ---@param amount integer - ---@param taskId string - ---@return integer local function allocateItems(name, amount, taskId) common.enforceType(name, 1, "string") common.enforceType(amount, 2, "integer") @@ -207,183 +172,278 @@ return { return amount end - ---Free amount of item name - ---@param name string - ---@param amount integer - ---@param taskId string - ---@return integer local function deallocateItems(name, amount, taskId) common.enforceType(name, 1, "string") common.enforceType(amount, 2, "integer") - - -- Ensure reservedItems[name] and reservedItems[name][taskId] exist if not reservedItems[name] or not reservedItems[name][taskId] then - -- Items were not reserved, this can happen when crafting completes successfully - -- and items were already consumed, or when tasks are cleaned up properly if log then - craftLogger:debug("Attempt to deallocate items that are not reserved (name: %s, amount: %d, taskId: %s)", name, amount, taskId) - else - print("Attempt to deallocate items that are not reserved") + -- craftLogger:debug("Attempt to deallocate...") -- craftLogger not defined yet end return 0 end - reservedItems[name][taskId] = reservedItems[name][taskId] - amount - assert(reservedItems[name][taskId] >= 0, "We have negative items reserved?") - if reservedItems[name][taskId] == 0 then - reservedItems[name][taskId] = nil - end - if not next(reservedItems[name]) then - reservedItems[name] = nil - end + if reservedItems[name][taskId] == 0 then reservedItems[name][taskId] = nil end + if not next(reservedItems[name]) then reservedItems[name] = nil end saveReservedItems() return amount end local cachedStackSizes = {} - - ---Get the maximum stacksize of an item by name - ---@param name string local function getStackSize(name) common.enforceType(name, 1, "string") - if cachedStackSizes[name] then - return cachedStackSizes[name] - end + if cachedStackSizes[name] then return cachedStackSizes[name] end local item = loaded.inventory.interface.getItem(name) cachedStackSizes[name] = (item and item.item and item.item.maxCount) or 64 return cachedStackSizes[name] end local lastId = 0 - ---Get a psuedorandom uuid - ---@return string local function id() lastId = lastId + 1 - local genId = lastId .. "$" - return genId + return lastId .. "$" end - ---@type table local craftableLists = {} - ---Set the table of craftable items for a given id - ---@param id string ID of crafting module/type - ---@param list string[] table of craftable item names, assigned by reference local function addCraftableList(id, list) common.enforceType(id, 1, "string") common.enforceType(list, 2, "string[]") craftableLists[id] = list end - ---List all the items that are craftable - ---@return string[] local function listCraftables() local l = {} for k, v in pairs(craftableLists) do - for i, s in ipairs(v) do - table.insert(l, s) - end + for i, s in ipairs(v) do table.insert(l, s) end end return l end - bfile.newStruct("cached_tags"):add("map", "^") - - ---@type table tag -> item names local cachedTagLookup = {} - local function saveCachedTags() - bfile.getStruct("cached_tags"):writeFile(".cache/cached_tags.bin", cachedTagLookup) + local f = assert(fs.open(".cache/cached_tags.json", "w")) + f.write(json.encode(cachedTagLookup)) + f.close() end - ---@type table> tag -> item name -> is it in cached_tag_lookup local cachedTagPresence = {} - local function loadCachedTags() - cachedTagLookup = bfile.getStruct("cached_tags"):readFile(".cache/cached_tags.bin") or {} - cachedTagPresence = {} - for tag, names in pairs(cachedTagLookup) do - cachedTagPresence[tag] = {} - for _, name in ipairs(names) do - cachedTagPresence[tag][name] = true + local f = fs.open(".cache/cached_tags.json", "r") + if f then + cachedTagLookup = json.decode(f.readAll() or "{}") + f.close() + cachedTagPresence = {} + for tag, names in pairs(cachedTagLookup) do + cachedTagPresence[tag] = {} + for _, name in ipairs(names) do + cachedTagPresence[tag][name] = true + end end end end + -- Load aliases/tags from recipes.json + local function loadAliases() + if not fs.exists("recipes/recipes.json") then return end + local f = fs.open("recipes/recipes.json", "r") + if f then + local content = f.readAll() + f.close() + local data = json.decode(content) + if data and data.aliases then + print("Loading aliases from recipes.json...") + local count = 0 + for tag, items in pairs(data.aliases) do + cachedTagLookup[tag] = items + cachedTagPresence[tag] = cachedTagPresence[tag] or {} + for _, item in ipairs(items) do + cachedTagPresence[tag][item] = true + end + count = count + 1 + end + print("Loaded " .. count .. " aliases/tags.") + saveCachedTags() + end + end + end + + local craft -- forward declaration + local function runOnAll(root, func) + common.enforceType(root, 1, "table") + common.enforceType(func, 2, "function") + func(root) + if root.children then + for _, v in pairs(root.children) do runOnAll(v, func) end + end + end + + local function getJobInfo(root) + common.enforceType(root, 1, "table") + local ret = { success = true, toCraft = {}, toUse = {}, missing = {}, jobId = root.jobId } + runOnAll(root, function(node) + if node.type == "ITEM" then ret.toUse[node.name] = (ret.toUse[node.name] or 0) + node.count + elseif node.type == "MISSING" then + ret.success = false + ret.missing[node.name] = (ret.missing[node.name] or 0) + node.count + elseif node.type ~= "ROOT" then + ret.toCraft[node.name] = (ret.toCraft[node.name] or 0) + (node.count or 0) + end + end) + return ret + end - ---Select the best item from a tag - ---@param tag string - ---@return boolean success - ---@return string itemName local function selectBestFromTag(tag) common.enforceType(tag, 1, "string") if config.crafting.tagLookup.value[tag] then return true, config.crafting.tagLookup.value[tag] end + if not cachedTagPresence[tag] then cachedTagPresence[tag] = {} cachedTagLookup[tag] = {} saveCachedTags() end - -- first check if we have anything - local itemsWithTag = loaded.inventory.interface.getTag(tag) - local itemsWithTagsCount = {} - for k, v in ipairs(itemsWithTag) do - if not cachedTagPresence[tag][v] then - -- update the cache if it's not in there already - cachedTagPresence[tag][v] = true - table.insert(cachedTagLookup[tag], v) - saveCachedTags() - end - itemsWithTagsCount[k] = { name = v, count = loaded.inventory.interface.getCount(v) } + + local candidates = {} + local inventoryTags = loaded.inventory.interface.getTag(tag) + if inventoryTags then + for _, item in ipairs(inventoryTags) do candidates[item] = true end end + if cachedTagLookup[tag] then + for _, item in ipairs(cachedTagLookup[tag]) do candidates[item] = true end + end + + local itemsWithTagsCount = {} + for name, _ in pairs(candidates) do + if not cachedTagPresence[tag][name] then + cachedTagPresence[tag][name] = true + table.insert(cachedTagLookup[tag], name) + saveCachedTags() + end + local count = loaded.inventory.interface.getCount(name) + if count > 0 then + table.insert(itemsWithTagsCount, { name = name, count = count }) + end + end + table.sort(itemsWithTagsCount, function(a, b) return a.count > b.count end) + if itemsWithTagsCount[1] then return true, itemsWithTagsCount[1].name end - -- then check if we can craft anything local craftableList = listCraftables() local isCraftableLUT = {} for k, v in pairs(craftableList) do isCraftableLUT[v] = true end + -- Filter candidates to only those that are theoretically craftable + local craftableCandidates = {} + for name, _ in pairs(candidates) do + if isCraftableLUT[name] then + table.insert(craftableCandidates, name) + end + end + + -- Fallback: If we have tags in cache but they weren't in candidates list for k, v in pairs(cachedTagLookup[tag]) do - if isCraftableLUT[v] then - return true, v -- this is not the best way of doing this. + if isCraftableLUT[v] and not candidates[v] then + table.insert(craftableCandidates, v) end end - -- no solution found + -- Simulation check: Pick the candidate we can actually craft + for _, name in ipairs(craftableCandidates) do + -- Simulate crafting 1 item + local simChain = { isSimulation = true } + local simNodes = craft(name, 1, "sim", nil, simChain) + -- Check success + local root = { jobId = "sim", children = simNodes, type = "ROOT", taskId = "sim" } + local info = getJobInfo(root) + if info.success then + return true, name + end + end + + -- If all fail, fallback to the first one (will likely fail later but better than nothing) + if craftableCandidates[1] then + return true, craftableCandidates[1] + end + return false, tag end - ---Select the best item from an index - ---@param index ItemIndex - ---@return boolean success - ---@return string itemName local function selectBestFromIndex(index) common.enforceType(index, 1, "integer") local itemInfo = assert(itemLookup[index], "Invalid item index") + local name = itemInfo.name or itemInfo[1] if itemInfo.tag then - return selectBestFromTag(itemInfo[1]) + local lookupName = name + if not lookupName:find("^#") then lookupName = "#" .. lookupName end + return selectBestFromTag(lookupName) end - return true, itemInfo[1] + return true, name end - ---Select the best item from a list of ItemIndex - ---@param list ItemIndex[] - ---@return boolean success - ---@return string itemName local function selectBestFromList(list) common.enforceType(list, 1, "integer[]") - return true, itemLookup[list[1]][1] + + -- 1. Check if we have any of these items directly in inventory + for _, itemIndex in ipairs(list) do + local itemInfo = itemLookup[itemIndex] + local name = itemInfo.name or itemInfo[1] + + -- If the list entry is a TAG, try to resolve it to an item we have + if itemInfo.tag then + local tagStr = name + if not tagStr:find("^#") then tagStr = "#" .. tagStr end + local success, resolved = selectBestFromTag(tagStr) + if success and getCount(resolved) > 0 then + return true, resolved + end + elseif getCount(name) > 0 then + return true, name + end + end + + local craftableList = listCraftables() + local isCraftableLUT = {} + for k, v in pairs(craftableList) do + isCraftableLUT[v] = true + end + + local craftableCandidates = {} + for _, itemIndex in ipairs(list) do + local itemInfo = itemLookup[itemIndex] + local name = itemInfo.name or itemInfo[1] + + if itemInfo.tag then + -- Resolve tag to a specific item for crafting check + local tagStr = name + if not tagStr:find("^#") then tagStr = "#" .. tagStr end + local success, resolved = selectBestFromTag(tagStr) + if success then + table.insert(craftableCandidates, resolved) + end + elseif isCraftableLUT[name] then + table.insert(craftableCandidates, name) + end + end + + for _, name in ipairs(craftableCandidates) do + local simChain = { isSimulation = true } + local simNodes = craft(name, 1, "sim", nil, simChain) + local root = { jobId = "sim", children = simNodes, type = "ROOT", taskId = "sim" } + local info = getJobInfo(root) + if info.success then + return true, name + end + end + + local firstInfo = itemLookup[list[1]] + return true, (firstInfo.name or firstInfo[1]) end - ---Select the best item - ---@param item ItemIndex[]|ItemIndex - ---@return boolean success - ---@return string name itemname if success, otherwise tag local function getBestItem(item) common.enforceType(item, 1, "integer[]", "integer") if type(item) == "table" then @@ -394,19 +454,12 @@ return { error("Invalid type " .. type(item), 2) end - ---Get the string for a given index - ---@param v integer - ---@return string string - ---@return boolean tag local function getString(v) local itemInfo = itemLookup[v] assert(itemInfo, "Invalid key passed to getString") - return itemInfo[1], itemInfo.tag + return (itemInfo.name or itemInfo[1]), itemInfo.tag end - ---Merge from into the end of to - ---@param from table - ---@param to table local function mergeInto(from, to) common.enforceType(from, 1, "table") common.enforceType(to, 1, "table") @@ -415,47 +468,30 @@ return { end end - - ---Lookup from taskId to the corrosponding CraftingNode - ---@type table local taskLookup = {} - - ---Lookup from jobId to the corrosponding CraftingNode - ---@type table local jobLookup = {} - ---Shallow clone a table - ---@param t table - ---@return table local function shallowClone(t) common.enforceType(t, 1, "table") local nt = {} - for k, v in pairs(t) do - nt[k] = v - end + for k, v in pairs(t) do nt[k] = v end return nt end local function saveTaskLookup() - if not config.crafting.persistence.value then - return - end + if not config.crafting.persistence.value then return end local flatTaskLookup = {} for k, v in pairs(taskLookup) do flatTaskLookup[k] = shallowClone(v) local flatTask = flatTaskLookup[k] - if v.parent then - flatTask.parent = v.parent.taskId - end + if v.parent then flatTask.parent = v.parent.taskId end if v.children then flatTask.children = {} - for i, ch in pairs(v.children) do - flatTask.children[i] = ch.taskId - end + for i, ch in pairs(v.children) do flatTask.children[i] = ch.taskId end end end - local f = assert(fs.open(".cache/flat_task_lookup.bin", "wb")) - f.write(bfile.serialise(flatTaskLookup)) + local f = assert(fs.open(".cache/flat_task_lookup.json", "w")) + f.write(json.encode(flatTaskLookup)) f.close() end @@ -464,19 +500,19 @@ return { taskLookup = {} return end - local taskLoaderLogger = setmetatable({}, { - __index = function() - return function() - end - end - }) - if log then - taskLoaderLogger = log.interface.logger("crafting", "loadTaskLookup") - end - local f = fs.open(".cache/flat_task_lookup.bin", "rb") + local taskLoaderLogger = setmetatable({}, { __index = function() return function() end end }) + if log then taskLoaderLogger = log.interface.logger("crafting", "loadTaskLookup") end + local f = fs.open(".cache/flat_task_lookup.json", "r") if f then - taskLookup = bfile.unserialise(f.readAll() or "") + local contents = f.readAll() or "{}" f.close() + local decoded = json.decode(contents) + if type(decoded) == "table" then + taskLookup = decoded + else + taskLookup = {} + print("Warning: Invalid task lookup JSON format") + end else taskLookup = {} end @@ -489,41 +525,23 @@ return { taskLoaderLogger:debug("Loaded taskId=%s,state=%s", v.taskId, v.state) jobLookup[v.jobId] = jobLookup[v.jobId] or {} table.insert(jobLookup[v.jobId], v) - if v.parent then - v.parent = taskLookup[v.parent] - end + if v.parent then v.parent = taskLookup[v.parent] end if v.children then - for i, ch in pairs(v.children) do - v.children[i] = taskLookup[ch] - end + for i, ch in pairs(v.children) do v.children[i] = taskLookup[ch] end end if v.state then - if v.state == "WAITING" then - table.insert(waitingQueue, v) - elseif v.state == "READY" then - table.insert(readyQueue, v) - elseif v.state == "CRAFTING" then - table.insert(craftingQueue, v) - elseif v.state == "DONE" then - doneLookup[v.taskId] = v - else - error("Invalid state on load") - end + if v.state == "WAITING" then table.insert(waitingQueue, v) + elseif v.state == "READY" then table.insert(readyQueue, v) + elseif v.state == "CRAFTING" then table.insert(craftingQueue, v) + elseif v.state == "DONE" then doneLookup[v.taskId] = v + else error("Invalid state on load") end end end end - local craftLogger = setmetatable({}, { - __index = function() - return function() - end - end - }) - if log then - craftLogger = log.interface.logger("crafting", "request_craft") - end - local craft - ---@type table + local craftLogger = setmetatable({}, { __index = function() return function() end end }) + if log then craftLogger = log.interface.logger("crafting", "request_craft") end + local requestCraftTypes = {} local function addCraftType(type, func) common.enforceType(type, 1, "string") @@ -535,22 +553,9 @@ return { common.enforceType(name, 1, "string") common.enforceType(count, 2, "integer") common.enforceType(jobId, 3, "string") - return { - name = name, - jobId = jobId, - taskId = id(), - count = count, - type = "MISSING" - } + return { name = name, jobId = jobId, taskId = id(), count = count, type = "MISSING" } end - ---Attempt a craft - ---@param node CraftingNode - ---@param name string - ---@param remaining integer - ---@param requestChain table - ---@param jobId string - ---@return number local function _attemptCraft(node, name, remaining, requestChain, jobId) common.enforceType(node, 1, "table") common.enforceType(name, 2, "string") @@ -561,27 +566,18 @@ return { for k, v in pairs(requestCraftTypes) do success = v(node, name, remaining, requestChain) if success then - craftLogger:debug("Recipe found. provider:%s,name:%s,count:%u,taskId:%s,jobId:%s", k, name, node.count, - node.taskId, jobId) + craftLogger:debug("Recipe found. provider:%s,name:%s,count:%u,taskId:%s,jobId:%s", k, name, node.count, node.taskId, jobId) craftLogger:info("Recipe for %s was provided by %s", name, k) break end end if not success then craftLogger:debug("No recipe found for %s", name) - for k, v in pairs(createMissingNode(name, remaining, jobId)) do - node[k] = v - end + for k, v in pairs(createMissingNode(name, remaining, jobId)) do node[k] = v end end return remaining - node.count end - ---@param name string item name - ---@param count integer - ---@param jobId string - ---@param force boolean|nil - ---@param requestChain table|nil table of item names that have been requested - ---@return CraftingNode[] leaves ITEM|MISSING|other node function craft(name, count, jobId, force, requestChain) common.enforceType(name, 1, "string") common.enforceType(count, 2, "integer") @@ -589,27 +585,27 @@ return { common.enforceType(force, 4, "boolean", "nil") common.enforceType(requestChain, 5, "table", "nil") requestChain = shallowClone(requestChain or {}) - if requestChain[name] then - return { createMissingNode(name, count, jobId) } - end + + -- Stop loop + if requestChain[name] then return { createMissingNode(name, count, jobId) } end requestChain[name] = true - ---@type CraftingNode[] + + local isSimulation = requestChain.isSimulation + local nodes = {} local remaining = count craftLogger:debug("Remaining craft count for %s is %u", name, remaining) while remaining > 0 do - ---@type CraftingNode - local node = { - name = name, - taskId = id(), - jobId = jobId, - priority = 1, - } - -- First check if we have any of this + local node = { name = name, taskId = id(), jobId = jobId, priority = 1 } local available = getCount(name) if available > 0 and not force then - -- we do, so allocate it - local allocateAmount = allocateItems(name, math.min(available, remaining), node.taskId) + local allocateAmount + if isSimulation then + -- Mock allocation + allocateAmount = math.min(available, remaining) + else + allocateAmount = allocateItems(name, math.min(available, remaining), node.taskId) + end node.type = "ITEM" node.count = allocateAmount remaining = remaining - allocateAmount @@ -622,101 +618,54 @@ return { return nodes end - ---Run the given function an all nodes of the given tree - ---@param root CraftingNode root - ---@param func fun(node: CraftingNode) local function runOnAll(root, func) common.enforceType(root, 1, "table") common.enforceType(func, 2, "function") func(root) if root.children then - for _, v in pairs(root.children) do - runOnAll(v, func) - end + for _, v in pairs(root.children) do runOnAll(v, func) end end end - ---Remove an object from a table - ---@generic T : any - ---@param arr T[] - ---@param val T local function removeFromArray(arr, val) common.enforceType(arr, 1, type(val) .. "[]") for i, v in ipairs(arr) do - if v == val then - table.remove(arr, i) - end + if v == val then table.remove(arr, i) end end end - ---Delete a given task, asserting the task is DONE and has no children - ---@param task CraftingNode function deleteTask(task) common.enforceType(task, 1, "table") - if task.type == "ITEM" then - deallocateItems(task.name, task.count, task.taskId) - end - if task.parent then - removeFromArray(task.parent.children, task) - end + if task.type == "ITEM" then deallocateItems(task.name, task.count, task.taskId) end + if task.parent then removeFromArray(task.parent.children, task) end assert(task.state == "DONE", "Attempt to delete not done task.") doneLookup[task.taskId] = nil assert(task.children == nil, "Attempt to delete task with children.") taskLookup[task.taskId] = nil removeFromArray(jobLookup[task.jobId], task) - if #jobLookup[task.jobId] == 0 then - jobLookup[task.jobId] = nil - end + if #jobLookup[task.jobId] == 0 then jobLookup[task.jobId] = nil end end - local nodeStateLogger = setmetatable({}, { - __index = function() - return function() - end - end - }) - if log then - nodeStateLogger = log.interface.logger("crafting", "node_state") - end - ---Safely change a node to a new state - ---Only modifies the node's state and related caches - ---@param node CraftingNode - ---@param newState NodeState + local nodeStateLogger = setmetatable({}, { __index = function() return function() end end }) + if log then nodeStateLogger = log.interface.logger("crafting", "node_state") end + function changeNodeState(node, newState) - if not node then - error("No node?", 2) - end - if node.state == newState then - return - end - if node.state == "WAITING" then - removeFromArray(waitingQueue, node) - elseif node.state == "READY" then - removeFromArray(readyQueue, node) - elseif node.state == "CRAFTING" then - removeFromArray(craftingQueue, node) - elseif node.state == "DONE" then - doneLookup[node.taskId] = nil - end + if not node then error("No node?", 2) end + if node.state == newState then return end + if node.state == "WAITING" then removeFromArray(waitingQueue, node) + elseif node.state == "READY" then removeFromArray(readyQueue, node) + elseif node.state == "CRAFTING" then removeFromArray(craftingQueue, node) + elseif node.state == "DONE" then doneLookup[node.taskId] = nil end node.state = newState - if node.state == "WAITING" then - table.insert(waitingQueue, node) - elseif node.state == "READY" then - table.insert(readyQueue, node) - elseif node.state == "CRAFTING" then - table.insert(craftingQueue, node) + if node.state == "WAITING" then table.insert(waitingQueue, node) + elseif node.state == "READY" then table.insert(readyQueue, node) + elseif node.state == "CRAFTING" then table.insert(craftingQueue, node) elseif node.state == "DONE" then doneLookup[node.taskId] = node os.queueEvent("crafting_node_done", node.taskId) end end - ---Protected pushItems, errors if it cannot move - ---enough items to a slot - ---@param to string - ---@param name string - ---@param toMove integer - ---@param slot integer local function pushItems(to, name, toMove, slot) common.enforceType(to, 1, "string") common.enforceType(name, 2, "string") @@ -728,83 +677,52 @@ return { toMove = toMove - transfered if transfered == 0 then failCount = failCount + 1 - if failCount > 3 then - error(("Unable to move %s"):format(name)) - end + if failCount > 3 then error(("Unable to move %s"):format(name)) end end end end - ---@type table Process an item in the READY state local readyHandlers = {} - - ---@param nodeType string - ---@param func fun(node: CraftingNode)> local function addReadyHandler(nodeType, func) common.enforceType(nodeType, 1, "string") common.enforceType(func, 2, "function") readyHandlers[nodeType] = func end - ---@type table Process an item that is in the CRAFTING state local craftingHandlers = {} - - ---@param nodeType string - ---@param func fun(node: CraftingNode)> local function addCraftingHandler(nodeType, func) common.enforceType(nodeType, 1, "string") common.enforceType(func, 2, "function") craftingHandlers[nodeType] = func end - ---Deletes all the node's children, calling delete_task on each local function deleteNodeChildren(node) common.enforceType(node, 1, "table") - if not node.children then - return - end - for _, child in pairs(node.children) do - deleteTask(child) - end + if not node.children then return end + for _, child in pairs(node.children) do deleteTask(child) end node.children = nil end - ---Update the state of the given node - ---@param node CraftingNode function tickNode(node) saveTaskLookup() common.enforceType(node, 1, "table") if not node.state then - if node.type == "ROOT" then - node.startTime = os.epoch("utc") - end - -- This is an uninitialized node - -- leaf -> set state to READY - -- otherwise -> set state to WAITING - if node.children then - changeNodeState(node, "WAITING") - else - changeNodeState(node, "DONE") - end + if node.type == "ROOT" then node.startTime = os.epoch("utc") end + if node.children then changeNodeState(node, "WAITING") + else changeNodeState(node, "DONE") end return end - -- this is a node that has been updated before if node.state == "WAITING" then if node.children then - -- this has children it depends upon local allChildrenDone = true for _, child in pairs(node.children) do allChildrenDone = child.state == "DONE" - if not allChildrenDone then - break - end + if not allChildrenDone then break end end if allChildrenDone then - -- this is ready to be crafted deleteNodeChildren(node) removeFromArray(waitingQueue, node) if node.type == "ROOT" then - -- This task is the root of a job nodeStateLogger:info("Finished jobId:%s in %.2fsec", node.jobId, (os.epoch("utc") - node.startTime) / 1000) os.queueEvent("craft_job_done", node.jobId) changeNodeState(node, "DONE") @@ -813,9 +731,7 @@ return { end changeNodeState(node, "READY") end - else - changeNodeState(node, "READY") - end + else changeNodeState(node, "READY") end elseif node.state == "READY" then assert(readyHandlers[node.type], "No readyHandler for type " .. (node.type or "nil")) readyHandlers[node.type](node) @@ -827,25 +743,16 @@ return { end end - ---Update every node on the tree - ---@param tree CraftingNode local function updateWholeTree(tree) common.enforceType(tree, 1, "table") - -- traverse to each node of the tree runOnAll(tree, tickNode) end - ---Remove the parent of each child - ---@param node CraftingNode local function removeChildrensParents(node) common.enforceType(node, 1, "table") - for k, v in pairs(node.children) do - v.parent = nil - end + for k, v in pairs(node.children) do v.parent = nil end end - ---Safely cancel a task by ID - ---@param taskId string local function cancelTask(taskId) common.enforceType(taskId, 1, "string") craftLogger:debug("Cancelling task %s", taskId) @@ -858,35 +765,26 @@ return { removeFromArray(readyQueue, task) removeChildrensParents(task) end - if task.type == "ITEM" then - deallocateItems(task.name, task.count, task.taskId) - end - -- if it's not in these two states, then it's not cancellable + if task.type == "ITEM" then deallocateItems(task.name, task.count, task.taskId) end return end taskLookup[taskId] = nil end - ---@type table local pendingJobs = {} - local function savePendingJobs() - if not config.crafting.persistence.value then - return - end + if not config.crafting.persistence.value then return end local flatPendingJobs = {} for jobIndex, job in pairs(pendingJobs) do local clone = shallowClone(job) runOnAll(clone, function(node) node.parent = nil - for k, v in pairs(node.children or {}) do - node.children[k] = shallowClone(v) - end + for k, v in pairs(node.children or {}) do node.children[k] = shallowClone(v) end end) flatPendingJobs[jobIndex] = clone end - local f = assert(fs.open(".cache/pending_jobs.bin", "wb")) - f.write(bfile.serialise(flatPendingJobs)) + local f = assert(fs.open(".cache/pending_jobs.json", "w")) + f.write(json.encode(flatPendingJobs)) f.close() end @@ -895,22 +793,19 @@ return { pendingJobs = {} return end - local f = fs.open(".cache/pending_jobs.bin", "rb") + local f = fs.open(".cache/pending_jobs.json", "r") if f then - pendingJobs = bfile.unserialise(f.readAll() or "") + local contents = f.readAll() or "{}" f.close() - else - pendingJobs = {} - end + local decoded = json.decode(contents) + if type(decoded) == "table" then pendingJobs = decoded + else pendingJobs = {} print("Warning: Invalid pending jobs JSON format") end + else pendingJobs = {} end runOnAll(pendingJobs, function(node) - for k, v in pairs(node.children or {}) do - v.parent = node - end + for k, v in pairs(node.children or {}) do v.parent = node end end) end - ---Cancel a job by given id - ---@param jobId any local function cancelCraft(jobId) common.enforceType(jobId, 1, "string") craftLogger:info("Cancelling job %s", jobId) @@ -923,71 +818,50 @@ return { elseif not jobLookup[jobId] then craftLogger:warn("Attempt to cancel non-existant job %s", jobId) end - for k, v in pairs(jobRoot or {}) do - cancelTask(v.taskId) - end + for k, v in pairs(jobRoot or {}) do cancelTask(v.taskId) end jobLookup[jobId] = nil saveTaskLookup() end - ---Get a list of all running jobIds - ---@return string[] local function listJobs() local runningJobs = {} - for k, v in pairs(jobLookup) do - runningJobs[#runningJobs + 1] = k - end + for k, v in pairs(jobLookup) do runningJobs[#runningJobs + 1] = k end return runningJobs end - ---Get a list of taskIds for a given job local function listTasks(job) local tasks = {} - for k, v in pairs(jobLookup[job]) do - tasks[#tasks + 1] = v.taskId - end + for k, v in pairs(jobLookup[job]) do tasks[#tasks + 1] = v.taskId end return tasks end local function tickCrafting() while true do local nodesTicked = false - for k, v in pairs(taskLookup) do - tickNode(v) - nodesTicked = true - end + for k, v in pairs(taskLookup) do tickNode(v) nodesTicked = true end if nodesTicked then craftLogger:debug("Nodes processed in crafting tick.") saveTaskLookup() end - -- Use default value if config is not properly initialized local sleepTime = 1 if config.crafting and config.crafting.tickInterval and type(config.crafting.tickInterval.value) == "number" then sleepTime = config.crafting.tickInterval.value - else - craftLogger:warn("Using default sleep time for crafting tick (config.crafting.tickInterval.value not available)") - end + else craftLogger:warn("Using default sleep time...") end os.sleep(sleepTime) end end local inventoryTransferLogger - if log then - inventoryTransferLogger = log.interface.logger("crafting", "inventory_transfer_listener") - end + if log then inventoryTransferLogger = log.interface.logger("crafting", "inventory_transfer_listener") end local function inventoryTransferListener() while true do local _, transferId = os.pullEvent("inventoryFinished") - ---@type CraftingNode local node = transferIdTaskLUT[transferId] if node then transferIdTaskLUT[transferId] = nil removeFromArray(node.transfers, transferId) if #node.transfers == 0 then - if log then - inventoryTransferLogger:debug("Node DONE, taskId:%s, jobId:%s", node.taskId, node.jobId) - end - -- all transfers finished + if log then inventoryTransferLogger:debug("Node DONE, taskId:%s, jobId:%s", node.taskId, node.jobId) end changeNodeState(node, "DONE") tickNode(node) end @@ -995,64 +869,19 @@ return { end end - - ---@param name string - ---@param count integer - ---@return JobId pendingJobId local function createCraftJob(name, count) common.enforceType(name, 1, "string") common.enforceType(count, 2, "integer") local jobId = id() - craftLogger:debug("New job. name:%s,count:%u,jobId:%s", name, count, jobId) craftLogger:info("Requested craft for %ux%s", count, name) local job = craft(name, count, jobId, true) - - ---@type CraftingNode - local root = { - jobId = jobId, - children = job, - type = "ROOT", - taskId = id(), - time = os.epoch("utc"), - } - + local root = { jobId = jobId, children = job, type = "ROOT", taskId = id(), time = os.epoch("utc") } pendingJobs[jobId] = root savePendingJobs() - return jobId end - ---@alias jobInfo {success: boolean, toCraft: table, toUse: table, missing: table|nil, jobId: JobId} - - ---Extract information from a job root - ---@param root CraftingNode - ---@return jobInfo - local function getJobInfo(root) - common.enforceType(root, 1, "table") - local ret = {} - ret.success = true - ret.toCraft = {} - ret.toUse = {} - ret.missing = {} - ret.jobId = root.jobId - runOnAll(root, function(node) - if node.type == "ITEM" then - ret.toUse[node.name] = (ret.toUse[node.name] or 0) + node.count - elseif node.type == "MISSING" then - ret.success = false - ret.missing[node.name] = (ret.missing[node.name] or 0) + node.count - elseif node.type ~= "ROOT" then - ret.toCraft[node.name] = (ret.toCraft[node.name] or 0) + (node.count or 0) - end - end) - return ret - end - - ---Request a craft job, returning info about it - ---@param name string - ---@param count integer - ---@return jobInfo local function requestCraft(name, count) common.enforceType(name, 1, "string") common.enforceType(count, 2, "integer") @@ -1061,26 +890,18 @@ return { local jobInfo = getJobInfo(pendingJobs[jobId]) if not jobInfo.success then craftLogger:debug("Craft job failed, cancelling") - -- cancelCraft(jobId) savePendingJobs() end return jobInfo end - ---Start a given job, if it's pending - ---@param jobId JobId - ---@return boolean success local function startCraft(jobId) common.enforceType(jobId, 1, "string") craftLogger:debug("Start craft called for job ID %s", jobId) local job = pendingJobs[jobId] - if not job then - return false - end + if not job then return false end local jobInfo = getJobInfo(job) - if not jobInfo.success then - return false -- cannot start unsuccessful job - end + if not jobInfo.success then return false end pendingJobs[jobId] = nil savePendingJobs() jobLookup[jobId] = {} @@ -1093,145 +914,82 @@ return { return true end - local cleanupLogger = setmetatable({}, { - __index = function() - return function() - end - end - }) - if log then - cleanupLogger = log.interface.logger("crafting", "cleanup") - end + local cleanupLogger = setmetatable({}, { __index = function() return function() end end }) + if log then cleanupLogger = log.interface.logger("crafting", "cleanup") end local function cleanupHandler() while true do - -- Use default value if config is not properly initialized local sleepTime = 60 if config.crafting and config.crafting.cleanupInterval and type(config.crafting.cleanupInterval.value) == "number" then sleepTime = config.crafting.cleanupInterval.value - else - cleanupLogger:warn("Using default sleep time for cleanup handler (config.crafting.cleanupInterval.value not available)") - end + else cleanupLogger:warn("Using default sleep time...") end os.sleep(sleepTime) cleanupLogger:debug("Performing cleanup!") for k, v in pairs(pendingJobs) do - if v.time + 200000 < os.epoch("utc") then - -- this job is too old - cleanupLogger:debug("Removing JobId %s from the pending queue, as it is too old.", v.jobId) - pendingJobs[k] = nil - end + if v.time + 200000 < os.epoch("utc") then pendingJobs[k] = nil end end for k, v in pairs(jobLookup) do - if #v == 0 then - cleanupLogger:debug("No tasks with JobId %s, removing from the lookkup.", k) - jobLookup[k] = nil - end + if #v == 0 then jobLookup[k] = nil end end for name, nodes in pairs(reservedItems) do for nodeId, count in pairs(nodes) do - if not taskLookup[nodeId] then - cleanupLogger:debug("Deallocating %u of item %s, Node %s is not in the task lookup.", count, name, nodeId) - deallocateItems(name, count, nodeId) - end + if not taskLookup[nodeId] then deallocateItems(name, count, nodeId) end end end end end - ---Auto-crafting/smelting functionality - local autoCraftLogger = setmetatable({}, { - __index = function() - return function() - end - end - }) - if log then - autoCraftLogger = log.interface.logger("crafting", "auto_craft") - end + local autoCraftLogger = setmetatable({}, { __index = function() return function() end end }) + if log then autoCraftLogger = log.interface.logger("crafting", "auto_craft") end - ---Check if an item should be auto-crafted based on current inventory count - ---@param name string - ---@return boolean shouldCraft - ---@return integer neededCount local function shouldAutoCraftItem(name) local rules = config.crafting and config.crafting.autoCraftingRules and config.crafting.autoCraftingRules.value or {} local rule = rules[name] if not rule or type(rule) ~= "table" or type(rule.threshold) ~= "number" then return false, 0 end - local currentCount = getCount(name) - if currentCount < rule.threshold then - return true, rule.threshold - currentCount - end + if currentCount < rule.threshold then return true, rule.threshold - currentCount end return false, 0 end - ---Check if an item should be auto-smelted based on current inventory count - ---@param name string - ---@return boolean shouldSmelt - ---@return integer neededCount local function shouldAutoSmeltItem(name) local rules = config.crafting and config.crafting.autoSmeltingRules and config.crafting.autoSmeltingRules.value or {} local rule = rules[name] if not rule or type(rule) ~= "table" or type(rule.threshold) ~= "number" or not rule.output then return false, 0 end - local currentCount = getCount(name) - if currentCount < rule.threshold then - return true, rule.threshold - currentCount - end + if currentCount < rule.threshold then return true, rule.threshold - currentCount end return false, 0 end - ---Check all items and trigger auto-crafting/smelting local function checkAutoCrafting() autoCraftLogger:debug("Checking for auto-crafting/smelting opportunities...") - - -- Check auto-crafting rules with proper null checks local autoCraftingRules = config.crafting and config.crafting.autoCraftingRules and config.crafting.autoCraftingRules.value or {} for item, rule in pairs(autoCraftingRules) do if type(rule) == "table" and type(rule.threshold) == "number" then local shouldCraft, neededCount = shouldAutoCraftItem(item) if shouldCraft then - autoCraftLogger:info("Auto-crafting %u %s(s) (threshold: %u)", neededCount, item, rule.threshold) local jobInfo = requestCraft(item, neededCount) - if jobInfo.success then - startCraft(jobInfo.jobId) - end + if jobInfo.success then startCraft(jobInfo.jobId) end end - else - autoCraftLogger:warn("Invalid auto-crafting rule for item %s", item) - end + else autoCraftLogger:warn("Invalid auto-crafting rule for item %s", item) end end - - -- Check auto-smelting rules with proper null checks local autoSmeltingRules = config.crafting and config.crafting.autoSmeltingRules and config.crafting.autoSmeltingRules.value or {} for item, rule in pairs(autoSmeltingRules) do if type(rule) == "table" and type(rule.threshold) == "number" and rule.output then local shouldSmelt, neededCount = shouldAutoSmeltItem(item) if shouldSmelt then - autoCraftLogger:info("Auto-smelting to produce %u %s(s) (threshold: %u)", neededCount, rule.output, rule.threshold) - -- This would need integration with furnace module - -- For now, we'll just request crafting of the output item local jobInfo = requestCraft(rule.output, neededCount) - if jobInfo.success then - startCraft(jobInfo.jobId) - end + if jobInfo.success then startCraft(jobInfo.jobId) end end - else - autoCraftLogger:warn("Invalid auto-smelting rule for item %s", item) - end + else autoCraftLogger:warn("Invalid auto-smelting rule for item %s", item) end end end - ---Auto-crafting/smelting checker loop local function autoCraftChecker() while true do - -- Use default value if config is not properly initialized local sleepTime = 10 if config.crafting and config.crafting.tickInterval and type(config.crafting.tickInterval.value) == "number" then sleepTime = config.crafting.tickInterval.value * 10 - else - autoCraftLogger:warn("Using default sleep time for auto-craft checker (config.crafting.tickInterval.value not available)") - end - sleep(sleepTime) -- Check every 10 crafting ticks (or default) + else autoCraftLogger:warn("Using default sleep time...") end + sleep(sleepTime) checkAutoCrafting() end end @@ -1242,16 +1000,11 @@ return { local e, transfer = os.pullEvent("file_transfer") for _, file in ipairs(transfer.getFiles()) do local contents = file.readAll() - local json = textutils.unserialiseJSON(contents) + local json = json.decode(contents) if type(json) == "table" then - if loadJson(json) then - print(("Successfully imported %s"):format(file.getName())) - else - print(("Failed to import %s, no handler for %s"):format(file.getName(), json.type)) - end - else - print(("Failed to import %s, not a JSON file"):format(file.getName())) - end + if loadJson(json) then print(("Successfully imported %s"):format(file.getName())) + else print(("Failed to import %s, no handler for %s"):format(file.getName(), json.type)) end + else print(("Failed to import %s, not a JSON file"):format(file.getName())) end file.close() end end @@ -1265,9 +1018,9 @@ return { loadReservedItems() loadCachedTags() loadPendingJobs() + loadAliases() -- Load the tags/aliases from recipes.json on start parallel.waitForAny(tickCrafting, inventoryTransferListener, jsonFileImport, cleanupHandler, autoCraftChecker) end, - requestCraft = requestCraft, startCraft = startCraft, loadJson = loadJson, @@ -1275,7 +1028,6 @@ return { cancelCraft = cancelCraft, listJobs = listJobs, listTasks = listTasks, - recipeInterface = { changeNodeState = changeNodeState, tickNode = tickNode, @@ -1297,4 +1049,4 @@ return { } } end -} +} \ No newline at end of file diff --git a/modules/disposal.lua b/modules/disposal.lua index 5cc6b75..2647825 100644 --- a/modules/disposal.lua +++ b/modules/disposal.lua @@ -47,7 +47,15 @@ return { local function updateDisposalThresholds() disposalThresholds = {} for item, threshold in pairs(config.disposal.disposalItems.value) do - disposalThresholds[item] = threshold + if type(item) ~= "string" or type(threshold) ~= "number" then + disposalLogger:warn( + "Ignoring malformed disposalItems entry (expected [string]=number, got [%s]=%s). " .. + "Check that disposal.disposalItems is configured as a table, not an array.", + type(item), type(threshold) + ) + else + disposalThresholds[item] = threshold + end end end @@ -75,18 +83,27 @@ return { ---@param count integer ---@return boolean success local function directDisposalHandler(name, count) - disposalLogger:info("Using direct disposal for %u %s(s)", count, name) + -- RE-VERIFY: Check current stock right before pushing + local currentCount = inventory.getCount(name) + local threshold = disposalThresholds[name] or 0 + + -- Ensure we don't try to move more than exists or dip below threshold + local safeCount = math.min(count, currentCount - threshold) + + if safeCount <= 0 then + disposalLogger:debug("Aborting disposal for %s: count changed during execution", name) + return false + end + + disposalLogger:info("Using direct disposal for %u %s(s)", safeCount, name) - -- Try to find a disposal inventory using the configured patterns local disposalInv = nil local patterns = config.disposal.disposalPatterns.value - disposalLogger:debug("Looking for disposal inventories with patterns: %s", table.concat(patterns, ", ")) for _, invName in pairs(getAttachedInventories()) do for _, pattern in ipairs(patterns) do if invName:find(pattern) then disposalInv = invName - disposalLogger:info("Found disposal inventory: %s (matched pattern: %s)", invName, pattern) break end end @@ -94,20 +111,18 @@ return { end if not disposalInv then - disposalLogger:warn("No disposal inventory found matching any patterns: %s", table.concat(patterns, ", ")) + disposalLogger:warn("No disposal inventory found matching patterns") return false end - -- Push items directly from abstract storage to the disposal inventory - -- storage is the abstractInvLib instance behind inventory.interface - local pushed = inventory.pushItems(false, disposalInv, name, count) + -- Use the safeCount instead of the original count + local pushed = inventory.pushItems(false, disposalInv, name, safeCount) if pushed > 0 then disposalLogger:info("Disposed %u %s(s) to %s", pushed, name, disposalInv) return true end - disposalLogger:warn("Direct disposal failed for %u %s(s) (nothing pushed)", count, name) return false end @@ -117,6 +132,11 @@ return { ---@return boolean shouldDispose ---@return integer excessCount local function shouldDisposeItem(name) + if type(name) ~= "string" then + disposalLogger:warn("shouldDisposeItem called with non-string name (%s); skipping", type(name)) + return false, 0 + end + local threshold = disposalThresholds[name] if not threshold then return false, 0 end @@ -153,8 +173,11 @@ return { for item, threshold in pairs(disposalThresholds) do local shouldDispose, excessCount = shouldDisposeItem(item) if shouldDispose then - disposalLogger:info("Found %u excess %s(s) to dispose (threshold: %u)", excessCount, item, threshold) - requestDisposal(item, excessCount) + -- pcall prevents the module from crashing if the library throws an error + local ok, err = pcall(requestDisposal, item, excessCount) + if not ok then + disposalLogger:error("Error during disposal of %s: %s", item, err) + end end end end @@ -215,4 +238,4 @@ return { } } end -} \ No newline at end of file +} diff --git a/modules/furnace.lua b/modules/furnace.lua index 7a65f44..56d978f 100644 --- a/modules/furnace.lua +++ b/modules/furnace.lua @@ -1,247 +1,242 @@ --- Furnace crafting recipe handler -- 2 laptops from an AI cluster were sacrificed in fixing of this code +local json = require("lib/json") ---@class modules.furnace return { - id = "furnace", - version = "0.0.0", - config = { - fuels = { - type = "table", - description = "List of fuels table", - default = { ["minecraft:coal"] = { smelts = 8 }, ["minecraft:charcoal"] = { smelts = 8 } } - }, - checkFrequency = { - type = "number", - description = "Time in seconds to wait between checking each furnace", - default = 5 - } + id = "furnace", + version = "0.0.1", + config = { + fuels = { + type = "table", + description = "List of fuels table", + default = { ["minecraft:coal"] = { smelts = 8 }, ["minecraft:charcoal"] = { smelts = 8 } } }, - dependencies = { - logger = { min = "1.1", optional = true }, - crafting = { min = "1.4" }, - inventory = { min = "1.2" } - }, - ---@param loaded {crafting: modules.crafting, logger: modules.logger|nil, inventory: modules.inventory} - init = function(loaded, config) - local crafting = loaded.crafting.interface.recipeInterface - ---@type table output->input - local recipes = {} - - local bfile = require("bfile") - local structFurnaceRecipe = bfile.newStruct("furnace_recipe"):add("string", "output"):add("uint16", "input") - - local function updateCraftableList() - local list = {} - for k, v in pairs(recipes) do - table.insert(list, k) - end - crafting.addCraftableList("furnace", list) - end + checkFrequency = { + type = "number", + description = "Time in seconds to wait between checking each furnace", + default = 5 + } + }, + dependencies = { + logger = { min = "1.1", optional = true }, + crafting = { min = "1.4" }, + inventory = { min = "1.2" } + }, + ---@param loaded {crafting: modules.crafting, logger: modules.logger|nil, inventory: modules.inventory} + init = function(loaded, config) + local crafting = loaded.crafting.interface.recipeInterface + ---@type table output->input + local recipes = {} + + local function updateCraftableList() + local list = {} + for k, v in pairs(recipes) do + table.insert(list, k) + end + crafting.addCraftableList("furnace", list) + end - local function saveFurnaceRecipes() - local f = assert(fs.open("recipes/furnace_recipes.bin", "wb")) - f.write("FURNACE0") -- "versioned" - for k, v in pairs(recipes) do - structFurnaceRecipe:writeHandle(f, { - input = crafting.getOrCacheString(v), - output = k - }) + local function loadFurnaceRecipes() + local f = fs.open("recipes/recipes.json", "r") + if f then + local contents = f.readAll() or "{}" + f.close() + local decoded = json.decode(contents) + if type(decoded) == "table" and decoded.recipes and decoded.recipes.furnace then + for _, recipe in ipairs(decoded.recipes.furnace) do + if recipe.type == "minecraft:smelting" then + recipes[recipe.result] = recipe.ingredient end - f.close() - updateCraftableList() + end end + end + updateCraftableList() + end - local function loadFurnaceRecipes() - local f = fs.open("recipes/furnace_recipes.bin", "rb") - if not f then - recipes = {} - return - end - assert(f.read(8) == "FURNACE0", "Invalid furnace recipe file.") - while f.read(1) do - f.seek(nil, -1) - local recipeInfo = structFurnaceRecipe:readHandle(f) - _, recipes[recipeInfo.output] = crafting.getBestItem(recipeInfo.input) - end - f.close() - updateCraftableList() + local function jsonTypeHandler(json) + local input = json.ingredient.item + local output = json.result + recipes[output] = input + updateCraftableList() + end + crafting.addJsonTypeHandler("minecraft:smelting", jsonTypeHandler) + + ---Get a fuel for an item, and how many items is optimal if toSmelt is provided + ---@param toSmelt integer? ensure there's enough of this fuel to smelt this many items + ---@return string fuel + ---@return integer multiple + ---@return integer optimal + local function getFuel(toSmelt) + ---@type {diff:integer,fuel:string,optimal:integer,multiple:integer}[] + local fuelDiffs = {} + for k, v in pairs(config.furnace.fuels.value) do + -- measure the difference in terms of + -- how far off the closest multiple of the fuel is from the desired amount + local multiple = v.smelts + local optimal = math.ceil((toSmelt or 0) / multiple) * multiple + if loaded.inventory.interface.getCount(k) >= optimal / multiple then + fuelDiffs[#fuelDiffs + 1] = { + diff = optimal - toSmelt, + optimal = optimal, + fuel = k, + multiple = multiple + } end + end + table.sort(fuelDiffs, function(a, b) + return a.diff < b.diff + end) + -- Fix: Handle case where no fuel is found in inventory + if #fuelDiffs == 0 then + return nil, nil, toSmelt + end + -- TODO: Replace this hack with a proper optimizer that respects what is in storage. + return fuelDiffs[1].fuel, fuelDiffs[1].multiple, toSmelt -- fuelDiffs[1].optimal + end - local function jsonTypeHandler(json) - local input = json.ingredient.item - local output = json.result - recipes[output] = input - saveFurnaceRecipes() - end - crafting.addJsonTypeHandler("minecraft:smelting", jsonTypeHandler) - - ---Get a fuel for an item, and how many items is optimal if toSmelt is provided - ---@param toSmelt integer? ensure there's enough of this fuel to smelt this many items - ---@return string fuel - ---@return integer multiple - ---@return integer optimal - local function getFuel(toSmelt) - ---@type {diff:integer,fuel:string,optimal:integer,multiple:integer}[] - local fuelDiffs = {} - for k, v in pairs(config.furnace.fuels.value) do - -- measure the difference in terms of - -- how far off the closest multiple of the fuel is from the desired amount - local multiple = v.smelts - local optimal = math.ceil((toSmelt or 0) / multiple) * multiple - if loaded.inventory.interface.getCount(k) >= optimal / multiple then - fuelDiffs[#fuelDiffs + 1] = { - diff = optimal - toSmelt, - optimal = optimal, - fuel = k, - multiple = multiple - } - end - end - table.sort(fuelDiffs, function(a, b) - return a.diff < b.diff - end) - -- TODO: Replace this hack with a proper optimizer that respects what is in storage. - return fuelDiffs[1].fuel, fuelDiffs[1].multiple, toSmelt -- fuelDiffs[1].optimal - end + ---@class FurnaceNode : CraftingNode + ---@field type "furnace" + ---@field done integer count smelted + ---@field multiple integer fuel multiple + ---@field fuel string + ---@field ingredient string + ---@field smelting table amount to smelt in each furnace + ---@field fuelNeeded table amount of fuel each furnace requires + ---@field hasBucket boolean + + ---@type string[] + local attachedFurnaces = {} + for _, v in ipairs(peripheral.getNames()) do + if peripheral.hasType(v, "minecraft:furnace") then + attachedFurnaces[#attachedFurnaces + 1] = v + end + end - ---@class FurnaceNode : CraftingNode - ---@field type "furnace" - ---@field done integer count smelted - ---@field multiple integer fuel multiple - ---@field fuel string - ---@field ingredient string - ---@field smelting table amount to smelt in each furnace - ---@field fuelNeeded table amount of fuel each furnace requires - ---@field hasBucket boolean - - ---@type string[] - local attachedFurnaces = {} - for _, v in ipairs(peripheral.getNames()) do - if peripheral.hasType(v, "minecraft:furnace") then - attachedFurnaces[#attachedFurnaces + 1] = v - end - end + ---@param node FurnaceNode + ---@param name string + ---@param count integer + ---@param requestChain table Do not modify, just pass through to calls to craft + ---@return boolean + local function craftType(node, name, count, requestChain) + local requires = recipes[name] + if not requires then return false end + + local fuel, multiple = getFuel(count) + if not fuel then + -- Optional: Log that no fuel was found + return false + end + + node.type = "furnace" + node.count = count + node.done = 0 + node.ingredient = requires + node.fuel = fuel + node.multiple = multiple + node.smelting = {} + node.fuelNeeded = {} + + node.children = crafting.craft(requires, count, node.jobId, nil, requestChain) + node.children = crafting.craft(fuel, math.ceil(count / multiple), node.jobId, false, requestChain) + + return true + end - ---@param node FurnaceNode - ---@param name string - ---@param count integer - ---@param requestChain table Do not modify, just pass through to calls to craft - ---@return boolean - local function craftType(node, name, count, requestChain) - local requires = recipes[name] - if not requires then return false end - - local fuel, multiple = getFuel(count) - node.type = "furnace" - node.count = count - node.done = 0 - node.ingredient = requires - node.fuel = fuel - node.multiple = multiple - node.smelting = {} - node.fuelNeeded = {} - - node.children = crafting.craft(requires, count, node.jobId, nil, requestChain) - node.children = crafting.craft(fuel, math.ceil(count / multiple), node.jobId, false, requestChain) - - return true + crafting.addCraftType("furnace", craftType) + + + ---@type table + local smelting = {} + + ---@param node FurnaceNode + local function readyHandler(node) + local usedFurances = {} + local remaining = node.count + if #attachedFurnaces > 0 then + local furnaceIndex = 1 + while remaining > 0 and furnaceIndex <= #attachedFurnaces do + local furnace = attachedFurnaces[furnaceIndex] + usedFurances[furnaceIndex] = true + local toAssign = math.min(node.multiple, remaining) + local fuelNeeded = math.ceil(toAssign / node.multiple) + local absFurnace = require("abstractInvLib")({ furnace }) + local fmoved = loaded.inventory.interface.pushItems(false, absFurnace, node.fuel, fuelNeeded, 2) + local moved = loaded.inventory.interface.pushItems(false, absFurnace, node.ingredient, toAssign, 1) + node.smelting[furnace] = (node.smelting[furnace] or 0) + toAssign - moved + node.fuelNeeded[furnace] = (node.fuelNeeded[furnace] or 0) + fuelNeeded - fmoved + node.hasBucket = true + remaining = remaining - toAssign + furnaceIndex = furnaceIndex + 1 end - - crafting.addCraftType("furnace", craftType) - - - ---@type table - local smelting = {} - - ---@param node FurnaceNode - local function readyHandler(node) - local usedFurances = {} - local remaining = node.count - if #attachedFurnaces > 0 then - local furnaceIndex = 1 - while remaining > 0 and furnaceIndex <= #attachedFurnaces do - local furnace = attachedFurnaces[furnaceIndex] - usedFurances[furnaceIndex] = true - local toAssign = math.min(node.multiple, remaining) - local fuelNeeded = math.ceil(toAssign / node.multiple) - local absFurnace = require("abstractInvLib")({ furnace }) - local fmoved = loaded.inventory.interface.pushItems(false, absFurnace, node.fuel, fuelNeeded, 2) - local moved = loaded.inventory.interface.pushItems(false, absFurnace, node.ingredient, toAssign, 1) - node.smelting[furnace] = (node.smelting[furnace] or 0) + toAssign - moved - node.fuelNeeded[furnace] = (node.fuelNeeded[furnace] or 0) + fuelNeeded - fmoved - node.hasBucket = true - remaining = remaining - toAssign - furnaceIndex = furnaceIndex + 1 - end - local ordered = {} - for k, v in pairs(usedFurances) do - ordered[#ordered + 1] = k - end - table.sort(ordered) - for i = #ordered, 1, -1 do - table.remove(attachedFurnaces, ordered[i]) - end - crafting.changeNodeState(node, "CRAFTING") - smelting[node] = node - end + local ordered = {} + for k, v in pairs(usedFurances) do + ordered[#ordered + 1] = k end - crafting.addReadyHandler("furnace", readyHandler) + table.sort(ordered) + for i = #ordered, 1, -1 do + table.remove(attachedFurnaces, ordered[i]) + end + crafting.changeNodeState(node, "CRAFTING") + smelting[node] = node + end + end + crafting.addReadyHandler("furnace", readyHandler) - local function craftingHandler(node) + local function craftingHandler(node) + end + crafting.addCraftingHandler("furnace", craftingHandler) + + ---@param node FurnaceNode + local function checkNodeFurnaces(node) + for furnace, remaining in pairs(node.smelting) do + local absFurnace = require("abstractInvLib")({ furnace }) + local crafted = loaded.inventory.interface.pullItems(false, absFurnace, 3) + node.done = node.done + crafted + if config.furnace.fuels.value[node.fuel].bucket and node.hasBucket then + local i = loaded.inventory.interface.pullItems(false, absFurnace, 2) + if i > 0 then + node.hasBucket = false + end end - crafting.addCraftingHandler("furnace", craftingHandler) - - ---@param node FurnaceNode - local function checkNodeFurnaces(node) - for furnace, remaining in pairs(node.smelting) do - local absFurnace = require("abstractInvLib")({ furnace }) - local crafted = loaded.inventory.interface.pullItems(false, absFurnace, 3) - node.done = node.done + crafted - if config.furnace.fuels.value[node.fuel].bucket and node.hasBucket then - local i = loaded.inventory.interface.pullItems(false, absFurnace, 2) - if i > 0 then - node.hasBucket = false - end - end - if remaining > 0 then - local amount = loaded.inventory.interface.pushItems(false, absFurnace, node.ingredient, remaining, 1) - node.smelting[furnace] = remaining - amount - end - if node.fuelNeeded[furnace] > 0 then - local famount = loaded.inventory.interface.pushItems(false, absFurnace, node.fuel, - node.fuelNeeded[furnace], 2) - if famount == 0 and config.furnace.fuels.value[node.fuel].bucket then - -- remove the bucket - loaded.inventory.interface.pullItems(true, absFurnace, 2) - end - node.fuelNeeded[furnace] = node.fuelNeeded[furnace] - famount - end - end - if node.done == node.count then - crafting.changeNodeState(node, "DONE") - for furnace in pairs(node.smelting) do - table.insert(attachedFurnaces, furnace) - end - smelting[node] = nil - end - + if remaining > 0 then + local amount = loaded.inventory.interface.pushItems(false, absFurnace, node.ingredient, remaining, 1) + node.smelting[furnace] = remaining - amount end - - local function furnaceChecker() - while true do - sleep(config.furnace.checkFrequency.value) - for node in pairs(smelting) do - checkNodeFurnaces(node) - end - end + if node.fuelNeeded[furnace] > 0 then + local famount = loaded.inventory.interface.pushItems(false, absFurnace, node.fuel, + node.fuelNeeded[furnace], 2) + if famount == 0 and config.furnace.fuels.value[node.fuel].bucket then + -- remove the bucket + loaded.inventory.interface.pullItems(true, absFurnace, 2) + end + node.fuelNeeded[furnace] = node.fuelNeeded[furnace] - famount end + end + if node.done == node.count then + crafting.changeNodeState(node, "DONE") + for furnace in pairs(node.smelting) do + table.insert(attachedFurnaces, furnace) + end + smelting[node] = nil + end - return { - start = function() - loadFurnaceRecipes() - furnaceChecker() - end - } end + + local function furnaceChecker() + while true do + sleep(config.furnace.checkFrequency.value) + for node in pairs(smelting) do + checkNodeFurnaces(node) + end + end + end + + return { + start = function() + loadFurnaceRecipes() + furnaceChecker() + end + } + end } \ No newline at end of file diff --git a/modules/grid.lua b/modules/grid.lua index 3159d94..7bb87c8 100644 --- a/modules/grid.lua +++ b/modules/grid.lua @@ -1,9 +1,11 @@ --- Grid crafting recipe handler local common = require("common") +local json = require("lib/json") + ---@class modules.grid return { id = "grid", - version = "1.1.7", + version = "1.4.5", config = { port = { type = "number", @@ -18,11 +20,12 @@ return { }, dependencies = { logger = { min = "1.1", optional = true }, - crafting = { min = "1.1" }, + crafting = { min = "1.4" }, interface = { min = "1.4" } }, ---@param loaded {crafting: modules.crafting, logger: modules.logger|nil} init = function(loaded, config) + ---@alias RecipeEntry ItemIndex|ItemIndex[] ---@class GridRecipe @@ -34,80 +37,126 @@ return { ---@field name string ---@field requires table - ---@type table + ---@type table local gridRecipes = {} - ---This node represents a grid crafting recipe - ---@class GridNode : CraftingNode - ---@field type "CG" - ---@field toCraft integer - ---@field plan table - local crafting = loaded.crafting.interface.recipeInterface - - ---Cache information about a GridRecipe that can be inferred from stored data - ---@param recipe GridRecipe - local function cacheAdditional(recipe) - recipe.requires = {} - for k, v in ipairs(recipe) do - if recipe.shaped then - for row, i in ipairs(v) do - local old = recipe.requires[i] - recipe.requires[i] = (old or 0) + 1 + + ---Save the current grid recipes to the recipes file + local function saveGridRecipes() + local data = { + recipes = { + crafting = {} + } + } + + -- Convert gridRecipes back to crafting format + for itemName, recipes in pairs(gridRecipes) do + for _, recipe in ipairs(recipes) do + local craftingRecipe = { + type = recipe.shaped and "minecraft:crafting_shaped" or "minecraft:crafting_shapeless", + result = { + item = itemName, + count = recipe.produces + } + } + + if recipe.shaped then + craftingRecipe.pattern = {} + craftingRecipe.key = {} + + -- Convert grid recipe to pattern format. + -- Grid recipes store only their actual pattern cells (unpadded), so + -- iterate the real cell count instead of assuming a 3x3 grid. + local width = recipe.width or 3 + local keys = {} + local keyChars = { "A", "B", "C", "D", "E", "F", "G", "H", "I" } + local keyIndex = 1 + + for i = 1, #recipe.recipe do + local ingredient = recipe.recipe[i] + if ingredient == 0 then + table.insert(craftingRecipe.pattern, " ") + else + -- Handle multiple ingredient options + if type(ingredient) == "table" then + local options = {} + for _, itemIndex in ipairs(ingredient) do + local itemName = crafting.getString(itemIndex) + table.insert(options, itemName) + end + local keyChar = keyChars[keyIndex] + keys[keyChar] = options + table.insert(craftingRecipe.pattern, keyChar) + keyIndex = keyIndex + 1 + else + local itemName = crafting.getString(ingredient) + local keyChar = keyChars[keyIndex] + keys[keyChar] = itemName + table.insert(craftingRecipe.pattern, keyChar) + keyIndex = keyIndex + 1 + end + end + end + + -- Format pattern into rows using the stored shape width + local formattedPattern = {} + for start = 1, #craftingRecipe.pattern, width do + local row = {} + for j = 1, width do + table.insert(row, craftingRecipe.pattern[start + j - 1] or "") + end + table.insert(formattedPattern, table.concat(row)) + end + craftingRecipe.pattern = formattedPattern + craftingRecipe.key = keys + else + -- Shapeless recipe + craftingRecipe.ingredients = {} + for _, ingredient in ipairs(recipe.recipe) do + if ingredient ~= 0 then + if type(ingredient) == "table" then + -- Multiple options + local options = {} + for _, itemIndex in ipairs(ingredient) do + table.insert(options, (crafting.getString(itemIndex))) + end + table.insert(craftingRecipe.ingredients, options) + else + table.insert(craftingRecipe.ingredients, (crafting.getString(ingredient))) + end + end + end end - else - local i = recipe.requires[v] - recipe.requires[v] = (i or 0) + 1 + + table.insert(data.recipes.crafting, craftingRecipe) end end - end - - local bfile = require("bfile") - bfile.newStruct("grid_recipe_shaped"):add("uint8", "produces"):add("string", "name"):add("uint8", "width"):add( - "uint8", "height") - bfile.newStruct("grid_recipe_unshaped"):add("uint8", "produces"):add("string", "name"):add("uint8", "length") - bfile.addType("grid_recipe_part", function(f) - local ch = f.read(1) - if ch == "S" then - return bfile.getReader("uint16")(f) - elseif ch == "A" then - return bfile.getReader("uint16[uint8]")(f) - end - error("Grid recipe parse error") - end, function(f, value) - if type(value) == "table" then - f.write("A") - bfile.getWriter("uint16[uint8]")(f, value) - return + + -- Ensure recipes directory exists + if not fs.exists("recipes") then + fs.makeDir("recipes") end - f.write("S") - bfile.getWriter("uint16")(f, value) - end) - bfile.newStruct("grid_recipe"):conditional("^", function(ch) - if ch == "S" then - return "grid_recipe_shaped" - elseif ch == "U" then - return "grid_recipe_unshaped" + + local f = fs.open("recipes/recipes.json", "w") + if f then + f.write(json.encode(data)) + f.close() end - error("Grid recipe parse error") - end, function(value) - if value.shaped then - return "S", "grid_recipe_shaped" - end - return "U", "grid_recipe_unshaped" - end) + end - ---Save the grid recipes to a file - local function saveGridRecipes() - local f = assert(fs.open("recipes/grid_recipes.bin", "wb")) - f.write("GRECIPES") - for k, v in pairs(gridRecipes) do - bfile.getStruct("grid_recipe"):writeHandle(f, v) - for _, i in ipairs(v.recipe) do - bfile.getWriter("grid_recipe_part")(f, i) + + ---Cache information about a GridRecipe that can be inferred from stored data + ---@param recipe GridRecipe + local function cacheAdditional(recipe) + recipe.requires = {} + for k, v in ipairs(recipe.recipe) do + -- v can be an integer (ItemIndex) or a table (array of ItemIndex options) + if type(v) == "number" and v ~= 0 then + local key = tostring(v) + recipe.requires[key] = (recipe.requires[key] or 0) + 1 end end - f.close() end local function updateCraftableList() @@ -119,10 +168,6 @@ return { end ---Add a grid recipe manually - ---@param name string - ---@param produces integer - ---@param recipe string[] table of ITEM NAMES, this does NOT support tags. Shaped recipes are assumed 3x3. Nil is assumed empty space. - ---@param shaped boolean local function addGridRecipe(name, produces, recipe, shaped) common.enforceType(name, 1, "string") common.enforceType(produces, 2, "integer") @@ -146,49 +191,123 @@ return { table.insert(gridRecipe.recipe, crafting.getOrCacheString(v)) end end - gridRecipes[name] = gridRecipe cacheAdditional(gridRecipe) - saveGridRecipes() + + -- Store as list to support multiple recipes (e.g. Stick from Planks OR Bamboo) + if not gridRecipes[name] then gridRecipes[name] = {} end + table.insert(gridRecipes[name], gridRecipe) + updateCraftableList() + saveGridRecipes() -- Save recipes to file end ---Remove a grid recipe - ---@param name string - ---@return boolean success local function removeGridRecipe(name) common.enforceType(name, 1, "string") if gridRecipes[name] then gridRecipes[name] = nil + updateCraftableList() + saveGridRecipes() -- Save recipes to file return true end - saveGridRecipes() return false end ---Load the grid recipes from a file local function loadGridRecipes() - local f = fs.open("recipes/grid_recipes.bin", "rb") - if not f then - gridRecipes = {} - updateCraftableList() - return - end - assert(f.read(8) == "GRECIPES", "Invalid grid recipe file.") - local shapeIndicator = f.read(1) - while shapeIndicator do - f.seek(nil, -1) - local recipe = bfile.getStruct("grid_recipe"):readHandle(f) - recipe.shaped = not recipe.length - recipe.recipe = {} - for i = 1, recipe.length or (recipe.width * recipe.height) do - recipe.recipe[i] = bfile.getReader("grid_recipe_part")(f) + if not fs.exists("recipes/recipes.json") then return end + + local f = fs.open("recipes/recipes.json", "r") + if f then + local contents = f.readAll() or "{}" + f.close() + + local status, decoded = pcall(json.decode, contents) + if not status then + print("Error decoding recipes.json: " .. tostring(decoded)) + return + end + + if type(decoded) == "table" and decoded.recipes and decoded.recipes.crafting then + + local function parseItemString(str) + local name = str + local isTag = false + if type(name) == "string" and name:sub(1, 1) == "#" then + name = name:sub(2) + isTag = true + end + return crafting.getOrCacheString(name, isTag) + end + + local function parseIngredient(raw) + if type(raw) == "table" then + local options = {} + for _, v in pairs(raw) do + table.insert(options, parseItemString(v)) + end + return options + else + return parseItemString(raw) + end + end + + for _, recipe in ipairs(decoded.recipes.crafting) do + if (recipe.type == "minecraft:crafting_shaped" or recipe.type == "minecraft:crafting_shapeless") + and recipe.result and recipe.result.item then + + local recipeName = recipe.result.item + local count = recipe.result.count or 1 + + local gridRecipe = {} + gridRecipe.shaped = (recipe.type == "minecraft:crafting_shaped") + gridRecipe.produces = count + gridRecipe.name = recipeName + gridRecipe.recipe = {} + + local valid = true + + if gridRecipe.shaped then + if not recipe.pattern or type(recipe.key) ~= "table" then + valid = false + else + gridRecipe.width = recipe.pattern[1]:len() + gridRecipe.height = #recipe.pattern + + local keys = { [" "] = 0 } + for char, value in pairs(recipe.key) do + keys[char] = parseIngredient(value) + end + + for row, rowString in ipairs(recipe.pattern) do + for i = 1, rowString:len() do + local char = rowString:sub(i, i) + table.insert(gridRecipe.recipe, keys[char] or 0) + end + end + end + else + if not recipe.ingredients then + valid = false + else + gridRecipe.length = #recipe.ingredients + for _, ingredient in ipairs(recipe.ingredients) do + table.insert(gridRecipe.recipe, parseIngredient(ingredient)) + end + end + end + + if valid then + cacheAdditional(gridRecipe) + -- Append to list instead of overwriting + if not gridRecipes[recipeName] then gridRecipes[recipeName] = {} end + table.insert(gridRecipes[recipeName], gridRecipe) + end + end + end end - gridRecipes[recipe.name] = recipe - cacheAdditional(recipe) - shapeIndicator = f.read(1) end updateCraftableList() - f.close() end @@ -197,7 +316,6 @@ return { ---@field task nil|GridNode ---@field state "READY" | "ERROR" | "BUSY" | "CRAFTING" | "DONE" - local attachedTurtles = {} local modem = assert(peripheral.wrap(config.modem.modem.value), "Bad modem specified.") modem.open(config.grid.port.value) @@ -245,9 +363,11 @@ return { end, NEW_RECIPE = function(message) addGridRecipe(message.name, message.amount, message.recipe, message.shaped) + saveGridRecipes() -- Save recipes to file end, REMOVE_RECIPE = function(message) removeGridRecipe(message.name) + saveGridRecipes() -- Save recipes to file end } @@ -319,50 +439,102 @@ return { end end - ---comment ---@param node GridRecipe ---@param name string ---@param count integer ---@param requestChain table Do not modify, just pass through to calls to craft ---@return boolean local function craftType(node, name, count, requestChain) - -- attempt to craft this - local recipe = gridRecipes[name] - if not recipe then - return false + local recipes = gridRecipes[name] + if not recipes then return false end + + -- Helper to verify if a recipe plan is valid using simulation + local function tryRecipe(recipe) + local toCraft = math.ceil(count / recipe.produces) + local plan = {} + + -- 1. Resolve ingredients (check Tags/Lists) + for k, v in pairs(recipe.recipe) do + if v ~= 0 then + local success, itemName = crafting.getBestItem(v) + plan[k] = {} + if success then + plan[k].name = itemName + plan[k].max = crafting.getStackSize(plan[k].name) + toCraft = math.min(toCraft, plan[k].max) + else + -- If we can't even resolve the item (e.g. tag empty), fail immediately + return false + end + end + end + + -- 2. Simulate the full craft to ensure deep dependencies exist + -- (e.g. check if we have Logs for the Planks for the Sticks) + local simChain = { isSimulation = true } + for k,v in pairs(requestChain) do simChain[k] = v end + + for k, v in pairs(plan) do + -- Simulate asking for 'toCraft' amount of this ingredient + -- We multiply by 1 because getBestItem resolved a single unit, but here we need 'toCraft' + -- Actually, v matches the slot. If multiple slots use same item, we need total. + -- But simplistic check: can we craft ONE set of ingredients? + local nodes = crafting.craft(v.name, toCraft, node.jobId, nil, simChain) + + -- If the simulation returns ANY missing node, this recipe path is invalid + for _, n in ipairs(nodes) do + if n.type == "MISSING" then return false end + end + end + + return true, plan, toCraft end - node.type = "grid" - -- find out how many times we need to craft this recipe - local toCraft = math.ceil(count / recipe.produces) - -- this is the minimum amount we'd need to craft to produce enough of the requested item - -- now we need to find the smallest stack-size of the ingredients - ---@type table - local plan = {} - for k, v in pairs(recipe.recipe) do - if v ~= 0 then - local success, itemName = crafting.getBestItem(v) - plan[k] = {} + + -- Iterate all recipes for this item (e.g. Sticks from Planks, Sticks from Bamboo) + local bestPlan, bestToCraft, bestRecipe + + for _, recipe in ipairs(recipes) do + local success, plan, toCraft = tryRecipe(recipe) if success then - plan[k].name = itemName - -- We can only craft as many items as the smallest stack size allows us to - plan[k].max = crafting.getStackSize(plan[k].name) - toCraft = math.min(toCraft, plan[k].max) - else - plan[k].tag = itemName + bestPlan = plan + bestToCraft = toCraft + bestRecipe = recipe + break -- Found a working recipe! end - end end - node.plan = plan - node.toCraft = toCraft - node.width = recipe.width - node.height = recipe.height + + -- If no recipe worked, fallback to the first one (so the user sees "Missing: Bamboo" instead of nothing) + if not bestRecipe then + bestRecipe = recipes[1] + local toCraft = math.ceil(count / bestRecipe.produces) + bestPlan = {} + bestToCraft = toCraft + for k, v in pairs(bestRecipe.recipe) do + if v ~= 0 then + local success, itemName = crafting.getBestItem(v) + bestPlan[k] = {} + if success then + bestPlan[k].name = itemName + bestPlan[k].max = crafting.getStackSize(bestPlan[k].name) + bestToCraft = math.min(bestToCraft, bestPlan[k].max) + else + bestPlan[k].tag = itemName + end + end + end + end + + node.plan = bestPlan + node.toCraft = bestToCraft + node.width = bestRecipe.width + node.height = bestRecipe.height node.children = {} node.name = name + node.type = "grid" -- Re-added missing type assignment local requiredItemCounts = {} - for k, v in pairs(plan) do - v.count = toCraft + for k, v in pairs(bestPlan) do + v.count = bestToCraft if v.tag then - -- this is a tag we could not resolve, so make a placeholder node table.insert(node.children, crafting.createMissingNode(v.tag, v.count, node.jobId)) else requiredItemCounts[v.name] = (requiredItemCounts[v.name] or 0) + v.count @@ -374,13 +546,12 @@ return { for k, v in pairs(node.children) do v.parent = node end - node.count = toCraft * recipe.produces + node.count = bestToCraft * bestRecipe.produces return true end crafting.addCraftType("grid", craftType) local function readyHandler(node) - -- check if there is a turtle available to craft this recipe local availableTurtle for k, v in pairs(attachedTurtles) do if v.state == "READY" then @@ -412,72 +583,10 @@ return { end crafting.addReadyHandler("grid", readyHandler) - local function jsonTypeHandler(json) - local recipe = {} - local recipeName - recipe.shaped = json.type == "minecraft:crafting_shaped" - recipeName = json.result.item - recipe.produces = json.result.count or 1 - if json.type == "minecraft:crafting_shapeless" then - recipe.recipe = {} - recipe.length = #json.ingredients - for k, v in pairs(json.ingredients) do - local name = v.item or v.tag - local isTag = not not v.tag - if not (name) then - local array = {} - for _, opt in pairs(v) do - name = opt.item or opt.tag - table.insert(array, crafting.getOrCacheString(name, isTag)) - end - table.insert(recipe.recipe, array) - else - table.insert(recipe.recipe, crafting.getOrCacheString(name, isTag)) - end - end - elseif json.type == "minecraft:crafting_shaped" then - ---@type table - local keys = { [" "] = 0 } - for k, v in pairs(json.key) do - local name = v.item or v.tag - local isTag = not not v.tag - if not (name) then - local array = {} - for _, opt in pairs(v) do - name = opt.item or opt.tag - table.insert(array, crafting.getOrCacheString(name, isTag)) - end - keys[k] = array - else - keys[k] = crafting.getOrCacheString(name, isTag) - end - end - recipe.recipe = {} - recipe.width = json.pattern[1]:len() - recipe.height = #json.pattern - for row, rowString in ipairs(json.pattern) do - for i = 1, rowString:len() do - table.insert(recipe.recipe, keys[rowString:sub(i, i)]) - end - end - end - cacheAdditional(recipe) - recipe.name = recipeName - gridRecipes[recipeName] = recipe - saveGridRecipes() - end - crafting.addJsonTypeHandler("minecraft:crafting_shaped", jsonTypeHandler) - crafting.addJsonTypeHandler("minecraft:crafting_shapeless", jsonTypeHandler) - local function craftingHandler(node) - -- -- Check if the turtle's state is DONE - -- local turtle = attached_turtles[node.turtle] - -- if turtle.state == "DONE" then - -- turtle_crafting_done(turtle) - -- end end crafting.addCraftingHandler("grid", craftingHandler) - ---@class modules.grid.interface + return { start = function() loadGridRecipes() @@ -487,4 +596,4 @@ return { removeGridRecipe = removeGridRecipe, } end -} +} \ No newline at end of file diff --git a/modules/passwd.lua b/modules/passwd.lua new file mode 100644 index 0000000..9001267 --- /dev/null +++ b/modules/passwd.lua @@ -0,0 +1,154 @@ +local common = require("common") + +---@class modules.passwordProtection +local passwordProtection = { + id = "passwordProtection", + version = "1.0.0", + config = { + enabled = { + type = "boolean", + description = "Enable password protection for the terminal", + default = true + }, + timeout = { + type = "number", + description = "Inactivity timeout in seconds before password prompt appears", + default = 300 -- 5 minutes + }, + password = { + type = "string", + description = "Password to unlock the terminal", + default = "" + } + }, + dependencies = { + logger = { min = "1.1", optional = true } + }, + init = function(loaded, config) + local log = loaded.logger + + local passwordLogger = setmetatable({}, { + __index = function() return function() end end + }) + if log then + passwordLogger = log.interface.logger("passwordProtection", "main") + end + + ---@type boolean + local isActive = false + ---@type number + local lastActivityTime = os.epoch("utc") + ---@type boolean + local isLocked = false + ---@type function + local activityCallback = nil + + ---@param password string + ---@return boolean + local function verifyPassword(password) + return password == config.passwordProtection.password.value + end + + ---@return boolean + local function isTimeoutExceeded() + local currentTime = os.epoch("utc") + local timeoutMs = config.passwordProtection.timeout.value * 1000 + return (currentTime - lastActivityTime) > timeoutMs + end + + ---@param force boolean + local function lock(force) + if force or (config.passwordProtection.enabled.value and isTimeoutExceeded()) then + isLocked = true + passwordLogger:info("Terminal locked due to inactivity") + return true + end + return false + end + + ---@param password string + ---@return boolean + local function unlock(password) + if verifyPassword(password) then + isLocked = false + lastActivityTime = os.epoch("utc") + passwordLogger:info("Terminal unlocked") + return true + end + passwordLogger:warn("Failed unlock attempt") + return false + end + + ---@param callback function + local function setActivityCallback(callback) + activityCallback = callback + end + + ---@return boolean + local function getLockStatus() + return isLocked + end + + ---@return number + local function getTimeUntilLock() + local currentTime = os.epoch("utc") + local timeoutMs = config.passwordProtection.timeout.value * 1000 + local timeLeft = timeoutMs - (currentTime - lastActivityTime) + return math.max(0, timeLeft / 1000) -- Return in seconds + end + + ---@param name string + ---@param value any + local function updateConfig(name, value) + if config.passwordProtection[name] then + config.passwordProtection[name].value = value + passwordLogger:info("Config updated: %s = %s", name, tostring(value)) + end + end + + ---@return table + local function getConfig() + return { + enabled = config.passwordProtection.enabled.value, + timeout = config.passwordProtection.timeout.value, + password = config.passwordProtection.password.value + } + end + + ---@param event table + local function handleEvent(event) + if event[1] == "key" or event[1] == "char" or event[1] == "mouse_click" or event[1] == "mouse_scroll" then + lastActivityTime = os.epoch("utc") + if activityCallback then + activityCallback() + end + end + end + + ---@return table + return { + ---@param force boolean + lock = lock, + ---@param password string + unlock = unlock, + getLockStatus = getLockStatus, + getTimeUntilLock = getTimeUntilLock, + setActivityCallback = setActivityCallback, + updateConfig = updateConfig, + getConfig = getConfig, + getPasswordConfig = getConfig, + handleEvent = handleEvent, + ---@return boolean + isActive = function() return isActive end, + ---@param active boolean + setActive = function(active) + isActive = active + if active then + lastActivityTime = os.epoch("utc") + end + end + } + end +} + +return passwordProtection \ No newline at end of file diff --git a/recipes/furnace_recipes.bin b/recipes/furnace_recipes.bin deleted file mode 100644 index c7fab00..0000000 Binary files a/recipes/furnace_recipes.bin and /dev/null differ diff --git a/recipes/grid_recipes.bin b/recipes/grid_recipes.bin deleted file mode 100644 index 8325282..0000000 Binary files a/recipes/grid_recipes.bin and /dev/null differ diff --git a/recipes/item_lookup.bin b/recipes/item_lookup.bin deleted file mode 100644 index d141e60..0000000 Binary files a/recipes/item_lookup.bin and /dev/null differ diff --git a/recipes/recipes.json b/recipes/recipes.json new file mode 100644 index 0000000..d2ce3fa --- /dev/null +++ b/recipes/recipes.json @@ -0,0 +1,19867 @@ +{ + "recipes": { + "furnace": [ + { + "type": "minecraft:smelting", + "ingredient": "minecraft:potato", + "result": "minecraft:baked_potato", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:black_terracotta", + "result": "minecraft:black_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:blue_terracotta", + "result": "minecraft:blue_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:clay_ball", + "result": "minecraft:brick", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:brown_terracotta", + "result": "minecraft:brown_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "#minecraft:logs_that_burn", + "result": "minecraft:charcoal", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:coal_ore", + "result": "minecraft:coal", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_coal_ore", + "result": "minecraft:coal", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:coal_ore", + "result": "minecraft:coal", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_coal_ore", + "result": "minecraft:coal", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:beef", + "result": "minecraft:cooked_beef", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:chicken", + "result": "minecraft:cooked_chicken", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:cod", + "result": "minecraft:cooked_cod", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:mutton", + "result": "minecraft:cooked_mutton", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:porkchop", + "result": "minecraft:cooked_porkchop", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:rabbit", + "result": "minecraft:cooked_rabbit", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:salmon", + "result": "minecraft:cooked_salmon", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:copper_ore", + "result": "minecraft:copper_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_copper_ore", + "result": "minecraft:copper_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:raw_copper", + "result": "minecraft:copper_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:copper_ore", + "result": "minecraft:copper_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_copper_ore", + "result": "minecraft:copper_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:raw_copper", + "result": "minecraft:copper_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:copper_pickaxe", + "result": "minecraft:copper_nugget", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:copper_pickaxe", + "result": "minecraft:copper_nugget", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_bricks", + "result": "minecraft:cracked_deepslate_bricks", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_tiles", + "result": "minecraft:cracked_deepslate_tiles", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:nether_bricks", + "result": "minecraft:cracked_nether_bricks", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:polished_blackstone_bricks", + "result": "minecraft:cracked_polished_blackstone_bricks", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:stone_bricks", + "result": "minecraft:cracked_stone_bricks", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:cyan_terracotta", + "result": "minecraft:cyan_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:cobbled_deepslate", + "result": "minecraft:deepslate", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_diamond_ore", + "result": "minecraft:diamond", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:diamond_ore", + "result": "minecraft:diamond", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_diamond_ore", + "result": "minecraft:diamond", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:diamond_ore", + "result": "minecraft:diamond", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:kelp", + "result": "minecraft:dried_kelp", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_emerald_ore", + "result": "minecraft:emerald", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:emerald_ore", + "result": "minecraft:emerald", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_emerald_ore", + "result": "minecraft:emerald", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:emerald_ore", + "result": "minecraft:emerald", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "#minecraft:smelts_to_glass", + "result": "minecraft:glass", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_gold_ore", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:gold_ore", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:nether_gold_ore", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:raw_gold", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_gold_ore", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:gold_ore", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:nether_gold_ore", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:raw_gold", + "result": "minecraft:gold_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:golden_pickaxe", + "result": "minecraft:gold_nugget", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:golden_pickaxe", + "result": "minecraft:gold_nugget", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:gray_terracotta", + "result": "minecraft:gray_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:cactus", + "result": "minecraft:green_dye", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:green_terracotta", + "result": "minecraft:green_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_iron_ore", + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:iron_ore", + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:raw_iron", + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_iron_ore", + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:iron_ore", + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:raw_iron", + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:iron_pickaxe", + "result": "minecraft:iron_nugget", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:iron_pickaxe", + "result": "minecraft:iron_nugget", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_lapis_ore", + "result": "minecraft:lapis_lazuli", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:lapis_ore", + "result": "minecraft:lapis_lazuli", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_lapis_ore", + "result": "minecraft:lapis_lazuli", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:lapis_ore", + "result": "minecraft:lapis_lazuli", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "#minecraft:leaves", + "result": "minecraft:leaf_litter", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:light_blue_terracotta", + "result": "minecraft:light_blue_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:light_gray_terracotta", + "result": "minecraft:light_gray_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:sea_pickle", + "result": "minecraft:lime_dye", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:lime_terracotta", + "result": "minecraft:lime_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:magenta_terracotta", + "result": "minecraft:magenta_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:netherrack", + "result": "minecraft:nether_brick", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:ancient_debris", + "result": "minecraft:netherite_scrap", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:ancient_debris", + "result": "minecraft:netherite_scrap", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:orange_terracotta", + "result": "minecraft:orange_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:pink_terracotta", + "result": "minecraft:pink_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:chorus_fruit", + "result": "minecraft:popped_chorus_fruit", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:purple_terracotta", + "result": "minecraft:purple_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:nether_quartz_ore", + "result": "minecraft:quartz", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:nether_quartz_ore", + "result": "minecraft:quartz", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:red_terracotta", + "result": "minecraft:red_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_redstone_ore", + "result": "minecraft:redstone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:redstone_ore", + "result": "minecraft:redstone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:deepslate_redstone_ore", + "result": "minecraft:redstone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:redstone_ore", + "result": "minecraft:redstone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:resin_clump", + "result": "minecraft:resin_brick", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:basalt", + "result": "minecraft:smooth_basalt", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:quartz_block", + "result": "minecraft:smooth_quartz", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:red_sandstone", + "result": "minecraft:smooth_red_sandstone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:sandstone", + "result": "minecraft:smooth_sandstone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:stone", + "result": "minecraft:smooth_stone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:wet_sponge", + "result": "minecraft:sponge", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:cobblestone", + "result": "minecraft:stone", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:clay", + "result": "minecraft:terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:white_terracotta", + "result": "minecraft:white_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + }, + { + "type": "minecraft:smelting", + "ingredient": "minecraft:yellow_terracotta", + "result": "minecraft:yellow_glazed_terracotta", + "experience": 0.7, + "cookingtime": 200 + } + ], + "crafting": [ + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:acacia_button", + "count": 1 + }, + "ingredients": [ + "minecraft:acacia_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:acacia_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:acacia_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_acacia_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:acacia_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:acacia_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_acacia_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:acacia_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:acacia_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:acacia_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:acacia_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:activator_rail", + "count": 6 + }, + "pattern": [ + "XSX", + "X#X", + "XSX" + ], + "key": { + "#": "minecraft:redstone_torch", + "S": "minecraft:stick", + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:amethyst_block", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:amethyst_shard" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:andesite", + "count": 2 + }, + "ingredients": [ + "minecraft:diorite", + "minecraft:cobblestone" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:andesite_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:andesite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:andesite_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:andesite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:andesite_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:andesite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:anvil", + "count": 1 + }, + "pattern": [ + "III", + " i ", + "iii" + ], + "key": { + "I": "minecraft:iron_block", + "i": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:armor_stand", + "count": 1 + }, + "pattern": [ + "///", + " / ", + "/_/" + ], + "key": { + "/": "minecraft:stick", + "_": "minecraft:smooth_stone_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:arrow", + "count": 4 + }, + "pattern": [ + "X", + "#", + "Y" + ], + "key": { + "#": "minecraft:stick", + "X": "minecraft:flint", + "Y": "minecraft:feather" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:bamboo_block", + "count": 1 + }, + "ingredients": [ + "minecraft:bamboo", + "minecraft:bamboo", + "minecraft:bamboo", + "minecraft:bamboo", + "minecraft:bamboo", + "minecraft:bamboo", + "minecraft:bamboo", + "minecraft:bamboo", + "minecraft:bamboo" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:bamboo_button", + "count": 1 + }, + "ingredients": [ + "minecraft:bamboo_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:bamboo_chest_raft", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:bamboo_raft" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_bamboo_block", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_mosaic", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:bamboo_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_mosaic_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:bamboo_mosaic" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_mosaic_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:bamboo_mosaic" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:bamboo_planks", + "count": 2 + }, + "ingredients": [ + "#minecraft:bamboo_blocks" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_raft", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_bamboo_block" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:bamboo_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bamboo_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:bamboo_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:barrel", + "count": 1 + }, + "pattern": [ + "PSP", + "P P", + "PSP" + ], + "key": { + "P": "#minecraft:planks", + "S": "#minecraft:wooden_slabs" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:beacon", + "count": 1 + }, + "pattern": [ + "GGG", + "GSG", + "OOO" + ], + "key": { + "G": "minecraft:glass", + "O": "minecraft:obsidian", + "S": "minecraft:nether_star" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:beehive", + "count": 1 + }, + "pattern": [ + "PPP", + "HHH", + "PPP" + ], + "key": { + "H": "minecraft:honeycomb", + "P": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:beetroot_soup", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:beetroot", + "minecraft:beetroot", + "minecraft:beetroot", + "minecraft:beetroot", + "minecraft:beetroot", + "minecraft:beetroot" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:birch_button", + "count": 1 + }, + "ingredients": [ + "minecraft:birch_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:birch_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:birch_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_birch_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:birch_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:birch_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_birch_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:birch_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:birch_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:birch_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:birch_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:black_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:black_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:black_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:black_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:black_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:ink_sac" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:wither_rose" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:black_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:black_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:black_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:black_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:black_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:black_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blackstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blackstone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blackstone_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blast_furnace", + "count": 1 + }, + "pattern": [ + "III", + "IXI", + "###" + ], + "key": { + "#": "minecraft:smooth_stone", + "I": "minecraft:iron_ingot", + "X": "minecraft:furnace" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blaze_powder", + "count": 2 + }, + "ingredients": [ + "minecraft:blaze_rod" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:blue_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:blue_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:blue_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:blue_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:blue_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:lapis_lazuli" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:cornflower" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:blue_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_ice", + "count": 1 + }, + "ingredients": [ + "minecraft:packed_ice", + "minecraft:packed_ice", + "minecraft:packed_ice", + "minecraft:packed_ice", + "minecraft:packed_ice", + "minecraft:packed_ice", + "minecraft:packed_ice", + "minecraft:packed_ice", + "minecraft:packed_ice" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:blue_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:blue_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:blue_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:blue_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:blue_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bolt_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": [ + "minecraft:copper_block", + "minecraft:waxed_copper_block" + ], + "S": "minecraft:bolt_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bone_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:bone_meal" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:bone_meal", + "count": 3 + }, + "ingredients": [ + "minecraft:bone" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:bone_meal", + "count": 9 + }, + "ingredients": [ + "minecraft:bone_block" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:book", + "count": 1 + }, + "ingredients": [ + "minecraft:paper", + "minecraft:paper", + "minecraft:paper", + "minecraft:leather" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bookshelf", + "count": 1 + }, + "pattern": [ + "###", + "XXX", + "###" + ], + "key": { + "#": "#minecraft:planks", + "X": "minecraft:book" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:bordure_indented_banner_pattern", + "count": 1 + }, + "ingredients": [ + "minecraft:paper", + "minecraft:vine" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bow", + "count": 1 + }, + "pattern": [ + " #X", + "# X", + " #X" + ], + "key": { + "#": "minecraft:stick", + "X": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bowl", + "count": 4 + }, + "pattern": [ + "# #", + " # " + ], + "key": { + "#": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bread", + "count": 1 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:wheat" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brewing_stand", + "count": 1 + }, + "pattern": [ + " B ", + "###" + ], + "key": { + "#": "#minecraft:stone_crafting_materials", + "B": "minecraft:blaze_rod" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bricks", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:brick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:brown_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:brown_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:brown_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:brown_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:brown_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:brown_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:brown_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:brown_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:cocoa_beans" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:brown_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:brown_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:brown_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:brown_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brown_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:brown_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:brush", + "count": 1 + }, + "pattern": [ + "X", + "#", + "I" + ], + "key": { + "#": "minecraft:copper_ingot", + "I": "minecraft:stick", + "X": "minecraft:feather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bucket", + "count": 1 + }, + "pattern": [ + "# #", + " # " + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:bundle", + "count": 1 + }, + "pattern": [ + "-", + "#" + ], + "key": { + "#": "minecraft:leather", + "-": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cake", + "count": 1 + }, + "pattern": [ + "AAA", + "BEB", + "CCC" + ], + "key": { + "A": "minecraft:milk_bucket", + "B": "minecraft:sugar", + "C": "minecraft:wheat", + "E": "#minecraft:eggs" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:calibrated_sculk_sensor", + "count": 1 + }, + "pattern": [ + " # ", + "#X#" + ], + "key": { + "#": "minecraft:amethyst_shard", + "X": "minecraft:sculk_sensor" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:campfire", + "count": 1 + }, + "pattern": [ + " S ", + "SCS", + "LLL" + ], + "key": { + "C": "#minecraft:coals", + "L": "#minecraft:logs", + "S": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:candle", + "count": 1 + }, + "pattern": [ + "S", + "H" + ], + "key": { + "H": "minecraft:honeycomb", + "S": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:carrot_on_a_stick", + "count": 1 + }, + "pattern": [ + "# ", + " X" + ], + "key": { + "#": "minecraft:fishing_rod", + "X": "minecraft:carrot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cartography_table", + "count": 1 + }, + "pattern": [ + "@@", + "##", + "##" + ], + "key": { + "#": "#minecraft:planks", + "@": "minecraft:paper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cauldron", + "count": 1 + }, + "pattern": [ + "# #", + "# #", + "###" + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cherry_button", + "count": 1 + }, + "ingredients": [ + "minecraft:cherry_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cherry_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:cherry_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_cherry_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cherry_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:cherry_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_cherry_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:cherry_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:cherry_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cherry_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:cherry_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chest", + "count": 1 + }, + "pattern": [ + "###", + "# #", + "###" + ], + "key": { + "#": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:chest_minecart", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:minecart" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_bookshelf", + "count": 1 + }, + "pattern": [ + "###", + "XXX", + "###" + ], + "key": { + "#": "#minecraft:planks", + "X": "#minecraft:wooden_slabs" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_cinnabar", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:cinnabar_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_copper", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_deepslate", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:cobbled_deepslate_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_nether_bricks", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:nether_brick_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_polished_blackstone", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:polished_blackstone_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_quartz_block", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:quartz_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_red_sandstone", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:red_sandstone_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_resin_bricks", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:resin_brick_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_sandstone", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:sandstone_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_stone_bricks", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:stone_brick_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_sulfur", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:sulfur_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_tuff", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:tuff_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:chiseled_tuff_bricks", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:tuff_brick_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cinnabar_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cinnabar_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cinnabar_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:cinnabar_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cinnabar_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:cinnabar_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cinnabar_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:polished_cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cinnabar_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cinnabar_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cinnabar_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:clay", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:clay_ball" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:clock", + "count": 1 + }, + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": "minecraft:gold_ingot", + "X": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:coal", + "count": 9 + }, + "ingredients": [ + "minecraft:coal_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:coal_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:coal" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:coarse_dirt", + "count": 4 + }, + "pattern": [ + "DG", + "GD" + ], + "key": { + "D": "minecraft:dirt", + "G": "minecraft:gravel" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:coast_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:cobblestone", + "S": "minecraft:coast_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cobbled_deepslate_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cobbled_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cobbled_deepslate_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:cobbled_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cobbled_deepslate_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:cobbled_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cobblestone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cobblestone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cobblestone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:cobblestone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cobblestone_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:cobblestone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:comparator", + "count": 1 + }, + "pattern": [ + " # ", + "#X#", + "III" + ], + "key": { + "#": "minecraft:redstone_torch", + "I": "minecraft:stone", + "X": "minecraft:quartz" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:compass", + "count": 1 + }, + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": "minecraft:iron_ingot", + "X": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:composter", + "count": 1 + }, + "pattern": [ + "# #", + "# #", + "###" + ], + "key": { + "#": "#minecraft:wooden_slabs" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:conduit", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:nautilus_shell", + "X": "minecraft:heart_of_the_sea" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cookie", + "count": 8 + }, + "pattern": [ + "#X#" + ], + "key": { + "#": "minecraft:wheat", + "X": "minecraft:cocoa_beans" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_axe", + "count": 1 + }, + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:copper_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_bars", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_boots", + "count": 1 + }, + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:copper_block", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_chain", + "count": 1 + }, + "pattern": [ + "N", + "I", + "N" + ], + "key": { + "I": "minecraft:copper_ingot", + "N": "minecraft:copper_nugget" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_chest", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:copper_ingot", + "X": "minecraft:chest" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_chestplate", + "count": 1 + }, + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:copper_block" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_helmet", + "count": 1 + }, + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_hoe", + "count": 1 + }, + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:copper_tool_materials" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:copper_ingot", + "count": 9 + }, + "ingredients": [ + "minecraft:copper_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_ingot", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:copper_nugget" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:copper_ingot", + "count": 9 + }, + "ingredients": [ + "minecraft:waxed_copper_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_lantern", + "count": 1 + }, + "pattern": [ + "XXX", + "X#X", + "XXX" + ], + "key": { + "#": "minecraft:copper_torch", + "X": "minecraft:copper_nugget" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_leggings", + "count": 1 + }, + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:copper_nugget", + "count": 9 + }, + "ingredients": [ + "minecraft:copper_ingot" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_pickaxe", + "count": 1 + }, + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:copper_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_shovel", + "count": 1 + }, + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:copper_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_spear", + "count": 1 + }, + "pattern": [ + " X", + " # ", + "# " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:copper_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_sword", + "count": 1 + }, + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:copper_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_torch", + "count": 4 + }, + "pattern": [ + "C", + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "C": "minecraft:copper_nugget", + "X": [ + "minecraft:coal", + "minecraft:charcoal" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:copper_trapdoor", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crafter", + "count": 1 + }, + "pattern": [ + "###", + "#C#", + "RDR" + ], + "key": { + "#": "minecraft:iron_ingot", + "C": "minecraft:crafting_table", + "D": "minecraft:dropper", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crafting_table", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:creaking_heart", + "count": 1 + }, + "pattern": [ + " L ", + " R ", + " L " + ], + "key": { + "L": "minecraft:pale_oak_log", + "R": "minecraft:resin_block" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:creeper_banner_pattern", + "count": 1 + }, + "ingredients": [ + "minecraft:paper", + "minecraft:creeper_head" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:crimson_button", + "count": 1 + }, + "ingredients": [ + "minecraft:crimson_planks" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:crimson_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:crimson_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:crimson_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_crimson_stem", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_hyphae", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:crimson_stem" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:crimson_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:crimson_stems" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:crimson_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_crimson_stem" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:crimson_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:crimson_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:crimson_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crimson_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:crimson_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:crossbow", + "count": 1 + }, + "pattern": [ + "#&#", + "~$~", + " # " + ], + "key": { + "#": "minecraft:stick", + "$": "minecraft:tripwire_hook", + "&": "minecraft:iron_ingot", + "~": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:copper_block" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cut_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:cut_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cut_red_sandstone", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:red_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cut_red_sandstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cut_red_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cut_sandstone", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cut_sandstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:cut_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:cyan_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:cyan_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:cyan_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:cyan_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:cyan_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:blue_dye", + "minecraft:green_dye" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:pitcher_plant" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:cyan_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:cyan_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:cyan_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:cyan_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:cyan_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:cyan_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:dark_oak_button", + "count": 1 + }, + "ingredients": [ + "minecraft:dark_oak_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:dark_oak_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:dark_oak_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_dark_oak_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:dark_oak_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:dark_oak_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_dark_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:dark_oak_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:dark_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_oak_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:dark_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_prismarine", + "count": 1 + }, + "pattern": [ + "SSS", + "SIS", + "SSS" + ], + "key": { + "I": "minecraft:black_dye", + "S": "minecraft:prismarine_shard" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_prismarine_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:dark_prismarine" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dark_prismarine_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:dark_prismarine" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:daylight_detector", + "count": 1 + }, + "pattern": [ + "GGG", + "QQQ", + "WWW" + ], + "key": { + "G": "minecraft:glass", + "Q": "minecraft:quartz", + "W": "#minecraft:wooden_slabs" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:decorated_pot", + "count": 1 + }, + "pattern": [ + " # ", + "# #", + " # " + ], + "key": { + "#": "minecraft:brick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:deepslate_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:deepslate_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:deepslate_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:polished_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_tile_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:deepslate_tiles" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_tile_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:deepslate_tiles" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_tile_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:deepslate_tiles" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:deepslate_tiles", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:deepslate_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:detector_rail", + "count": 6 + }, + "pattern": [ + "X X", + "X#X", + "XRX" + ], + "key": { + "#": "minecraft:stone_pressure_plate", + "R": "minecraft:redstone", + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:diamond", + "count": 9 + }, + "ingredients": [ + "minecraft:diamond_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_axe", + "count": 1 + }, + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:diamond_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:diamond" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_boots", + "count": 1 + }, + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": "minecraft:diamond" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_chestplate", + "count": 1 + }, + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": "minecraft:diamond" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_helmet", + "count": 1 + }, + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": "minecraft:diamond" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_hoe", + "count": 1 + }, + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:diamond_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_leggings", + "count": 1 + }, + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": "minecraft:diamond" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_pickaxe", + "count": 1 + }, + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:diamond_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_shovel", + "count": 1 + }, + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:diamond_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_spear", + "count": 1 + }, + "pattern": [ + " X", + " # ", + "# " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:diamond_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diamond_sword", + "count": 1 + }, + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:diamond_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diorite", + "count": 2 + }, + "pattern": [ + "CQ", + "QC" + ], + "key": { + "C": "minecraft:cobblestone", + "Q": "minecraft:quartz" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diorite_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:diorite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diorite_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:diorite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:diorite_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:diorite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dispenser", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "#R#" + ], + "key": { + "#": "minecraft:cobblestone", + "R": "minecraft:redstone", + "X": "minecraft:bow" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dried_ghast", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:ghast_tear", + "X": "minecraft:soul_sand" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:dried_kelp", + "count": 9 + }, + "ingredients": [ + "minecraft:dried_kelp_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dried_kelp_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:dried_kelp" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dripstone_block", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:pointed_dripstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dropper", + "count": 1 + }, + "pattern": [ + "###", + "# #", + "#R#" + ], + "key": { + "#": "minecraft:cobblestone", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:dune_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:sandstone", + "S": "minecraft:dune_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:black_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:black_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:black_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:black_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:black_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:blue_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:blue_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:blue_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:blue_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:blue_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:brown_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:brown_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:brown_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:brown_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:brown_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:brown_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:brown_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:brown_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:cyan_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:cyan_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:cyan_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:cyan_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:cyan_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:gray_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:gray_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:gray_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:gray_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:green_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:green_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:green_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:green_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:green_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:green_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:green_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:green_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:light_blue_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:light_blue_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:light_blue_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:light_blue_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:light_gray_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:light_gray_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:light_gray_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:light_gray_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lime_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:lime_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lime_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:lime_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lime_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:lime_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lime_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:lime_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:magenta_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:magenta_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:magenta_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:magenta_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:orange_dye", + [ + "minecraft:white_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:orange_dye", + [ + "minecraft:white_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:orange_dye", + [ + "minecraft:white_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:orange_dye", + [ + "minecraft:white_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:pink_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:pink_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:pink_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:pink_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:purple_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:purple_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:purple_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:purple_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:purple_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:purple_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:purple_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:purple_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:red_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:red_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:red_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:red_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:white_dye", + [ + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:yellow_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:white_dye", + [ + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:white_dye", + [ + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:white_dye", + [ + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_bed", + "count": 1 + }, + "ingredients": [ + "minecraft:yellow_dye", + [ + "minecraft:white_bed", + "minecraft:orange_bed", + "minecraft:magenta_bed", + "minecraft:light_blue_bed", + "minecraft:lime_bed", + "minecraft:pink_bed", + "minecraft:gray_bed", + "minecraft:light_gray_bed", + "minecraft:cyan_bed", + "minecraft:purple_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:green_bed", + "minecraft:red_bed", + "minecraft:black_bed" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_carpet", + "count": 1 + }, + "ingredients": [ + "minecraft:yellow_dye", + [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_harness", + "count": 1 + }, + "ingredients": [ + "minecraft:yellow_dye", + [ + "minecraft:white_harness", + "minecraft:orange_harness", + "minecraft:magenta_harness", + "minecraft:light_blue_harness", + "minecraft:lime_harness", + "minecraft:pink_harness", + "minecraft:gray_harness", + "minecraft:light_gray_harness", + "minecraft:cyan_harness", + "minecraft:purple_harness", + "minecraft:blue_harness", + "minecraft:brown_harness", + "minecraft:green_harness", + "minecraft:red_harness", + "minecraft:black_harness" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_wool", + "count": 1 + }, + "ingredients": [ + "minecraft:yellow_dye", + [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:emerald", + "count": 9 + }, + "ingredients": [ + "minecraft:emerald_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:emerald_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:emerald" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:enchanting_table", + "count": 1 + }, + "pattern": [ + " B ", + "D#D", + "###" + ], + "key": { + "#": "minecraft:obsidian", + "B": "minecraft:book", + "D": "minecraft:diamond" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:end_crystal", + "count": 1 + }, + "pattern": [ + "GGG", + "GEG", + "GTG" + ], + "key": { + "E": "minecraft:ender_eye", + "G": "minecraft:glass", + "T": "minecraft:ghast_tear" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:end_rod", + "count": 4 + }, + "pattern": [ + "/", + "#" + ], + "key": { + "#": "minecraft:popped_chorus_fruit", + "/": "minecraft:blaze_rod" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:end_stone_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:end_stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:end_stone_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:end_stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:end_stone_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:end_stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:end_stone_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:end_stone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:ender_chest", + "count": 1 + }, + "pattern": [ + "###", + "#E#", + "###" + ], + "key": { + "#": "minecraft:obsidian", + "E": "minecraft:ender_eye" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:ender_eye", + "count": 1 + }, + "ingredients": [ + "minecraft:ender_pearl", + "minecraft:blaze_powder" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:exposed_chiseled_copper", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:exposed_cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:exposed_copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:exposed_copper", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:exposed_copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:exposed_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:exposed_cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:exposed_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:exposed_cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:exposed_cut_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:exposed_cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:exposed_cut_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:eye_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:end_stone", + "S": "minecraft:eye_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:fermented_spider_eye", + "count": 1 + }, + "ingredients": [ + "minecraft:spider_eye", + "minecraft:brown_mushroom", + "minecraft:sugar" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:field_masoned_banner_pattern", + "count": 1 + }, + "ingredients": [ + "minecraft:paper", + "minecraft:bricks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:fire_charge", + "count": 3 + }, + "ingredients": [ + "minecraft:gunpowder", + "minecraft:blaze_powder", + [ + "minecraft:coal", + "minecraft:charcoal" + ] + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:firework_rocket", + "count": 3 + }, + "ingredients": [ + "minecraft:gunpowder", + "minecraft:paper" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:fishing_rod", + "count": 1 + }, + "pattern": [ + " #", + " #X", + "# X" + ], + "key": { + "#": "minecraft:stick", + "X": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:fletching_table", + "count": 1 + }, + "pattern": [ + "@@", + "##", + "##" + ], + "key": { + "#": "#minecraft:planks", + "@": "minecraft:flint" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:flint_and_steel", + "count": 1 + }, + "ingredients": [ + "minecraft:iron_ingot", + "minecraft:flint" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:flow_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:breeze_rod", + "S": "minecraft:flow_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:flower_banner_pattern", + "count": 1 + }, + "ingredients": [ + "minecraft:paper", + "minecraft:oxeye_daisy" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:flower_pot", + "count": 1 + }, + "pattern": [ + "# #", + " # " + ], + "key": { + "#": "minecraft:brick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:furnace", + "count": 1 + }, + "pattern": [ + "###", + "# #", + "###" + ], + "key": { + "#": "#minecraft:stone_crafting_materials" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:furnace_minecart", + "count": 1 + }, + "ingredients": [ + "minecraft:furnace", + "minecraft:minecart" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:glass_bottle", + "count": 3 + }, + "pattern": [ + "# #", + " # " + ], + "key": { + "#": "minecraft:glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:glistering_melon_slice", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:gold_nugget", + "X": "minecraft:melon_slice" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:glow_item_frame", + "count": 1 + }, + "ingredients": [ + "minecraft:item_frame", + "minecraft:glow_ink_sac" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:glowstone", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:glowstone_dust" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gold_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:gold_ingot" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gold_ingot", + "count": 9 + }, + "ingredients": [ + "minecraft:gold_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gold_ingot", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:gold_nugget" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gold_nugget", + "count": 9 + }, + "ingredients": [ + "minecraft:gold_ingot" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_apple", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:gold_ingot", + "X": "minecraft:apple" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_axe", + "count": 1 + }, + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:gold_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_boots", + "count": 1 + }, + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": "minecraft:gold_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_carrot", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:gold_nugget", + "X": "minecraft:carrot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_chestplate", + "count": 1 + }, + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": "minecraft:gold_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_dandelion", + "count": 1 + }, + "pattern": [ + "###", + "#I#", + "###" + ], + "key": { + "#": "minecraft:gold_nugget", + "I": "minecraft:dandelion" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_helmet", + "count": 1 + }, + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": "minecraft:gold_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_hoe", + "count": 1 + }, + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:gold_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_leggings", + "count": 1 + }, + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": "minecraft:gold_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_pickaxe", + "count": 1 + }, + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:gold_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_shovel", + "count": 1 + }, + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:gold_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_spear", + "count": 1 + }, + "pattern": [ + " X", + " # ", + "# " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:gold_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:golden_sword", + "count": 1 + }, + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:gold_tool_materials" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:granite", + "count": 1 + }, + "ingredients": [ + "minecraft:diorite", + "minecraft:quartz" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:granite_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:granite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:granite_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:granite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:granite_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:granite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:gray_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:gray_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:gray_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:gray_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:gray_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:black_dye", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:gray_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:closed_eyeblossom" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:gray_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:gray_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:gray_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:gray_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:gray_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:gray_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:green_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:green_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:green_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:green_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:green_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:green_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:green_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:green_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:green_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:green_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:green_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:green_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:green_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:grindstone", + "count": 1 + }, + "pattern": [ + "I-I", + "# #" + ], + "key": { + "#": "#minecraft:planks", + "-": "minecraft:stone_slab", + "I": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:hay_block", + "count": 1 + }, + "ingredients": [ + "minecraft:wheat", + "minecraft:wheat", + "minecraft:wheat", + "minecraft:wheat", + "minecraft:wheat", + "minecraft:wheat", + "minecraft:wheat", + "minecraft:wheat", + "minecraft:wheat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:heavy_weighted_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:honey_block", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:honey_bottle" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:honey_bottle", + "count": 4 + }, + "ingredients": [ + "minecraft:honey_block", + "minecraft:glass_bottle", + "minecraft:glass_bottle", + "minecraft:glass_bottle", + "minecraft:glass_bottle" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:honeycomb_block", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:honeycomb" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:hopper", + "count": 1 + }, + "pattern": [ + "I I", + "ICI", + " I " + ], + "key": { + "C": "minecraft:chest", + "I": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:hopper_minecart", + "count": 1 + }, + "ingredients": [ + "minecraft:hopper", + "minecraft:minecart" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:host_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:terracotta", + "S": "minecraft:host_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_axe", + "count": 1 + }, + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:iron_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_bars", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_boots", + "count": 1 + }, + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_chain", + "count": 1 + }, + "pattern": [ + "N", + "I", + "N" + ], + "key": { + "I": "minecraft:iron_ingot", + "N": "minecraft:iron_nugget" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_chestplate", + "count": 1 + }, + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_helmet", + "count": 1 + }, + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_hoe", + "count": 1 + }, + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:iron_tool_materials" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:iron_ingot", + "count": 9 + }, + "ingredients": [ + "minecraft:iron_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_ingot", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:iron_nugget" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_leggings", + "count": 1 + }, + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:iron_nugget", + "count": 9 + }, + "ingredients": [ + "minecraft:iron_ingot" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_pickaxe", + "count": 1 + }, + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:iron_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_shovel", + "count": 1 + }, + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:iron_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_spear", + "count": 1 + }, + "pattern": [ + " X", + " # ", + "# " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:iron_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_sword", + "count": 1 + }, + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:iron_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:iron_trapdoor", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:item_frame", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:stick", + "X": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jack_o_lantern", + "count": 1 + }, + "pattern": [ + "A", + "B" + ], + "key": { + "A": "minecraft:carved_pumpkin", + "B": "minecraft:torch" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jukebox", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "#minecraft:planks", + "X": "minecraft:diamond" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:jungle_button", + "count": 1 + }, + "ingredients": [ + "minecraft:jungle_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:jungle_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:jungle_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_jungle_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:jungle_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:jungle_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_jungle_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:jungle_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:jungle_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:jungle_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:jungle_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:ladder", + "count": 3 + }, + "pattern": [ + "# #", + "###", + "# #" + ], + "key": { + "#": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lantern", + "count": 1 + }, + "pattern": [ + "XXX", + "X#X", + "XXX" + ], + "key": { + "#": "minecraft:torch", + "X": "minecraft:iron_nugget" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lapis_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:lapis_lazuli" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lapis_lazuli", + "count": 9 + }, + "ingredients": [ + "minecraft:lapis_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lead", + "count": 2 + }, + "pattern": [ + "~~ ", + "~~ ", + " ~" + ], + "key": { + "~": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:leather", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:rabbit_hide" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:leather_boots", + "count": 1 + }, + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:leather_chestplate", + "count": 1 + }, + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:leather_helmet", + "count": 1 + }, + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:leather_horse_armor", + "count": 1 + }, + "pattern": [ + "X X", + "XXX", + "X X" + ], + "key": { + "X": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:leather_leggings", + "count": 1 + }, + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lectern", + "count": 1 + }, + "pattern": [ + "SSS", + " B ", + " S " + ], + "key": { + "B": "minecraft:bookshelf", + "S": "#minecraft:wooden_slabs" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lever", + "count": 1 + }, + "pattern": [ + "X", + "#" + ], + "key": { + "#": "minecraft:cobblestone", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:light_blue_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:light_blue_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:light_blue_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:light_blue_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:light_blue_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:blue_orchid" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_blue_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:blue_dye", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:light_blue_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:light_blue_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:light_blue_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:light_blue_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_blue_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:light_blue_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:light_gray_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:light_gray_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:light_gray_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:light_gray_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:light_gray_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:azure_bluet" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_dye", + "count": 3 + }, + "ingredients": [ + "minecraft:black_dye", + "minecraft:white_dye", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:gray_dye", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:oxeye_daisy" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:light_gray_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:white_tulip" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:light_gray_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:light_gray_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:light_gray_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:light_gray_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_gray_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:light_gray_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:light_weighted_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:gold_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lightning_rod", + "count": 1 + }, + "pattern": [ + "#", + "#", + "#" + ], + "key": { + "#": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:lime_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:lime_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lime_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:lime_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:lime_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lime_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:lime_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:lime_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:green_dye", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:lime_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:lime_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:lime_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:lime_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lime_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:lime_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:lodestone", + "count": 1 + }, + "pattern": [ + "SSS", + "S#S", + "SSS" + ], + "key": { + "#": "minecraft:iron_ingot", + "S": "minecraft:chiseled_stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:loom", + "count": 1 + }, + "pattern": [ + "@@", + "##" + ], + "key": { + "#": "#minecraft:planks", + "@": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mace", + "count": 1 + }, + "pattern": [ + " # ", + " I " + ], + "key": { + "#": "minecraft:heavy_core", + "I": "minecraft:breeze_rod" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:magenta_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:magenta_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:magenta_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:magenta_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:magenta_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:allium" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_dye", + "count": 3 + }, + "ingredients": [ + "minecraft:blue_dye", + "minecraft:red_dye", + "minecraft:pink_dye" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_dye", + "count": 4 + }, + "ingredients": [ + "minecraft:blue_dye", + "minecraft:red_dye", + "minecraft:red_dye", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:lilac" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magenta_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:purple_dye", + "minecraft:pink_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:magenta_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:magenta_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:magenta_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:magenta_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magenta_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:magenta_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:magma_block", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:magma_cream" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:magma_cream", + "count": 1 + }, + "ingredients": [ + "minecraft:blaze_powder", + "minecraft:slime_ball" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mangrove_button", + "count": 1 + }, + "ingredients": [ + "minecraft:mangrove_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mangrove_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:mangrove_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_mangrove_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mangrove_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:mangrove_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_mangrove_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:mangrove_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:mangrove_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mangrove_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:mangrove_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:map", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:paper", + "X": "minecraft:compass" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:melon", + "count": 1 + }, + "ingredients": [ + "minecraft:melon_slice", + "minecraft:melon_slice", + "minecraft:melon_slice", + "minecraft:melon_slice", + "minecraft:melon_slice", + "minecraft:melon_slice", + "minecraft:melon_slice", + "minecraft:melon_slice", + "minecraft:melon_slice" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:melon_seeds", + "count": 1 + }, + "ingredients": [ + "minecraft:melon_slice" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:minecart", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mojang_banner_pattern", + "count": 1 + }, + "ingredients": [ + "minecraft:paper", + "minecraft:enchanted_golden_apple" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:moss_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:moss_block" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mossy_cobblestone", + "count": 1 + }, + "ingredients": [ + "minecraft:cobblestone", + "minecraft:moss_block" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mossy_cobblestone", + "count": 1 + }, + "ingredients": [ + "minecraft:cobblestone", + "minecraft:vine" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mossy_cobblestone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:mossy_cobblestone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mossy_cobblestone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:mossy_cobblestone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mossy_cobblestone_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:mossy_cobblestone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mossy_stone_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:mossy_stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mossy_stone_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:mossy_stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mossy_stone_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:mossy_stone_bricks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mossy_stone_bricks", + "count": 1 + }, + "ingredients": [ + "minecraft:stone_bricks", + "minecraft:moss_block" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mossy_stone_bricks", + "count": 1 + }, + "ingredients": [ + "minecraft:stone_bricks", + "minecraft:vine" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mud_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:mud_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mud_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:mud_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mud_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:mud_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:mud_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:packed_mud" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:muddy_mangrove_roots", + "count": 1 + }, + "ingredients": [ + "minecraft:mud", + "minecraft:mangrove_roots" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:mushroom_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:bowl" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:music_disc_5", + "count": 1 + }, + "ingredients": [ + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5", + "minecraft:disc_fragment_5" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:name_tag", + "count": 1 + }, + "pattern": [ + " X", + "# " + ], + "key": { + "#": "minecraft:paper", + "X": "#minecraft:metal_nuggets" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:nether_brick_fence", + "count": 6 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:nether_brick", + "W": "minecraft:nether_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:nether_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:nether_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:nether_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:nether_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:nether_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:nether_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:nether_bricks", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:nether_brick" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:nether_wart_block", + "count": 1 + }, + "ingredients": [ + "minecraft:nether_wart", + "minecraft:nether_wart", + "minecraft:nether_wart", + "minecraft:nether_wart", + "minecraft:nether_wart", + "minecraft:nether_wart", + "minecraft:nether_wart", + "minecraft:nether_wart", + "minecraft:nether_wart" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:netherite_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:netherite_ingot" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:netherite_ingot", + "count": 1 + }, + "ingredients": [ + "minecraft:netherite_scrap", + "minecraft:netherite_scrap", + "minecraft:netherite_scrap", + "minecraft:netherite_scrap", + "minecraft:gold_ingot", + "minecraft:gold_ingot", + "minecraft:gold_ingot", + "minecraft:gold_ingot" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:netherite_ingot", + "count": 9 + }, + "ingredients": [ + "minecraft:netherite_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:netherite_upgrade_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:netherrack", + "S": "minecraft:netherite_upgrade_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:note_block", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "#minecraft:planks", + "X": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:oak_button", + "count": 1 + }, + "ingredients": [ + "minecraft:oak_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:oak_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:oak_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_oak_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:oak_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:oak_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:oak_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oak_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:observer", + "count": 1 + }, + "pattern": [ + "###", + "RRQ", + "###" + ], + "key": { + "#": "minecraft:cobblestone", + "Q": "minecraft:quartz", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:orange_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:orange_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:orange_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:orange_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:orange_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:open_eyeblossom" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:orange_tulip" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:red_dye", + "minecraft:yellow_dye" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:orange_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:torchflower" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:orange_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:orange_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:orange_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:orange_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:orange_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:orange_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oxidized_chiseled_copper", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:oxidized_cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oxidized_copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:oxidized_copper", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oxidized_copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:oxidized_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oxidized_cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:oxidized_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oxidized_cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:oxidized_cut_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:oxidized_cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:oxidized_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:packed_ice", + "count": 1 + }, + "ingredients": [ + "minecraft:ice", + "minecraft:ice", + "minecraft:ice", + "minecraft:ice", + "minecraft:ice", + "minecraft:ice", + "minecraft:ice", + "minecraft:ice", + "minecraft:ice" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:packed_mud", + "count": 1 + }, + "ingredients": [ + "minecraft:mud", + "minecraft:wheat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:painting", + "count": 1 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:wool" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_moss_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:pale_moss_block" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pale_oak_button", + "count": 1 + }, + "ingredients": [ + "minecraft:pale_oak_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pale_oak_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:pale_oak_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_pale_oak_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pale_oak_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:pale_oak_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_pale_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:pale_oak_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:pale_oak_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pale_oak_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:pale_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:paper", + "count": 3 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:sugar_cane" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:pink_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:pink_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:pink_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:pink_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:pink_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:cactus_flower" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:peony" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:pink_petals" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:pink_tulip" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pink_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:red_dye", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:pink_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:pink_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:pink_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:pink_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:pink_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:pink_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:piston", + "count": 1 + }, + "pattern": [ + "TTT", + "#X#", + "#R#" + ], + "key": { + "#": "minecraft:cobblestone", + "R": "minecraft:redstone", + "T": "#minecraft:planks", + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_andesite", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:andesite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_andesite_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_andesite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_andesite_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_andesite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_basalt", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:basalt" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_blackstone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_blackstone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:polished_blackstone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:polished_blackstone" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:polished_blackstone_button", + "count": 1 + }, + "ingredients": [ + "minecraft:polished_blackstone" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:polished_blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_blackstone_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:polished_blackstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_cinnabar", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_cinnabar_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_cinnabar_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_cinnabar_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:polished_cinnabar" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_deepslate", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:cobbled_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_deepslate_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_deepslate_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_deepslate_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:polished_deepslate" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_diorite", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:diorite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_diorite_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_diorite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_diorite_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_diorite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_granite", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:granite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_granite_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_granite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_granite_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_granite" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_sulfur", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:sulfur" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_sulfur_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_sulfur" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_sulfur_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_sulfur" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_sulfur_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:polished_sulfur" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_tuff", + "count": 4 + }, + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": "minecraft:tuff" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_tuff_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:polished_tuff" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_tuff_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:polished_tuff" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:polished_tuff_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:polished_tuff" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:potent_sulfur", + "count": 1 + }, + "ingredients": [ + "minecraft:sulfur", + "minecraft:sulfur", + "minecraft:sulfur", + "minecraft:sulfur", + "minecraft:sulfur", + "minecraft:sulfur", + "minecraft:sulfur", + "minecraft:sulfur", + "minecraft:sulfur" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:powered_rail", + "count": 6 + }, + "pattern": [ + "X X", + "X#X", + "XRX" + ], + "key": { + "#": "minecraft:stick", + "R": "minecraft:redstone", + "X": "minecraft:gold_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:prismarine", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:prismarine_shard" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:prismarine_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:prismarine_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:prismarine_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:prismarine_bricks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:prismarine_bricks", + "count": 1 + }, + "ingredients": [ + "minecraft:prismarine_shard", + "minecraft:prismarine_shard", + "minecraft:prismarine_shard", + "minecraft:prismarine_shard", + "minecraft:prismarine_shard", + "minecraft:prismarine_shard", + "minecraft:prismarine_shard", + "minecraft:prismarine_shard", + "minecraft:prismarine_shard" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:prismarine_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:prismarine" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:prismarine_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:prismarine" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:prismarine_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:prismarine" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pumpkin_pie", + "count": 1 + }, + "ingredients": [ + "minecraft:pumpkin", + "minecraft:sugar", + "#minecraft:eggs" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:pumpkin_seeds", + "count": 4 + }, + "ingredients": [ + "minecraft:pumpkin" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:purple_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:purple_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:purple_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:purple_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:purple_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:purple_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:purple_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:purple_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:blue_dye", + "minecraft:red_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:purple_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:purple_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:purple_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:purple_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purple_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:purple_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purpur_block", + "count": 4 + }, + "pattern": [ + "FF", + "FF" + ], + "key": { + "F": "minecraft:popped_chorus_fruit" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purpur_pillar", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:purpur_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purpur_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": [ + "minecraft:purpur_block", + "minecraft:purpur_pillar" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:purpur_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + "minecraft:purpur_block", + "minecraft:purpur_pillar" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:quartz_block", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:quartz" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:quartz_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:quartz_block" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:quartz_pillar", + "count": 2 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:quartz_block" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:quartz_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": [ + "minecraft:chiseled_quartz_block", + "minecraft:quartz_block", + "minecraft:quartz_pillar" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:quartz_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + "minecraft:chiseled_quartz_block", + "minecraft:quartz_block", + "minecraft:quartz_pillar" + ] + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:rabbit_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:baked_potato", + "minecraft:cooked_rabbit", + "minecraft:bowl", + "minecraft:carrot", + "minecraft:brown_mushroom" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:rabbit_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:baked_potato", + "minecraft:cooked_rabbit", + "minecraft:bowl", + "minecraft:carrot", + "minecraft:red_mushroom" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:rail", + "count": 16 + }, + "pattern": [ + "X X", + "X#X", + "X X" + ], + "key": { + "#": "minecraft:stick", + "X": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:raiser_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:terracotta", + "S": "minecraft:raiser_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:raw_copper", + "count": 9 + }, + "ingredients": [ + "minecraft:raw_copper_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:raw_copper_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:raw_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:raw_gold", + "count": 9 + }, + "ingredients": [ + "minecraft:raw_gold_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:raw_gold_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:raw_gold" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:raw_iron", + "count": 9 + }, + "ingredients": [ + "minecraft:raw_iron_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:raw_iron_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:raw_iron" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:recovery_compass", + "count": 1 + }, + "pattern": [ + "SSS", + "SCS", + "SSS" + ], + "key": { + "C": "minecraft:compass", + "S": "minecraft:echo_shard" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:red_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:red_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:red_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:red_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:red_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:beetroot" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:poppy" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:rose_bush" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:red_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:red_tulip" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:red_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_nether_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:red_nether_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_nether_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:red_nether_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_nether_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:red_nether_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_nether_bricks", + "count": 1 + }, + "pattern": [ + "NW", + "WN" + ], + "key": { + "N": "minecraft:nether_brick", + "W": "minecraft:nether_wart" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_sandstone", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:red_sand" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_sandstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": [ + "minecraft:red_sandstone", + "minecraft:chiseled_red_sandstone" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_sandstone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + "minecraft:red_sandstone", + "minecraft:chiseled_red_sandstone", + "minecraft:cut_red_sandstone" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_sandstone_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:red_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:red_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:red_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:red_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:red_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:red_dye" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:redstone", + "count": 9 + }, + "ingredients": [ + "minecraft:redstone_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:redstone_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:redstone_lamp", + "count": 1 + }, + "pattern": [ + " R ", + "RGR", + " R " + ], + "key": { + "G": "minecraft:glowstone", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:redstone_torch", + "count": 1 + }, + "pattern": [ + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:repeater", + "count": 1 + }, + "pattern": [ + "#X#", + "III" + ], + "key": { + "#": "minecraft:redstone_torch", + "I": "minecraft:stone", + "X": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:resin_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:resin_clump" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:resin_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:resin_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:resin_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:resin_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:resin_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:resin_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:resin_bricks", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:resin_brick" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:resin_clump", + "count": 9 + }, + "ingredients": [ + "minecraft:resin_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:respawn_anchor", + "count": 1 + }, + "pattern": [ + "OOO", + "GGG", + "OOO" + ], + "key": { + "G": "minecraft:glowstone", + "O": "minecraft:crying_obsidian" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:rib_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:netherrack", + "S": "minecraft:rib_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:saddle", + "count": 1 + }, + "pattern": [ + " X ", + "X#X" + ], + "key": { + "#": "minecraft:iron_ingot", + "X": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sandstone", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:sand" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sandstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": [ + "minecraft:sandstone", + "minecraft:chiseled_sandstone" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sandstone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + "minecraft:sandstone", + "minecraft:chiseled_sandstone", + "minecraft:cut_sandstone" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sandstone_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:scaffolding", + "count": 6 + }, + "pattern": [ + "I~I", + "I I", + "I I" + ], + "key": { + "I": "minecraft:bamboo", + "~": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sea_lantern", + "count": 1 + }, + "pattern": [ + "SCS", + "CCC", + "SCS" + ], + "key": { + "C": "minecraft:prismarine_crystals", + "S": "minecraft:prismarine_shard" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sentry_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:cobblestone", + "S": "minecraft:sentry_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:shaper_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:terracotta", + "S": "minecraft:shaper_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:shears", + "count": 1 + }, + "pattern": [ + " #", + "# " + ], + "key": { + "#": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:shield", + "count": 1 + }, + "pattern": [ + "WoW", + "WWW", + " W " + ], + "key": { + "W": "#minecraft:wooden_tool_materials", + "o": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:shulker_box", + "count": 1 + }, + "pattern": [ + "-", + "#", + "-" + ], + "key": { + "#": "minecraft:chest", + "-": "minecraft:shulker_shell" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:silence_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:cobbled_deepslate", + "S": "minecraft:silence_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:skull_banner_pattern", + "count": 1 + }, + "ingredients": [ + "minecraft:paper", + "minecraft:wither_skeleton_skull" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:slime_ball", + "count": 9 + }, + "ingredients": [ + "minecraft:slime_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:slime_block", + "count": 1 + }, + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": "minecraft:slime_ball" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smithing_table", + "count": 1 + }, + "pattern": [ + "@@", + "##", + "##" + ], + "key": { + "#": "#minecraft:planks", + "@": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smoker", + "count": 1 + }, + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": "#minecraft:logs", + "X": "minecraft:furnace" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smooth_quartz_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:smooth_quartz" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smooth_quartz_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:smooth_quartz" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smooth_red_sandstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:smooth_red_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smooth_red_sandstone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:smooth_red_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smooth_sandstone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:smooth_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smooth_sandstone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:smooth_sandstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:smooth_stone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:smooth_stone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:snout_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:blackstone", + "S": "minecraft:snout_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:snow", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:snow_block" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:snow_block", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:snowball" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:soul_campfire", + "count": 1 + }, + "pattern": [ + " S ", + "S#S", + "LLL" + ], + "key": { + "#": "#minecraft:soul_fire_base_blocks", + "L": "#minecraft:logs", + "S": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:soul_lantern", + "count": 1 + }, + "pattern": [ + "XXX", + "X#X", + "XXX" + ], + "key": { + "#": "minecraft:soul_torch", + "X": "minecraft:iron_nugget" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:soul_torch", + "count": 4 + }, + "pattern": [ + "X", + "#", + "S" + ], + "key": { + "#": "minecraft:stick", + "S": "#minecraft:soul_fire_base_blocks", + "X": [ + "minecraft:coal", + "minecraft:charcoal" + ] + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spectral_arrow", + "count": 2 + }, + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": "minecraft:glowstone_dust", + "X": "minecraft:arrow" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spire_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:purpur_block", + "S": "minecraft:spire_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_boat", + "count": 1 + }, + "pattern": [ + "# #", + "###" + ], + "key": { + "#": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:spruce_button", + "count": 1 + }, + "ingredients": [ + "minecraft:spruce_planks" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:spruce_chest_boat", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:spruce_boat" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_spruce_log", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:spruce_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:spruce_logs" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_spruce_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:spruce_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:spruce_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spruce_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:spruce_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:spyglass", + "count": 1 + }, + "pattern": [ + " # ", + " X ", + " X " + ], + "key": { + "#": "minecraft:amethyst_shard", + "X": "minecraft:copper_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stick", + "count": 4 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stick", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:bamboo" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sticky_piston", + "count": 1 + }, + "pattern": [ + "S", + "P" + ], + "key": { + "P": "minecraft:piston", + "S": "minecraft:slime_ball" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_axe", + "count": 1 + }, + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:stone_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:stone_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stone" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:stone_button", + "count": 1 + }, + "ingredients": [ + "minecraft:stone" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_hoe", + "count": 1 + }, + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:stone_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_pickaxe", + "count": 1 + }, + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:stone_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:stone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_shovel", + "count": 1 + }, + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:stone_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:stone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_spear", + "count": 1 + }, + "pattern": [ + " X", + " # ", + "# " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:stone_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:stone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stone_sword", + "count": 1 + }, + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:stone_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stonecutter", + "count": 1 + }, + "pattern": [ + " I ", + "###" + ], + "key": { + "#": "minecraft:stone", + "I": "minecraft:iron_ingot" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_acacia_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_acacia_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_birch_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_birch_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_cherry_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_cherry_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_crimson_hyphae", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_crimson_stem" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_dark_oak_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_dark_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_jungle_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_jungle_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_mangrove_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_mangrove_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_oak_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_pale_oak_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_pale_oak_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_spruce_wood", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_spruce_log" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:stripped_warped_hyphae", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:stripped_warped_stem" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:sugar", + "count": 3 + }, + "ingredients": [ + "minecraft:honey_bottle" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:sugar", + "count": 1 + }, + "ingredients": [ + "minecraft:sugar_cane" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:sulfur_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:sulfur_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:sulfur_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:polished_sulfur" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:sulfur_spike" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:sulfur" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:sulfur" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:sulfur_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:sulfur" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:allium" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:azure_bluet" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:blue_orchid" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:closed_eyeblossom" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:cornflower" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:dandelion" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:golden_dandelion" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:lily_of_the_valley" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:open_eyeblossom" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:orange_tulip" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:oxeye_daisy" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:pink_tulip" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:poppy" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:red_tulip" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:torchflower" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:white_tulip" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:suspicious_stew", + "count": 1 + }, + "ingredients": [ + "minecraft:bowl", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:wither_rose" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:target", + "count": 1 + }, + "pattern": [ + " R ", + "RHR", + " R " + ], + "key": { + "H": "minecraft:hay_block", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tide_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:prismarine", + "S": "minecraft:tide_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tinted_glass", + "count": 2 + }, + "pattern": [ + " S ", + "SGS", + " S " + ], + "key": { + "G": "minecraft:glass", + "S": "minecraft:amethyst_shard" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tnt", + "count": 1 + }, + "pattern": [ + "X#X", + "#X#", + "X#X" + ], + "key": { + "#": [ + "minecraft:sand", + "minecraft:red_sand" + ], + "X": "minecraft:gunpowder" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:tnt_minecart", + "count": 1 + }, + "ingredients": [ + "minecraft:tnt", + "minecraft:minecart" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:torch", + "count": 4 + }, + "pattern": [ + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": [ + "minecraft:coal", + "minecraft:charcoal" + ] + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:trapped_chest", + "count": 1 + }, + "ingredients": [ + "minecraft:chest", + "minecraft:tripwire_hook" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tripwire_hook", + "count": 2 + }, + "pattern": [ + "I", + "S", + "#" + ], + "key": { + "#": "#minecraft:planks", + "I": "minecraft:iron_ingot", + "S": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tuff_brick_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:tuff_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tuff_brick_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:tuff_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tuff_brick_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:tuff_bricks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tuff_bricks", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:polished_tuff" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tuff_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:tuff" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tuff_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:tuff" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:tuff_wall", + "count": 6 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:tuff" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:turtle_helmet", + "count": 1 + }, + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": "minecraft:turtle_scute" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:vex_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:cobblestone", + "S": "minecraft:vex_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:ward_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:cobbled_deepslate", + "S": "minecraft:ward_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:warped_button", + "count": 1 + }, + "ingredients": [ + "minecraft:warped_planks" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_door", + "count": 3 + }, + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": "minecraft:warped_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_fence", + "count": 3 + }, + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:warped_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_fence_gate", + "count": 1 + }, + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": "minecraft:stick", + "W": "minecraft:warped_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_fungus_on_a_stick", + "count": 1 + }, + "pattern": [ + "# ", + " X" + ], + "key": { + "#": "minecraft:fishing_rod", + "X": "minecraft:warped_fungus" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_hanging_sign", + "count": 6 + }, + "pattern": [ + "X X", + "###", + "###" + ], + "key": { + "#": "minecraft:stripped_warped_stem", + "X": "minecraft:iron_chain" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_hyphae", + "count": 3 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:warped_stem" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:warped_planks", + "count": 4 + }, + "ingredients": [ + "#minecraft:warped_stems" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_pressure_plate", + "count": 1 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:warped_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_shelf", + "count": 6 + }, + "pattern": [ + "###", + " ", + "###" + ], + "key": { + "#": "minecraft:stripped_warped_stem" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_sign", + "count": 3 + }, + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": "minecraft:warped_planks", + "X": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:warped_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:warped_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:warped_trapdoor", + "count": 2 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:warped_planks" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_chiseled_copper", + "count": 1 + }, + "pattern": [ + " M ", + " M " + ], + "key": { + "M": "minecraft:waxed_cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_chiseled_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:chiseled_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_bars", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_bars", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_block", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_block", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:waxed_copper_block", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_bulb", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_bulb", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_chain", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_chain", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_chest", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_chest", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_door", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_door", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_golem_statue", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_golem_statue", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:waxed_copper_block" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_grate", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_grate", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_lantern", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_lantern", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_copper_trapdoor", + "count": 1 + }, + "ingredients": [ + "minecraft:copper_trapdoor", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:waxed_copper_block" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_cut_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:cut_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:waxed_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_cut_copper_slab", + "count": 1 + }, + "ingredients": [ + "minecraft:cut_copper_slab", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:waxed_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_cut_copper_stairs", + "count": 1 + }, + "ingredients": [ + "minecraft:cut_copper_stairs", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_exposed_chiseled_copper", + "count": 1 + }, + "pattern": [ + " M ", + " M " + ], + "key": { + "M": "minecraft:waxed_exposed_cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_chiseled_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_chiseled_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_bars", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_bars", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_exposed_copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:waxed_exposed_copper", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_bulb", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_bulb", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_chain", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_chain", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_chest", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_chest", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_door", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_door", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_golem_statue", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_golem_statue", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_exposed_copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:waxed_exposed_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_grate", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_grate", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_lantern", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_lantern", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_copper_trapdoor", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_copper_trapdoor", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_exposed_cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:waxed_exposed_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_cut_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_cut_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_exposed_cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:waxed_exposed_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_cut_copper_slab", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_cut_copper_slab", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_exposed_cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:waxed_exposed_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_cut_copper_stairs", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_cut_copper_stairs", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_exposed_lightning_rod", + "count": 1 + }, + "ingredients": [ + "minecraft:exposed_lightning_rod", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_lightning_rod", + "count": 1 + }, + "ingredients": [ + "minecraft:lightning_rod", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_oxidized_chiseled_copper", + "count": 1 + }, + "pattern": [ + " M ", + " M " + ], + "key": { + "M": "minecraft:waxed_oxidized_cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_chiseled_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_chiseled_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_bars", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_bars", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_oxidized_copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:waxed_oxidized_copper", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_bulb", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_bulb", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_chain", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_chain", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_chest", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_chest", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_door", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_door", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_golem_statue", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_golem_statue", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_oxidized_copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:waxed_oxidized_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_grate", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_grate", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_lantern", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_lantern", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_copper_trapdoor", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_copper_trapdoor", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_oxidized_cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:waxed_oxidized_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_cut_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_cut_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_oxidized_cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:waxed_oxidized_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_cut_copper_slab", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_cut_copper_slab", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_oxidized_cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:waxed_oxidized_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_cut_copper_stairs", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_cut_copper_stairs", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_oxidized_lightning_rod", + "count": 1 + }, + "ingredients": [ + "minecraft:oxidized_lightning_rod", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_weathered_chiseled_copper", + "count": 1 + }, + "pattern": [ + " M ", + " M " + ], + "key": { + "M": "minecraft:waxed_weathered_cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_chiseled_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_chiseled_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_bars", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_bars", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_weathered_copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:waxed_weathered_copper", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_bulb", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_bulb", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_chain", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_chain", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_chest", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_chest", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_door", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_door", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_golem_statue", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_golem_statue", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_weathered_copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:waxed_weathered_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_grate", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_grate", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_lantern", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_lantern", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_copper_trapdoor", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_copper_trapdoor", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_weathered_cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:waxed_weathered_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_cut_copper", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_cut_copper", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_weathered_cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:waxed_weathered_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_cut_copper_slab", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_cut_copper_slab", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:waxed_weathered_cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:waxed_weathered_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_cut_copper_stairs", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_cut_copper_stairs", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:waxed_weathered_lightning_rod", + "count": 1 + }, + "ingredients": [ + "minecraft:weathered_lightning_rod", + "minecraft:honeycomb" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wayfinder_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:terracotta", + "S": "minecraft:wayfinder_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:weathered_chiseled_copper", + "count": 1 + }, + "pattern": [ + "#", + "#" + ], + "key": { + "#": "minecraft:weathered_cut_copper_slab" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:weathered_copper_bulb", + "count": 4 + }, + "pattern": [ + " C ", + "CBC", + " R " + ], + "key": { + "B": "minecraft:blaze_rod", + "C": "minecraft:weathered_copper", + "R": "minecraft:redstone" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:weathered_copper_grate", + "count": 4 + }, + "pattern": [ + " M ", + "M M", + " M " + ], + "key": { + "M": "minecraft:weathered_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:weathered_cut_copper", + "count": 4 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:weathered_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:weathered_cut_copper_slab", + "count": 6 + }, + "pattern": [ + "###" + ], + "key": { + "#": "minecraft:weathered_cut_copper" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:weathered_cut_copper_stairs", + "count": 4 + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": "minecraft:weathered_cut_copper" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:wheat", + "count": 9 + }, + "ingredients": [ + "minecraft:hay_block" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:white_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:white_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:white_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:white_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:white_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:bone_meal" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:white_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:lily_of_the_valley" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:white_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:white_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:white_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:white_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:white_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:white_wool", + "count": 1 + }, + "pattern": [ + "##", + "##" + ], + "key": { + "#": "minecraft:string" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wild_armor_trim_smithing_template", + "count": 2 + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "key": { + "#": "minecraft:diamond", + "C": "minecraft:mossy_cobblestone", + "S": "minecraft:wild_armor_trim_smithing_template" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:wind_charge", + "count": 4 + }, + "ingredients": [ + "minecraft:breeze_rod" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wolf_armor", + "count": 1 + }, + "pattern": [ + "X ", + "XXX", + "X X" + ], + "key": { + "X": "minecraft:armadillo_scute" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wooden_axe", + "count": 1 + }, + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:wooden_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wooden_hoe", + "count": 1 + }, + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:wooden_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wooden_pickaxe", + "count": 1 + }, + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:wooden_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wooden_shovel", + "count": 1 + }, + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:wooden_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wooden_spear", + "count": 1 + }, + "pattern": [ + " X", + " # ", + "# " + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:wooden_tool_materials" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:wooden_sword", + "count": 1 + }, + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": "minecraft:stick", + "X": "#minecraft:wooden_tool_materials" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:writable_book", + "count": 1 + }, + "ingredients": [ + "minecraft:book", + "minecraft:ink_sac", + "minecraft:feather" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_banner", + "count": 1 + }, + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": "minecraft:yellow_wool", + "|": "minecraft:stick" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_bed", + "count": 1 + }, + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": "minecraft:yellow_wool", + "X": "#minecraft:planks" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_candle", + "count": 1 + }, + "ingredients": [ + "minecraft:candle", + "minecraft:yellow_dye" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_carpet", + "count": 3 + }, + "pattern": [ + "##" + ], + "key": { + "#": "minecraft:yellow_wool" + } + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_concrete_powder", + "count": 8 + }, + "ingredients": [ + "minecraft:yellow_dye", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:sand", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel", + "minecraft:gravel" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:dandelion" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:golden_dandelion" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_dye", + "count": 2 + }, + "ingredients": [ + "minecraft:sunflower" + ] + }, + { + "type": "minecraft:crafting_shapeless", + "result": { + "item": "minecraft:yellow_dye", + "count": 1 + }, + "ingredients": [ + "minecraft:wildflowers" + ] + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_harness", + "count": 1 + }, + "pattern": [ + "LLL", + "G#G" + ], + "key": { + "#": "minecraft:yellow_wool", + "G": "minecraft:glass", + "L": "minecraft:leather" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_stained_glass", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:glass", + "X": "minecraft:yellow_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_stained_glass_pane", + "count": 16 + }, + "pattern": [ + "###", + "###" + ], + "key": { + "#": "minecraft:yellow_stained_glass" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_stained_glass_pane", + "count": 8 + }, + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": "minecraft:glass_pane", + "$": "minecraft:yellow_dye" + } + }, + { + "type": "minecraft:crafting_shaped", + "result": { + "item": "minecraft:yellow_terracotta", + "count": 8 + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": "minecraft:terracotta", + "X": "minecraft:yellow_dye" + } + } + ] + }, + "itemLookup": { + "minecraft:acacia_boat": 1, + "minecraft:acacia_button": 2, + "minecraft:acacia_chest_boat": 3, + "minecraft:acacia_door": 4, + "minecraft:acacia_fence": 5, + "minecraft:acacia_fence_gate": 6, + "minecraft:acacia_hanging_sign": 7, + "minecraft:acacia_planks": 8, + "minecraft:acacia_pressure_plate": 9, + "minecraft:acacia_shelf": 10, + "minecraft:acacia_sign": 11, + "minecraft:acacia_slab": 12, + "minecraft:acacia_stairs": 13, + "minecraft:acacia_trapdoor": 14, + "minecraft:acacia_wood": 15, + "minecraft:activator_rail": 16, + "minecraft:amethyst_block": 17, + "minecraft:andesite": 18, + "minecraft:andesite_slab": 19, + "minecraft:andesite_stairs": 20, + "minecraft:andesite_wall": 21, + "minecraft:anvil": 22, + "minecraft:armor_stand": 23, + "minecraft:arrow": 24, + "minecraft:bamboo_block": 25, + "minecraft:bamboo_button": 26, + "minecraft:bamboo_chest_raft": 27, + "minecraft:bamboo_door": 28, + "minecraft:bamboo_fence": 29, + "minecraft:bamboo_fence_gate": 30, + "minecraft:bamboo_hanging_sign": 31, + "minecraft:bamboo_mosaic": 32, + "minecraft:bamboo_mosaic_slab": 33, + "minecraft:bamboo_mosaic_stairs": 34, + "minecraft:bamboo_planks": 35, + "minecraft:bamboo_pressure_plate": 36, + "minecraft:bamboo_raft": 37, + "minecraft:bamboo_shelf": 38, + "minecraft:bamboo_sign": 39, + "minecraft:bamboo_slab": 40, + "minecraft:bamboo_stairs": 41, + "minecraft:bamboo_trapdoor": 42, + "minecraft:barrel": 43, + "minecraft:beacon": 44, + "minecraft:beehive": 45, + "minecraft:beetroot_soup": 46, + "minecraft:birch_boat": 47, + "minecraft:birch_button": 48, + "minecraft:birch_chest_boat": 49, + "minecraft:birch_door": 50, + "minecraft:birch_fence": 51, + "minecraft:birch_fence_gate": 52, + "minecraft:birch_hanging_sign": 53, + "minecraft:birch_planks": 54, + "minecraft:birch_pressure_plate": 55, + "minecraft:birch_shelf": 56, + "minecraft:birch_sign": 57, + "minecraft:birch_slab": 58, + "minecraft:birch_stairs": 59, + "minecraft:birch_trapdoor": 60, + "minecraft:birch_wood": 61, + "minecraft:black_banner": 62, + "minecraft:black_bed": 63, + "minecraft:black_bundle": 64, + "minecraft:black_candle": 65, + "minecraft:black_carpet": 66, + "minecraft:black_concrete_powder": 67, + "minecraft:black_dye": 68, + "minecraft:black_harness": 69, + "minecraft:black_shulker_box": 70, + "minecraft:black_stained_glass": 71, + "minecraft:black_stained_glass_pane": 72, + "minecraft:black_terracotta": 73, + "minecraft:black_wool": 74, + "minecraft:blackstone_slab": 75, + "minecraft:blackstone_stairs": 76, + "minecraft:blackstone_wall": 77, + "minecraft:blast_furnace": 78, + "minecraft:blaze_powder": 79, + "minecraft:blue_banner": 80, + "minecraft:blue_bed": 81, + "minecraft:blue_bundle": 82, + "minecraft:blue_candle": 83, + "minecraft:blue_carpet": 84, + "minecraft:blue_concrete_powder": 85, + "minecraft:blue_dye": 86, + "minecraft:blue_harness": 87, + "minecraft:blue_ice": 88, + "minecraft:blue_shulker_box": 89, + "minecraft:blue_stained_glass": 90, + "minecraft:blue_stained_glass_pane": 91, + "minecraft:blue_terracotta": 92, + "minecraft:blue_wool": 93, + "minecraft:bolt_armor_trim_smithing_template": 94, + "minecraft:bone_block": 95, + "minecraft:bone_meal": 96, + "minecraft:book": 97, + "minecraft:bookshelf": 98, + "minecraft:bordure_indented_banner_pattern": 99, + "minecraft:bow": 100, + "minecraft:bowl": 101, + "minecraft:bread": 102, + "minecraft:brewing_stand": 103, + "minecraft:brick_slab": 104, + "minecraft:brick_stairs": 105, + "minecraft:brick_wall": 106, + "minecraft:bricks": 107, + "minecraft:brown_banner": 108, + "minecraft:brown_bed": 109, + "minecraft:brown_bundle": 110, + "minecraft:brown_candle": 111, + "minecraft:brown_carpet": 112, + "minecraft:brown_concrete_powder": 113, + "minecraft:brown_dye": 114, + "minecraft:brown_harness": 115, + "minecraft:brown_shulker_box": 116, + "minecraft:brown_stained_glass": 117, + "minecraft:brown_stained_glass_pane": 118, + "minecraft:brown_terracotta": 119, + "minecraft:brown_wool": 120, + "minecraft:brush": 121, + "minecraft:bucket": 122, + "minecraft:bundle": 123, + "minecraft:cake": 124, + "minecraft:calibrated_sculk_sensor": 125, + "minecraft:campfire": 126, + "minecraft:candle": 127, + "minecraft:carrot_on_a_stick": 128, + "minecraft:cartography_table": 129, + "minecraft:cauldron": 130, + "minecraft:cherry_boat": 131, + "minecraft:cherry_button": 132, + "minecraft:cherry_chest_boat": 133, + "minecraft:cherry_door": 134, + "minecraft:cherry_fence": 135, + "minecraft:cherry_fence_gate": 136, + "minecraft:cherry_hanging_sign": 137, + "minecraft:cherry_planks": 138, + "minecraft:cherry_pressure_plate": 139, + "minecraft:cherry_shelf": 140, + "minecraft:cherry_sign": 141, + "minecraft:cherry_slab": 142, + "minecraft:cherry_stairs": 143, + "minecraft:cherry_trapdoor": 144, + "minecraft:cherry_wood": 145, + "minecraft:chest": 146, + "minecraft:chest_minecart": 147, + "minecraft:chiseled_bookshelf": 148, + "minecraft:chiseled_cinnabar": 149, + "minecraft:chiseled_copper": 150, + "minecraft:chiseled_deepslate": 151, + "minecraft:chiseled_nether_bricks": 152, + "minecraft:chiseled_polished_blackstone": 153, + "minecraft:chiseled_quartz_block": 154, + "minecraft:chiseled_red_sandstone": 155, + "minecraft:chiseled_resin_bricks": 156, + "minecraft:chiseled_sandstone": 157, + "minecraft:chiseled_stone_bricks": 158, + "minecraft:chiseled_sulfur": 159, + "minecraft:chiseled_tuff": 160, + "minecraft:chiseled_tuff_bricks": 161, + "minecraft:cinnabar_brick_slab": 162, + "minecraft:cinnabar_brick_stairs": 163, + "minecraft:cinnabar_brick_wall": 164, + "minecraft:cinnabar_bricks": 165, + "minecraft:cinnabar_slab": 166, + "minecraft:cinnabar_stairs": 167, + "minecraft:cinnabar_wall": 168, + "minecraft:clay": 169, + "minecraft:clock": 170, + "minecraft:coal": 171, + "minecraft:coal_block": 172, + "minecraft:coarse_dirt": 173, + "minecraft:coast_armor_trim_smithing_template": 174, + "minecraft:cobbled_deepslate_slab": 175, + "minecraft:cobbled_deepslate_stairs": 176, + "minecraft:cobbled_deepslate_wall": 177, + "minecraft:cobblestone_slab": 178, + "minecraft:cobblestone_stairs": 179, + "minecraft:cobblestone_wall": 180, + "minecraft:comparator": 181, + "minecraft:compass": 182, + "minecraft:composter": 183, + "minecraft:conduit": 184, + "minecraft:cookie": 185, + "minecraft:copper_axe": 186, + "minecraft:copper_bars": 187, + "minecraft:copper_block": 188, + "minecraft:copper_boots": 189, + "minecraft:copper_bulb": 190, + "minecraft:copper_chain": 191, + "minecraft:copper_chest": 192, + "minecraft:copper_chestplate": 193, + "minecraft:copper_door": 194, + "minecraft:copper_grate": 195, + "minecraft:copper_helmet": 196, + "minecraft:copper_hoe": 197, + "minecraft:copper_ingot": 198, + "minecraft:copper_lantern": 199, + "minecraft:copper_leggings": 200, + "minecraft:copper_nugget": 201, + "minecraft:copper_pickaxe": 202, + "minecraft:copper_shovel": 203, + "minecraft:copper_spear": 204, + "minecraft:copper_sword": 205, + "minecraft:copper_torch": 206, + "minecraft:copper_trapdoor": 207, + "minecraft:crafter": 208, + "minecraft:crafting_table": 209, + "minecraft:creaking_heart": 210, + "minecraft:creeper_banner_pattern": 211, + "minecraft:crimson_button": 212, + "minecraft:crimson_door": 213, + "minecraft:crimson_fence": 214, + "minecraft:crimson_fence_gate": 215, + "minecraft:crimson_hanging_sign": 216, + "minecraft:crimson_hyphae": 217, + "minecraft:crimson_planks": 218, + "minecraft:crimson_pressure_plate": 219, + "minecraft:crimson_shelf": 220, + "minecraft:crimson_sign": 221, + "minecraft:crimson_slab": 222, + "minecraft:crimson_stairs": 223, + "minecraft:crimson_trapdoor": 224, + "minecraft:crossbow": 225, + "minecraft:cut_copper": 226, + "minecraft:cut_copper_slab": 227, + "minecraft:cut_copper_stairs": 228, + "minecraft:cut_red_sandstone": 229, + "minecraft:cut_red_sandstone_slab": 230, + "minecraft:cut_sandstone": 231, + "minecraft:cut_sandstone_slab": 232, + "minecraft:cyan_banner": 233, + "minecraft:cyan_bed": 234, + "minecraft:cyan_bundle": 235, + "minecraft:cyan_candle": 236, + "minecraft:cyan_carpet": 237, + "minecraft:cyan_concrete_powder": 238, + "minecraft:cyan_dye": 239, + "minecraft:cyan_harness": 240, + "minecraft:cyan_shulker_box": 241, + "minecraft:cyan_stained_glass": 242, + "minecraft:cyan_stained_glass_pane": 243, + "minecraft:cyan_terracotta": 244, + "minecraft:cyan_wool": 245, + "minecraft:dark_oak_boat": 246, + "minecraft:dark_oak_button": 247, + "minecraft:dark_oak_chest_boat": 248, + "minecraft:dark_oak_door": 249, + "minecraft:dark_oak_fence": 250, + "minecraft:dark_oak_fence_gate": 251, + "minecraft:dark_oak_hanging_sign": 252, + "minecraft:dark_oak_planks": 253, + "minecraft:dark_oak_pressure_plate": 254, + "minecraft:dark_oak_shelf": 255, + "minecraft:dark_oak_sign": 256, + "minecraft:dark_oak_slab": 257, + "minecraft:dark_oak_stairs": 258, + "minecraft:dark_oak_trapdoor": 259, + "minecraft:dark_oak_wood": 260, + "minecraft:dark_prismarine": 261, + "minecraft:dark_prismarine_slab": 262, + "minecraft:dark_prismarine_stairs": 263, + "minecraft:daylight_detector": 264, + "minecraft:decorated_pot": 265, + "minecraft:deepslate_brick_slab": 266, + "minecraft:deepslate_brick_stairs": 267, + "minecraft:deepslate_brick_wall": 268, + "minecraft:deepslate_bricks": 269, + "minecraft:deepslate_tile_slab": 270, + "minecraft:deepslate_tile_stairs": 271, + "minecraft:deepslate_tile_wall": 272, + "minecraft:deepslate_tiles": 273, + "minecraft:detector_rail": 274, + "minecraft:diamond": 275, + "minecraft:diamond_axe": 276, + "minecraft:diamond_block": 277, + "minecraft:diamond_boots": 278, + "minecraft:diamond_chestplate": 279, + "minecraft:diamond_helmet": 280, + "minecraft:diamond_hoe": 281, + "minecraft:diamond_leggings": 282, + "minecraft:diamond_pickaxe": 283, + "minecraft:diamond_shovel": 284, + "minecraft:diamond_spear": 285, + "minecraft:diamond_sword": 286, + "minecraft:diorite": 287, + "minecraft:diorite_slab": 288, + "minecraft:diorite_stairs": 289, + "minecraft:diorite_wall": 290, + "minecraft:dispenser": 291, + "minecraft:dried_ghast": 292, + "minecraft:dried_kelp": 293, + "minecraft:dried_kelp_block": 294, + "minecraft:dripstone_block": 295, + "minecraft:dropper": 296, + "minecraft:dune_armor_trim_smithing_template": 297, + "minecraft:emerald": 298, + "minecraft:emerald_block": 299, + "minecraft:enchanting_table": 300, + "minecraft:end_crystal": 301, + "minecraft:end_rod": 302, + "minecraft:end_stone_brick_slab": 303, + "minecraft:end_stone_brick_stairs": 304, + "minecraft:end_stone_brick_wall": 305, + "minecraft:end_stone_bricks": 306, + "minecraft:ender_chest": 307, + "minecraft:ender_eye": 308, + "minecraft:exposed_chiseled_copper": 309, + "minecraft:exposed_copper_bulb": 310, + "minecraft:exposed_copper_grate": 311, + "minecraft:exposed_cut_copper": 312, + "minecraft:exposed_cut_copper_slab": 313, + "minecraft:exposed_cut_copper_stairs": 314, + "minecraft:eye_armor_trim_smithing_template": 315, + "minecraft:fermented_spider_eye": 316, + "minecraft:field_masoned_banner_pattern": 317, + "minecraft:filled_map": 318, + "minecraft:fire_charge": 319, + "minecraft:firework_rocket": 320, + "minecraft:firework_star": 321, + "minecraft:fishing_rod": 322, + "minecraft:fletching_table": 323, + "minecraft:flint_and_steel": 324, + "minecraft:flow_armor_trim_smithing_template": 325, + "minecraft:flower_banner_pattern": 326, + "minecraft:flower_pot": 327, + "minecraft:furnace": 328, + "minecraft:furnace_minecart": 329, + "minecraft:glass_bottle": 330, + "minecraft:glass_pane": 331, + "minecraft:glistering_melon_slice": 332, + "minecraft:glow_item_frame": 333, + "minecraft:glowstone": 334, + "minecraft:gold_block": 335, + "minecraft:gold_ingot": 336, + "minecraft:gold_nugget": 337, + "minecraft:golden_apple": 338, + "minecraft:golden_axe": 339, + "minecraft:golden_boots": 340, + "minecraft:golden_carrot": 341, + "minecraft:golden_chestplate": 342, + "minecraft:golden_dandelion": 343, + "minecraft:golden_helmet": 344, + "minecraft:golden_hoe": 345, + "minecraft:golden_leggings": 346, + "minecraft:golden_pickaxe": 347, + "minecraft:golden_shovel": 348, + "minecraft:golden_spear": 349, + "minecraft:golden_sword": 350, + "minecraft:granite": 351, + "minecraft:granite_slab": 352, + "minecraft:granite_stairs": 353, + "minecraft:granite_wall": 354, + "minecraft:gray_banner": 355, + "minecraft:gray_bed": 356, + "minecraft:gray_bundle": 357, + "minecraft:gray_candle": 358, + "minecraft:gray_carpet": 359, + "minecraft:gray_concrete_powder": 360, + "minecraft:gray_dye": 361, + "minecraft:gray_harness": 362, + "minecraft:gray_shulker_box": 363, + "minecraft:gray_stained_glass": 364, + "minecraft:gray_stained_glass_pane": 365, + "minecraft:gray_terracotta": 366, + "minecraft:gray_wool": 367, + "minecraft:green_banner": 368, + "minecraft:green_bed": 369, + "minecraft:green_bundle": 370, + "minecraft:green_candle": 371, + "minecraft:green_carpet": 372, + "minecraft:green_concrete_powder": 373, + "minecraft:green_harness": 374, + "minecraft:green_shulker_box": 375, + "minecraft:green_stained_glass": 376, + "minecraft:green_stained_glass_pane": 377, + "minecraft:green_terracotta": 378, + "minecraft:green_wool": 379, + "minecraft:grindstone": 380, + "minecraft:hay_block": 381, + "minecraft:heavy_weighted_pressure_plate": 382, + "minecraft:honey_block": 383, + "minecraft:honey_bottle": 384, + "minecraft:honeycomb_block": 385, + "minecraft:hopper": 386, + "minecraft:hopper_minecart": 387, + "minecraft:host_armor_trim_smithing_template": 388, + "minecraft:iron_axe": 389, + "minecraft:iron_bars": 390, + "minecraft:iron_block": 391, + "minecraft:iron_boots": 392, + "minecraft:iron_chain": 393, + "minecraft:iron_chestplate": 394, + "minecraft:iron_door": 395, + "minecraft:iron_helmet": 396, + "minecraft:iron_hoe": 397, + "minecraft:iron_ingot": 398, + "minecraft:iron_leggings": 399, + "minecraft:iron_nugget": 400, + "minecraft:iron_pickaxe": 401, + "minecraft:iron_shovel": 402, + "minecraft:iron_spear": 403, + "minecraft:iron_sword": 404, + "minecraft:iron_trapdoor": 405, + "minecraft:item_frame": 406, + "minecraft:jack_o_lantern": 407, + "minecraft:jukebox": 408, + "minecraft:jungle_boat": 409, + "minecraft:jungle_button": 410, + "minecraft:jungle_chest_boat": 411, + "minecraft:jungle_door": 412, + "minecraft:jungle_fence": 413, + "minecraft:jungle_fence_gate": 414, + "minecraft:jungle_hanging_sign": 415, + "minecraft:jungle_planks": 416, + "minecraft:jungle_pressure_plate": 417, + "minecraft:jungle_shelf": 418, + "minecraft:jungle_sign": 419, + "minecraft:jungle_slab": 420, + "minecraft:jungle_stairs": 421, + "minecraft:jungle_trapdoor": 422, + "minecraft:jungle_wood": 423, + "minecraft:ladder": 424, + "minecraft:lantern": 425, + "minecraft:lapis_block": 426, + "minecraft:lapis_lazuli": 427, + "minecraft:lead": 428, + "minecraft:leather": 429, + "minecraft:leather_boots": 430, + "minecraft:leather_chestplate": 431, + "minecraft:leather_helmet": 432, + "minecraft:leather_horse_armor": 433, + "minecraft:leather_leggings": 434, + "minecraft:lectern": 435, + "minecraft:lever": 436, + "minecraft:light_blue_banner": 437, + "minecraft:light_blue_bed": 438, + "minecraft:light_blue_bundle": 439, + "minecraft:light_blue_candle": 440, + "minecraft:light_blue_carpet": 441, + "minecraft:light_blue_concrete_powder": 442, + "minecraft:light_blue_dye": 443, + "minecraft:light_blue_harness": 444, + "minecraft:light_blue_shulker_box": 445, + "minecraft:light_blue_stained_glass": 446, + "minecraft:light_blue_stained_glass_pane": 447, + "minecraft:light_blue_terracotta": 448, + "minecraft:light_blue_wool": 449, + "minecraft:light_gray_banner": 450, + "minecraft:light_gray_bed": 451, + "minecraft:light_gray_bundle": 452, + "minecraft:light_gray_candle": 453, + "minecraft:light_gray_carpet": 454, + "minecraft:light_gray_concrete_powder": 455, + "minecraft:light_gray_dye": 456, + "minecraft:light_gray_harness": 457, + "minecraft:light_gray_shulker_box": 458, + "minecraft:light_gray_stained_glass": 459, + "minecraft:light_gray_stained_glass_pane": 460, + "minecraft:light_gray_terracotta": 461, + "minecraft:light_gray_wool": 462, + "minecraft:light_weighted_pressure_plate": 463, + "minecraft:lightning_rod": 464, + "minecraft:lime_banner": 465, + "minecraft:lime_bed": 466, + "minecraft:lime_bundle": 467, + "minecraft:lime_candle": 468, + "minecraft:lime_carpet": 469, + "minecraft:lime_concrete_powder": 470, + "minecraft:lime_dye": 471, + "minecraft:lime_harness": 472, + "minecraft:lime_shulker_box": 473, + "minecraft:lime_stained_glass": 474, + "minecraft:lime_stained_glass_pane": 475, + "minecraft:lime_terracotta": 476, + "minecraft:lime_wool": 477, + "minecraft:lodestone": 478, + "minecraft:loom": 479, + "minecraft:mace": 480, + "minecraft:magenta_banner": 481, + "minecraft:magenta_bed": 482, + "minecraft:magenta_bundle": 483, + "minecraft:magenta_candle": 484, + "minecraft:magenta_carpet": 485, + "minecraft:magenta_concrete_powder": 486, + "minecraft:magenta_dye": 487, + "minecraft:magenta_harness": 488, + "minecraft:magenta_shulker_box": 489, + "minecraft:magenta_stained_glass": 490, + "minecraft:magenta_stained_glass_pane": 491, + "minecraft:magenta_terracotta": 492, + "minecraft:magenta_wool": 493, + "minecraft:magma_block": 494, + "minecraft:magma_cream": 495, + "minecraft:mangrove_boat": 496, + "minecraft:mangrove_button": 497, + "minecraft:mangrove_chest_boat": 498, + "minecraft:mangrove_door": 499, + "minecraft:mangrove_fence": 500, + "minecraft:mangrove_fence_gate": 501, + "minecraft:mangrove_hanging_sign": 502, + "minecraft:mangrove_planks": 503, + "minecraft:mangrove_pressure_plate": 504, + "minecraft:mangrove_shelf": 505, + "minecraft:mangrove_sign": 506, + "minecraft:mangrove_slab": 507, + "minecraft:mangrove_stairs": 508, + "minecraft:mangrove_trapdoor": 509, + "minecraft:mangrove_wood": 510, + "minecraft:map": 511, + "minecraft:melon": 512, + "minecraft:melon_seeds": 513, + "minecraft:minecart": 514, + "minecraft:mojang_banner_pattern": 515, + "minecraft:moss_carpet": 516, + "minecraft:mossy_cobblestone": 517, + "minecraft:mossy_cobblestone_slab": 518, + "minecraft:mossy_cobblestone_stairs": 519, + "minecraft:mossy_cobblestone_wall": 520, + "minecraft:mossy_stone_brick_slab": 521, + "minecraft:mossy_stone_brick_stairs": 522, + "minecraft:mossy_stone_brick_wall": 523, + "minecraft:mossy_stone_bricks": 524, + "minecraft:mud_brick_slab": 525, + "minecraft:mud_brick_stairs": 526, + "minecraft:mud_brick_wall": 527, + "minecraft:mud_bricks": 528, + "minecraft:muddy_mangrove_roots": 529, + "minecraft:mushroom_stew": 530, + "minecraft:music_disc_5": 531, + "minecraft:name_tag": 532, + "minecraft:nether_brick_fence": 533, + "minecraft:nether_brick_slab": 534, + "minecraft:nether_brick_stairs": 535, + "minecraft:nether_brick_wall": 536, + "minecraft:nether_bricks": 537, + "minecraft:nether_wart_block": 538, + "minecraft:netherite_block": 539, + "minecraft:netherite_ingot": 540, + "minecraft:netherite_upgrade_smithing_template": 541, + "minecraft:note_block": 542, + "minecraft:oak_boat": 543, + "minecraft:oak_button": 544, + "minecraft:oak_chest_boat": 545, + "minecraft:oak_door": 546, + "minecraft:oak_fence": 547, + "minecraft:oak_fence_gate": 548, + "minecraft:oak_hanging_sign": 549, + "minecraft:oak_planks": 550, + "minecraft:oak_pressure_plate": 551, + "minecraft:oak_shelf": 552, + "minecraft:oak_sign": 553, + "minecraft:oak_slab": 554, + "minecraft:oak_stairs": 555, + "minecraft:oak_trapdoor": 556, + "minecraft:oak_wood": 557, + "minecraft:observer": 558, + "minecraft:orange_banner": 559, + "minecraft:orange_bed": 560, + "minecraft:orange_bundle": 561, + "minecraft:orange_candle": 562, + "minecraft:orange_carpet": 563, + "minecraft:orange_concrete_powder": 564, + "minecraft:orange_dye": 565, + "minecraft:orange_harness": 566, + "minecraft:orange_shulker_box": 567, + "minecraft:orange_stained_glass": 568, + "minecraft:orange_stained_glass_pane": 569, + "minecraft:orange_terracotta": 570, + "minecraft:orange_wool": 571, + "minecraft:oxidized_chiseled_copper": 572, + "minecraft:oxidized_copper_bulb": 573, + "minecraft:oxidized_copper_grate": 574, + "minecraft:oxidized_cut_copper": 575, + "minecraft:oxidized_cut_copper_slab": 576, + "minecraft:oxidized_cut_copper_stairs": 577, + "minecraft:packed_ice": 578, + "minecraft:packed_mud": 579, + "minecraft:painting": 580, + "minecraft:pale_moss_carpet": 581, + "minecraft:pale_oak_boat": 582, + "minecraft:pale_oak_button": 583, + "minecraft:pale_oak_chest_boat": 584, + "minecraft:pale_oak_door": 585, + "minecraft:pale_oak_fence": 586, + "minecraft:pale_oak_fence_gate": 587, + "minecraft:pale_oak_hanging_sign": 588, + "minecraft:pale_oak_planks": 589, + "minecraft:pale_oak_pressure_plate": 590, + "minecraft:pale_oak_shelf": 591, + "minecraft:pale_oak_sign": 592, + "minecraft:pale_oak_slab": 593, + "minecraft:pale_oak_stairs": 594, + "minecraft:pale_oak_trapdoor": 595, + "minecraft:pale_oak_wood": 596, + "minecraft:paper": 597, + "minecraft:pink_banner": 598, + "minecraft:pink_bed": 599, + "minecraft:pink_bundle": 600, + "minecraft:pink_candle": 601, + "minecraft:pink_carpet": 602, + "minecraft:pink_concrete_powder": 603, + "minecraft:pink_dye": 604, + "minecraft:pink_harness": 605, + "minecraft:pink_shulker_box": 606, + "minecraft:pink_stained_glass": 607, + "minecraft:pink_stained_glass_pane": 608, + "minecraft:pink_terracotta": 609, + "minecraft:pink_wool": 610, + "minecraft:piston": 611, + "minecraft:polished_andesite": 612, + "minecraft:polished_andesite_slab": 613, + "minecraft:polished_andesite_stairs": 614, + "minecraft:polished_basalt": 615, + "minecraft:polished_blackstone": 616, + "minecraft:polished_blackstone_brick_slab": 617, + "minecraft:polished_blackstone_brick_stairs": 618, + "minecraft:polished_blackstone_brick_wall": 619, + "minecraft:polished_blackstone_bricks": 620, + "minecraft:polished_blackstone_button": 621, + "minecraft:polished_blackstone_pressure_plate": 622, + "minecraft:polished_blackstone_slab": 623, + "minecraft:polished_blackstone_stairs": 624, + "minecraft:polished_blackstone_wall": 625, + "minecraft:polished_cinnabar": 626, + "minecraft:polished_cinnabar_slab": 627, + "minecraft:polished_cinnabar_stairs": 628, + "minecraft:polished_cinnabar_wall": 629, + "minecraft:polished_deepslate": 630, + "minecraft:polished_deepslate_slab": 631, + "minecraft:polished_deepslate_stairs": 632, + "minecraft:polished_deepslate_wall": 633, + "minecraft:polished_diorite": 634, + "minecraft:polished_diorite_slab": 635, + "minecraft:polished_diorite_stairs": 636, + "minecraft:polished_granite": 637, + "minecraft:polished_granite_slab": 638, + "minecraft:polished_granite_stairs": 639, + "minecraft:polished_sulfur": 640, + "minecraft:polished_sulfur_slab": 641, + "minecraft:polished_sulfur_stairs": 642, + "minecraft:polished_sulfur_wall": 643, + "minecraft:polished_tuff": 644, + "minecraft:polished_tuff_slab": 645, + "minecraft:polished_tuff_stairs": 646, + "minecraft:polished_tuff_wall": 647, + "minecraft:potent_sulfur": 648, + "minecraft:powered_rail": 649, + "minecraft:prismarine": 650, + "minecraft:prismarine_brick_slab": 651, + "minecraft:prismarine_brick_stairs": 652, + "minecraft:prismarine_bricks": 653, + "minecraft:prismarine_slab": 654, + "minecraft:prismarine_stairs": 655, + "minecraft:prismarine_wall": 656, + "minecraft:pumpkin_pie": 657, + "minecraft:pumpkin_seeds": 658, + "minecraft:purple_banner": 659, + "minecraft:purple_bed": 660, + "minecraft:purple_bundle": 661, + "minecraft:purple_candle": 662, + "minecraft:purple_carpet": 663, + "minecraft:purple_concrete_powder": 664, + "minecraft:purple_dye": 665, + "minecraft:purple_harness": 666, + "minecraft:purple_shulker_box": 667, + "minecraft:purple_stained_glass": 668, + "minecraft:purple_stained_glass_pane": 669, + "minecraft:purple_terracotta": 670, + "minecraft:purple_wool": 671, + "minecraft:purpur_block": 672, + "minecraft:purpur_pillar": 673, + "minecraft:purpur_slab": 674, + "minecraft:purpur_stairs": 675, + "minecraft:quartz_block": 676, + "minecraft:quartz_bricks": 677, + "minecraft:quartz_pillar": 678, + "minecraft:quartz_slab": 679, + "minecraft:quartz_stairs": 680, + "minecraft:rabbit_stew": 681, + "minecraft:rail": 682, + "minecraft:raiser_armor_trim_smithing_template": 683, + "minecraft:raw_copper": 684, + "minecraft:raw_copper_block": 685, + "minecraft:raw_gold": 686, + "minecraft:raw_gold_block": 687, + "minecraft:raw_iron": 688, + "minecraft:raw_iron_block": 689, + "minecraft:recovery_compass": 690, + "minecraft:red_banner": 691, + "minecraft:red_bed": 692, + "minecraft:red_bundle": 693, + "minecraft:red_candle": 694, + "minecraft:red_carpet": 695, + "minecraft:red_concrete_powder": 696, + "minecraft:red_dye": 697, + "minecraft:red_harness": 698, + "minecraft:red_nether_brick_slab": 699, + "minecraft:red_nether_brick_stairs": 700, + "minecraft:red_nether_brick_wall": 701, + "minecraft:red_nether_bricks": 702, + "minecraft:red_sandstone": 703, + "minecraft:red_sandstone_slab": 704, + "minecraft:red_sandstone_stairs": 705, + "minecraft:red_sandstone_wall": 706, + "minecraft:red_shulker_box": 707, + "minecraft:red_stained_glass": 708, + "minecraft:red_stained_glass_pane": 709, + "minecraft:red_terracotta": 710, + "minecraft:red_wool": 711, + "minecraft:redstone": 712, + "minecraft:redstone_block": 713, + "minecraft:redstone_lamp": 714, + "minecraft:redstone_torch": 715, + "minecraft:repeater": 716, + "minecraft:resin_block": 717, + "minecraft:resin_brick_slab": 718, + "minecraft:resin_brick_stairs": 719, + "minecraft:resin_brick_wall": 720, + "minecraft:resin_bricks": 721, + "minecraft:resin_clump": 722, + "minecraft:respawn_anchor": 723, + "minecraft:rib_armor_trim_smithing_template": 724, + "minecraft:saddle": 725, + "minecraft:sandstone": 726, + "minecraft:sandstone_slab": 727, + "minecraft:sandstone_stairs": 728, + "minecraft:sandstone_wall": 729, + "minecraft:scaffolding": 730, + "minecraft:sea_lantern": 731, + "minecraft:sentry_armor_trim_smithing_template": 732, + "minecraft:shaper_armor_trim_smithing_template": 733, + "minecraft:shears": 734, + "minecraft:shield": 735, + "minecraft:shulker_box": 736, + "minecraft:silence_armor_trim_smithing_template": 737, + "minecraft:skull_banner_pattern": 738, + "minecraft:slime_ball": 739, + "minecraft:slime_block": 740, + "minecraft:smithing_table": 741, + "minecraft:smoker": 742, + "minecraft:smooth_quartz_slab": 743, + "minecraft:smooth_quartz_stairs": 744, + "minecraft:smooth_red_sandstone_slab": 745, + "minecraft:smooth_red_sandstone_stairs": 746, + "minecraft:smooth_sandstone_slab": 747, + "minecraft:smooth_sandstone_stairs": 748, + "minecraft:smooth_stone_slab": 749, + "minecraft:snout_armor_trim_smithing_template": 750, + "minecraft:snow": 751, + "minecraft:snow_block": 752, + "minecraft:soul_campfire": 753, + "minecraft:soul_lantern": 754, + "minecraft:soul_torch": 755, + "minecraft:spectral_arrow": 756, + "minecraft:spire_armor_trim_smithing_template": 757, + "minecraft:spruce_boat": 758, + "minecraft:spruce_button": 759, + "minecraft:spruce_chest_boat": 760, + "minecraft:spruce_door": 761, + "minecraft:spruce_fence": 762, + "minecraft:spruce_fence_gate": 763, + "minecraft:spruce_hanging_sign": 764, + "minecraft:spruce_planks": 765, + "minecraft:spruce_pressure_plate": 766, + "minecraft:spruce_shelf": 767, + "minecraft:spruce_sign": 768, + "minecraft:spruce_slab": 769, + "minecraft:spruce_stairs": 770, + "minecraft:spruce_trapdoor": 771, + "minecraft:spruce_wood": 772, + "minecraft:spyglass": 773, + "minecraft:stick": 774, + "minecraft:sticky_piston": 775, + "minecraft:stone_axe": 776, + "minecraft:stone_brick_slab": 777, + "minecraft:stone_brick_stairs": 778, + "minecraft:stone_brick_wall": 779, + "minecraft:stone_bricks": 780, + "minecraft:stone_button": 781, + "minecraft:stone_hoe": 782, + "minecraft:stone_pickaxe": 783, + "minecraft:stone_pressure_plate": 784, + "minecraft:stone_shovel": 785, + "minecraft:stone_slab": 786, + "minecraft:stone_spear": 787, + "minecraft:stone_stairs": 788, + "minecraft:stone_sword": 789, + "minecraft:stonecutter": 790, + "minecraft:stripped_acacia_wood": 791, + "minecraft:stripped_birch_wood": 792, + "minecraft:stripped_cherry_wood": 793, + "minecraft:stripped_crimson_hyphae": 794, + "minecraft:stripped_dark_oak_wood": 795, + "minecraft:stripped_jungle_wood": 796, + "minecraft:stripped_mangrove_wood": 797, + "minecraft:stripped_oak_wood": 798, + "minecraft:stripped_pale_oak_wood": 799, + "minecraft:stripped_spruce_wood": 800, + "minecraft:stripped_warped_hyphae": 801, + "minecraft:sugar": 802, + "minecraft:sulfur": 803, + "minecraft:sulfur_brick_slab": 804, + "minecraft:sulfur_brick_stairs": 805, + "minecraft:sulfur_brick_wall": 806, + "minecraft:sulfur_bricks": 807, + "minecraft:sulfur_slab": 808, + "minecraft:sulfur_stairs": 809, + "minecraft:sulfur_wall": 810, + "minecraft:suspicious_stew": 811, + "minecraft:target": 812, + "minecraft:tide_armor_trim_smithing_template": 813, + "minecraft:tinted_glass": 814, + "minecraft:tipped_arrow": 815, + "minecraft:tnt": 816, + "minecraft:tnt_minecart": 817, + "minecraft:torch": 818, + "minecraft:trapped_chest": 819, + "minecraft:tripwire_hook": 820, + "minecraft:tuff_brick_slab": 821, + "minecraft:tuff_brick_stairs": 822, + "minecraft:tuff_brick_wall": 823, + "minecraft:tuff_bricks": 824, + "minecraft:tuff_slab": 825, + "minecraft:tuff_stairs": 826, + "minecraft:tuff_wall": 827, + "minecraft:turtle_helmet": 828, + "minecraft:vex_armor_trim_smithing_template": 829, + "minecraft:ward_armor_trim_smithing_template": 830, + "minecraft:warped_button": 831, + "minecraft:warped_door": 832, + "minecraft:warped_fence": 833, + "minecraft:warped_fence_gate": 834, + "minecraft:warped_fungus_on_a_stick": 835, + "minecraft:warped_hanging_sign": 836, + "minecraft:warped_hyphae": 837, + "minecraft:warped_planks": 838, + "minecraft:warped_pressure_plate": 839, + "minecraft:warped_shelf": 840, + "minecraft:warped_sign": 841, + "minecraft:warped_slab": 842, + "minecraft:warped_stairs": 843, + "minecraft:warped_trapdoor": 844, + "minecraft:waxed_chiseled_copper": 845, + "minecraft:waxed_copper_bars": 846, + "minecraft:waxed_copper_block": 847, + "minecraft:waxed_copper_bulb": 848, + "minecraft:waxed_copper_chain": 849, + "minecraft:waxed_copper_chest": 850, + "minecraft:waxed_copper_door": 851, + "minecraft:waxed_copper_golem_statue": 852, + "minecraft:waxed_copper_grate": 853, + "minecraft:waxed_copper_lantern": 854, + "minecraft:waxed_copper_trapdoor": 855, + "minecraft:waxed_cut_copper": 856, + "minecraft:waxed_cut_copper_slab": 857, + "minecraft:waxed_cut_copper_stairs": 858, + "minecraft:waxed_exposed_chiseled_copper": 859, + "minecraft:waxed_exposed_copper": 860, + "minecraft:waxed_exposed_copper_bars": 861, + "minecraft:waxed_exposed_copper_bulb": 862, + "minecraft:waxed_exposed_copper_chain": 863, + "minecraft:waxed_exposed_copper_chest": 864, + "minecraft:waxed_exposed_copper_door": 865, + "minecraft:waxed_exposed_copper_golem_statue": 866, + "minecraft:waxed_exposed_copper_grate": 867, + "minecraft:waxed_exposed_copper_lantern": 868, + "minecraft:waxed_exposed_copper_trapdoor": 869, + "minecraft:waxed_exposed_cut_copper": 870, + "minecraft:waxed_exposed_cut_copper_slab": 871, + "minecraft:waxed_exposed_cut_copper_stairs": 872, + "minecraft:waxed_exposed_lightning_rod": 873, + "minecraft:waxed_lightning_rod": 874, + "minecraft:waxed_oxidized_chiseled_copper": 875, + "minecraft:waxed_oxidized_copper": 876, + "minecraft:waxed_oxidized_copper_bars": 877, + "minecraft:waxed_oxidized_copper_bulb": 878, + "minecraft:waxed_oxidized_copper_chain": 879, + "minecraft:waxed_oxidized_copper_chest": 880, + "minecraft:waxed_oxidized_copper_door": 881, + "minecraft:waxed_oxidized_copper_golem_statue": 882, + "minecraft:waxed_oxidized_copper_grate": 883, + "minecraft:waxed_oxidized_copper_lantern": 884, + "minecraft:waxed_oxidized_copper_trapdoor": 885, + "minecraft:waxed_oxidized_cut_copper": 886, + "minecraft:waxed_oxidized_cut_copper_slab": 887, + "minecraft:waxed_oxidized_cut_copper_stairs": 888, + "minecraft:waxed_oxidized_lightning_rod": 889, + "minecraft:waxed_weathered_chiseled_copper": 890, + "minecraft:waxed_weathered_copper": 891, + "minecraft:waxed_weathered_copper_bars": 892, + "minecraft:waxed_weathered_copper_bulb": 893, + "minecraft:waxed_weathered_copper_chain": 894, + "minecraft:waxed_weathered_copper_chest": 895, + "minecraft:waxed_weathered_copper_door": 896, + "minecraft:waxed_weathered_copper_golem_statue": 897, + "minecraft:waxed_weathered_copper_grate": 898, + "minecraft:waxed_weathered_copper_lantern": 899, + "minecraft:waxed_weathered_copper_trapdoor": 900, + "minecraft:waxed_weathered_cut_copper": 901, + "minecraft:waxed_weathered_cut_copper_slab": 902, + "minecraft:waxed_weathered_cut_copper_stairs": 903, + "minecraft:waxed_weathered_lightning_rod": 904, + "minecraft:wayfinder_armor_trim_smithing_template": 905, + "minecraft:weathered_chiseled_copper": 906, + "minecraft:weathered_copper_bulb": 907, + "minecraft:weathered_copper_grate": 908, + "minecraft:weathered_cut_copper": 909, + "minecraft:weathered_cut_copper_slab": 910, + "minecraft:weathered_cut_copper_stairs": 911, + "minecraft:wheat": 912, + "minecraft:white_banner": 913, + "minecraft:white_bed": 914, + "minecraft:white_bundle": 915, + "minecraft:white_candle": 916, + "minecraft:white_carpet": 917, + "minecraft:white_concrete_powder": 918, + "minecraft:white_dye": 919, + "minecraft:white_harness": 920, + "minecraft:white_shulker_box": 921, + "minecraft:white_stained_glass": 922, + "minecraft:white_stained_glass_pane": 923, + "minecraft:white_terracotta": 924, + "minecraft:white_wool": 925, + "minecraft:wild_armor_trim_smithing_template": 926, + "minecraft:wind_charge": 927, + "minecraft:wolf_armor": 928, + "minecraft:wooden_axe": 929, + "minecraft:wooden_hoe": 930, + "minecraft:wooden_pickaxe": 931, + "minecraft:wooden_shovel": 932, + "minecraft:wooden_spear": 933, + "minecraft:wooden_sword": 934, + "minecraft:writable_book": 935, + "minecraft:written_book": 936, + "minecraft:yellow_banner": 937, + "minecraft:yellow_bed": 938, + "minecraft:yellow_bundle": 939, + "minecraft:yellow_candle": 940, + "minecraft:yellow_carpet": 941, + "minecraft:yellow_concrete_powder": 942, + "minecraft:yellow_dye": 943, + "minecraft:yellow_harness": 944, + "minecraft:yellow_shulker_box": 945, + "minecraft:yellow_stained_glass": 946, + "minecraft:yellow_stained_glass_pane": 947, + "minecraft:yellow_terracotta": 948, + "minecraft:yellow_wool": 949 + }, + "aliases": { + "#minecraft:acacia_logs": [ + "minecraft:acacia_wood", + "minecraft:stripped_acacia_log", + "minecraft:acacia_log", + "minecraft:stripped_acacia_wood" + ], + "#minecraft:anvil": [ + "minecraft:anvil", + "minecraft:chipped_anvil", + "minecraft:damaged_anvil" + ], + "#minecraft:armadillo_food": [ + "minecraft:spider_eye" + ], + "#minecraft:arrows": [ + "minecraft:tipped_arrow", + "minecraft:spectral_arrow", + "minecraft:arrow" + ], + "#minecraft:axes": [ + "minecraft:stone_axe", + "minecraft:iron_axe", + "minecraft:wooden_axe", + "minecraft:diamond_axe", + "minecraft:golden_axe", + "minecraft:copper_axe", + "minecraft:netherite_axe" + ], + "#minecraft:axolotl_food": [ + "minecraft:tropical_fish_bucket" + ], + "#minecraft:bamboo_blocks": [ + "minecraft:bamboo_block", + "minecraft:stripped_bamboo_block" + ], + "#minecraft:banners": [ + "minecraft:cyan_banner", + "minecraft:white_banner", + "minecraft:green_banner", + "minecraft:pink_banner", + "minecraft:red_banner", + "minecraft:black_banner", + "minecraft:light_blue_banner", + "minecraft:light_gray_banner", + "minecraft:blue_banner", + "minecraft:yellow_banner", + "minecraft:gray_banner", + "minecraft:lime_banner", + "minecraft:magenta_banner", + "minecraft:brown_banner", + "minecraft:purple_banner", + "minecraft:orange_banner" + ], + "#minecraft:bars": [ + "minecraft:waxed_exposed_copper_bars", + "minecraft:oxidized_copper_bars", + "minecraft:exposed_copper_bars", + "minecraft:waxed_oxidized_copper_bars", + "minecraft:waxed_weathered_copper_bars", + "minecraft:iron_bars", + "minecraft:weathered_copper_bars", + "minecraft:copper_bars", + "minecraft:waxed_copper_bars" + ], + "#minecraft:beacon_payment_items": [ + "minecraft:emerald", + "minecraft:iron_ingot", + "minecraft:gold_ingot", + "minecraft:diamond", + "minecraft:netherite_ingot" + ], + "#minecraft:beds": [ + "minecraft:purple_bed", + "minecraft:gray_bed", + "minecraft:blue_bed", + "minecraft:green_bed", + "minecraft:yellow_bed", + "minecraft:white_bed", + "minecraft:red_bed", + "minecraft:pink_bed", + "minecraft:light_blue_bed", + "minecraft:brown_bed", + "minecraft:black_bed", + "minecraft:orange_bed", + "minecraft:light_gray_bed", + "minecraft:magenta_bed", + "minecraft:lime_bed", + "minecraft:cyan_bed" + ], + "#minecraft:bee_food": [ + "minecraft:red_tulip", + "minecraft:blue_orchid", + "minecraft:wither_rose", + "minecraft:oxeye_daisy", + "minecraft:flowering_azalea", + "minecraft:pink_tulip", + "minecraft:chorus_flower", + "minecraft:azure_bluet", + "minecraft:allium", + "minecraft:lilac", + "minecraft:flowering_azalea_leaves", + "minecraft:cherry_leaves", + "minecraft:mangrove_propagule", + "minecraft:poppy", + "minecraft:sunflower", + "minecraft:pitcher_plant", + "minecraft:rose_bush", + "minecraft:open_eyeblossom", + "minecraft:white_tulip", + "minecraft:spore_blossom", + "minecraft:orange_tulip", + "minecraft:lily_of_the_valley", + "minecraft:dandelion", + "minecraft:peony", + "minecraft:wildflowers", + "minecraft:pink_petals", + "minecraft:cactus_flower", + "minecraft:torchflower", + "minecraft:cornflower" + ], + "#minecraft:birch_logs": [ + "minecraft:birch_wood", + "minecraft:stripped_birch_log", + "minecraft:stripped_birch_wood", + "minecraft:birch_log" + ], + "#minecraft:boats": [ + "minecraft:mangrove_chest_boat", + "minecraft:pale_oak_boat", + "minecraft:mangrove_boat", + "minecraft:spruce_boat", + "minecraft:acacia_chest_boat", + "minecraft:oak_boat", + "minecraft:birch_boat", + "minecraft:jungle_chest_boat", + "minecraft:birch_chest_boat", + "minecraft:bamboo_chest_raft", + "minecraft:cherry_boat", + "minecraft:spruce_chest_boat", + "minecraft:bamboo_raft", + "minecraft:jungle_boat", + "minecraft:acacia_boat", + "minecraft:pale_oak_chest_boat", + "minecraft:dark_oak_boat", + "minecraft:cherry_chest_boat", + "minecraft:oak_chest_boat", + "minecraft:dark_oak_chest_boat" + ], + "#minecraft:book_cloning_target": [ + "minecraft:writable_book" + ], + "#minecraft:bookshelf_books": [ + "minecraft:enchanted_book", + "minecraft:knowledge_book", + "minecraft:written_book", + "minecraft:book", + "minecraft:writable_book" + ], + "#minecraft:breaks_decorated_pots": [ + "minecraft:trident", + "minecraft:wooden_sword", + "minecraft:diamond_shovel", + "minecraft:diamond_sword", + "minecraft:wooden_shovel", + "minecraft:stone_shovel", + "minecraft:copper_hoe", + "minecraft:golden_pickaxe", + "minecraft:stone_pickaxe", + "minecraft:iron_sword", + "minecraft:golden_hoe", + "minecraft:stone_sword", + "minecraft:netherite_pickaxe", + "minecraft:copper_sword", + "minecraft:iron_shovel", + "minecraft:copper_axe", + "minecraft:netherite_shovel", + "minecraft:golden_shovel", + "minecraft:diamond_pickaxe", + "minecraft:stone_axe", + "minecraft:iron_axe", + "minecraft:copper_shovel", + "minecraft:wooden_axe", + "minecraft:wooden_pickaxe", + "minecraft:diamond_hoe", + "minecraft:netherite_hoe", + "minecraft:copper_pickaxe", + "minecraft:wooden_hoe", + "minecraft:golden_axe", + "minecraft:mace", + "minecraft:iron_pickaxe", + "minecraft:stone_hoe", + "minecraft:iron_hoe", + "minecraft:netherite_axe", + "minecraft:diamond_axe", + "minecraft:golden_sword", + "minecraft:netherite_sword" + ], + "#minecraft:brewing_fuel": [ + "minecraft:blaze_powder" + ], + "#minecraft:bundles": [ + "minecraft:light_blue_bundle", + "minecraft:purple_bundle", + "minecraft:brown_bundle", + "minecraft:white_bundle", + "minecraft:yellow_bundle", + "minecraft:lime_bundle", + "minecraft:magenta_bundle", + "minecraft:red_bundle", + "minecraft:cyan_bundle", + "minecraft:bundle", + "minecraft:gray_bundle", + "minecraft:green_bundle", + "minecraft:black_bundle", + "minecraft:light_gray_bundle", + "minecraft:blue_bundle", + "minecraft:orange_bundle", + "minecraft:pink_bundle" + ], + "#minecraft:buttons": [ + "minecraft:dark_oak_button", + "minecraft:pale_oak_button", + "minecraft:cherry_button", + "minecraft:bamboo_button", + "minecraft:acacia_button", + "minecraft:birch_button", + "minecraft:jungle_button", + "minecraft:stone_button", + "minecraft:crimson_button", + "minecraft:polished_blackstone_button", + "minecraft:oak_button", + "minecraft:warped_button", + "minecraft:spruce_button", + "minecraft:mangrove_button" + ], + "#minecraft:camel_food": [ + "minecraft:cactus" + ], + "#minecraft:camel_husk_food": [ + "minecraft:rabbit_foot" + ], + "#minecraft:candles": [ + "minecraft:gray_candle", + "minecraft:orange_candle", + "minecraft:cyan_candle", + "minecraft:red_candle", + "minecraft:candle", + "minecraft:pink_candle", + "minecraft:blue_candle", + "minecraft:light_blue_candle", + "minecraft:purple_candle", + "minecraft:brown_candle", + "minecraft:lime_candle", + "minecraft:magenta_candle", + "minecraft:white_candle", + "minecraft:green_candle", + "minecraft:yellow_candle", + "minecraft:black_candle", + "minecraft:light_gray_candle" + ], + "#minecraft:cat_collar_dyes": [ + "minecraft:magenta_dye", + "minecraft:yellow_dye", + "minecraft:green_dye", + "minecraft:gray_dye", + "minecraft:white_dye", + "minecraft:pink_dye", + "minecraft:light_gray_dye", + "minecraft:orange_dye", + "minecraft:blue_dye", + "minecraft:red_dye", + "minecraft:purple_dye", + "minecraft:black_dye", + "minecraft:brown_dye", + "minecraft:light_blue_dye", + "minecraft:lime_dye", + "minecraft:cyan_dye" + ], + "#minecraft:cat_food": [ + "minecraft:cod", + "minecraft:salmon" + ], + "#minecraft:cauldron_can_remove_dye": [ + "minecraft:leather_helmet", + "minecraft:leather_boots", + "minecraft:leather_chestplate", + "minecraft:leather_horse_armor", + "minecraft:wolf_armor", + "minecraft:leather_leggings" + ], + "#minecraft:chains": [ + "minecraft:copper_chain", + "minecraft:waxed_exposed_copper_chain", + "minecraft:exposed_copper_chain", + "minecraft:waxed_weathered_copper_chain", + "minecraft:weathered_copper_chain", + "minecraft:waxed_copper_chain", + "minecraft:oxidized_copper_chain", + "minecraft:iron_chain", + "minecraft:waxed_oxidized_copper_chain" + ], + "#minecraft:cherry_logs": [ + "minecraft:stripped_cherry_log", + "minecraft:stripped_cherry_wood", + "minecraft:cherry_wood", + "minecraft:cherry_log" + ], + "#minecraft:chest_armor": [ + "#minecraft:chest_armor" + ], + "#minecraft:chest_boats": [ + "minecraft:mangrove_chest_boat", + "minecraft:spruce_chest_boat", + "minecraft:pale_oak_chest_boat", + "minecraft:birch_chest_boat", + "minecraft:bamboo_chest_raft", + "minecraft:cherry_chest_boat", + "minecraft:oak_chest_boat", + "minecraft:acacia_chest_boat", + "minecraft:dark_oak_chest_boat", + "minecraft:jungle_chest_boat" + ], + "#minecraft:chicken_food": [ + "minecraft:pitcher_pod", + "minecraft:torchflower_seeds", + "minecraft:melon_seeds", + "minecraft:beetroot_seeds", + "minecraft:pumpkin_seeds", + "minecraft:wheat_seeds" + ], + "#minecraft:cluster_max_harvestables": [ + "minecraft:diamond_pickaxe", + "minecraft:wooden_pickaxe", + "minecraft:netherite_pickaxe", + "minecraft:copper_pickaxe", + "minecraft:iron_pickaxe", + "minecraft:golden_pickaxe", + "minecraft:stone_pickaxe" + ], + "#minecraft:coal_ores": [ + "minecraft:deepslate_coal_ore", + "minecraft:coal_ore" + ], + "#minecraft:coals": [ + "minecraft:charcoal", + "minecraft:coal" + ], + "#minecraft:compasses": [ + "minecraft:recovery_compass", + "minecraft:compass" + ], + "#minecraft:completes_find_tree_tutorial": [ + "minecraft:stripped_mangrove_log", + "minecraft:stripped_warped_hyphae", + "minecraft:stripped_spruce_wood", + "minecraft:spruce_wood", + "minecraft:pale_oak_wood", + "minecraft:jungle_log", + "minecraft:dark_oak_wood", + "minecraft:stripped_mangrove_wood", + "minecraft:acacia_leaves", + "minecraft:stripped_acacia_wood", + "minecraft:stripped_crimson_stem", + "minecraft:stripped_warped_stem", + "minecraft:stripped_acacia_log", + "minecraft:stripped_cherry_log", + "minecraft:acacia_log", + "minecraft:stripped_dark_oak_log", + "minecraft:pale_oak_leaves", + "minecraft:stripped_dark_oak_wood", + "minecraft:stripped_jungle_log", + "minecraft:stripped_crimson_hyphae", + "minecraft:flowering_azalea_leaves", + "minecraft:stripped_birch_wood", + "minecraft:cherry_leaves", + "minecraft:azalea_leaves", + "minecraft:mangrove_leaves", + "minecraft:mangrove_wood", + "minecraft:pale_oak_log", + "minecraft:mangrove_log", + "minecraft:cherry_log", + "minecraft:stripped_oak_wood", + "minecraft:dark_oak_leaves", + "minecraft:spruce_log", + "minecraft:stripped_cherry_wood", + "minecraft:dark_oak_log", + "minecraft:birch_log", + "minecraft:stripped_pale_oak_log", + "minecraft:cherry_wood", + "minecraft:stripped_jungle_wood", + "minecraft:oak_log", + "minecraft:oak_wood", + "minecraft:acacia_wood", + "minecraft:stripped_spruce_log", + "minecraft:crimson_hyphae", + "minecraft:crimson_stem", + "minecraft:stripped_birch_log", + "minecraft:warped_hyphae", + "minecraft:stripped_oak_log", + "minecraft:birch_leaves", + "minecraft:oak_leaves", + "minecraft:nether_wart_block", + "minecraft:jungle_leaves", + "minecraft:warped_stem", + "minecraft:jungle_wood", + "minecraft:spruce_leaves", + "minecraft:stripped_pale_oak_wood", + "minecraft:birch_wood", + "minecraft:warped_wart_block" + ], + "#minecraft:concrete": [ + "minecraft:purple_concrete", + "minecraft:lime_concrete", + "minecraft:orange_concrete", + "minecraft:red_concrete", + "minecraft:light_gray_concrete", + "minecraft:yellow_concrete", + "minecraft:green_concrete", + "minecraft:cyan_concrete", + "minecraft:blue_concrete", + "minecraft:light_blue_concrete", + "minecraft:pink_concrete", + "minecraft:gray_concrete", + "minecraft:black_concrete", + "minecraft:brown_concrete", + "minecraft:white_concrete", + "minecraft:magenta_concrete" + ], + "#minecraft:concrete_powders": [ + "minecraft:lime_concrete_powder", + "minecraft:blue_concrete_powder", + "minecraft:orange_concrete_powder", + "minecraft:pink_concrete_powder", + "minecraft:black_concrete_powder", + "minecraft:white_concrete_powder", + "minecraft:light_blue_concrete_powder", + "minecraft:magenta_concrete_powder", + "minecraft:gray_concrete_powder", + "minecraft:brown_concrete_powder", + "minecraft:green_concrete_powder", + "minecraft:red_concrete_powder", + "minecraft:cyan_concrete_powder", + "minecraft:light_gray_concrete_powder", + "minecraft:purple_concrete_powder", + "minecraft:yellow_concrete_powder" + ], + "#minecraft:copper": [ + "minecraft:copper_block", + "minecraft:waxed_weathered_copper", + "minecraft:waxed_exposed_copper", + "minecraft:exposed_copper", + "minecraft:weathered_copper", + "minecraft:waxed_oxidized_copper", + "minecraft:oxidized_copper", + "minecraft:waxed_copper_block" + ], + "#minecraft:copper_chests": [ + "minecraft:weathered_copper_chest", + "minecraft:waxed_exposed_copper_chest", + "minecraft:waxed_oxidized_copper_chest", + "minecraft:waxed_weathered_copper_chest", + "minecraft:copper_chest", + "minecraft:oxidized_copper_chest", + "minecraft:exposed_copper_chest", + "minecraft:waxed_copper_chest" + ], + "#minecraft:copper_golem_statues": [ + "minecraft:waxed_oxidized_copper_golem_statue", + "minecraft:copper_golem_statue", + "minecraft:waxed_copper_golem_statue", + "minecraft:weathered_copper_golem_statue", + "minecraft:waxed_weathered_copper_golem_statue", + "minecraft:waxed_exposed_copper_golem_statue", + "minecraft:exposed_copper_golem_statue", + "minecraft:oxidized_copper_golem_statue" + ], + "#minecraft:copper_ores": [ + "minecraft:copper_ore", + "minecraft:deepslate_copper_ore" + ], + "#minecraft:copper_tool_materials": [ + "minecraft:copper_ingot" + ], + "#minecraft:cow_food": [ + "minecraft:wheat" + ], + "#minecraft:creeper_drop_music_discs": [ + "minecraft:music_disc_mellohi", + "minecraft:music_disc_chirp", + "minecraft:music_disc_strad", + "minecraft:music_disc_mall", + "minecraft:music_disc_far", + "minecraft:music_disc_13", + "minecraft:music_disc_wait", + "minecraft:music_disc_stal", + "minecraft:music_disc_ward", + "minecraft:music_disc_11", + "minecraft:music_disc_blocks", + "minecraft:music_disc_cat" + ], + "#minecraft:creeper_igniters": [ + "minecraft:flint_and_steel", + "minecraft:fire_charge" + ], + "#minecraft:crimson_stems": [ + "minecraft:stripped_crimson_hyphae", + "minecraft:crimson_hyphae", + "minecraft:crimson_stem", + "minecraft:stripped_crimson_stem" + ], + "#minecraft:dampens_vibrations": [ + "minecraft:gray_wool", + "minecraft:light_blue_carpet", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:white_wool", + "minecraft:light_gray_wool", + "minecraft:green_wool", + "minecraft:light_gray_carpet", + "minecraft:brown_wool", + "minecraft:red_wool", + "minecraft:white_carpet", + "minecraft:brown_carpet", + "minecraft:lime_wool", + "minecraft:cyan_wool", + "minecraft:gray_carpet", + "minecraft:orange_wool", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:magenta_wool", + "minecraft:green_carpet", + "minecraft:pink_carpet", + "minecraft:pink_wool", + "minecraft:yellow_wool", + "minecraft:purple_carpet", + "minecraft:black_wool", + "minecraft:red_carpet", + "minecraft:blue_carpet", + "minecraft:cyan_carpet", + "minecraft:black_carpet" + ], + "#minecraft:dark_oak_logs": [ + "minecraft:dark_oak_log", + "minecraft:dark_oak_wood", + "minecraft:stripped_dark_oak_log", + "minecraft:stripped_dark_oak_wood" + ], + "#minecraft:decorated_pot_ingredients": [ + "minecraft:heart_pottery_sherd", + "minecraft:sheaf_pottery_sherd", + "minecraft:heartbreak_pottery_sherd", + "minecraft:arms_up_pottery_sherd", + "minecraft:angler_pottery_sherd", + "minecraft:scrape_pottery_sherd", + "minecraft:brick", + "minecraft:howl_pottery_sherd", + "minecraft:blade_pottery_sherd", + "minecraft:flow_pottery_sherd", + "minecraft:shelter_pottery_sherd", + "minecraft:burn_pottery_sherd", + "minecraft:brewer_pottery_sherd", + "minecraft:friend_pottery_sherd", + "minecraft:miner_pottery_sherd", + "minecraft:danger_pottery_sherd", + "minecraft:skull_pottery_sherd", + "minecraft:archer_pottery_sherd", + "minecraft:guster_pottery_sherd", + "minecraft:snort_pottery_sherd", + "minecraft:prize_pottery_sherd", + "minecraft:mourner_pottery_sherd", + "minecraft:plenty_pottery_sherd", + "minecraft:explorer_pottery_sherd" + ], + "#minecraft:decorated_pot_sherds": [ + "minecraft:heart_pottery_sherd", + "minecraft:sheaf_pottery_sherd", + "minecraft:heartbreak_pottery_sherd", + "minecraft:arms_up_pottery_sherd", + "minecraft:angler_pottery_sherd", + "minecraft:scrape_pottery_sherd", + "minecraft:howl_pottery_sherd", + "minecraft:blade_pottery_sherd", + "minecraft:flow_pottery_sherd", + "minecraft:shelter_pottery_sherd", + "minecraft:burn_pottery_sherd", + "minecraft:brewer_pottery_sherd", + "minecraft:friend_pottery_sherd", + "minecraft:miner_pottery_sherd", + "minecraft:danger_pottery_sherd", + "minecraft:skull_pottery_sherd", + "minecraft:archer_pottery_sherd", + "minecraft:guster_pottery_sherd", + "minecraft:snort_pottery_sherd", + "minecraft:prize_pottery_sherd", + "minecraft:mourner_pottery_sherd", + "minecraft:plenty_pottery_sherd", + "minecraft:explorer_pottery_sherd" + ], + "#minecraft:diamond_ores": [ + "minecraft:diamond_ore", + "minecraft:deepslate_diamond_ore" + ], + "#minecraft:diamond_tool_materials": [ + "minecraft:diamond" + ], + "#minecraft:dirt": [ + "minecraft:dirt", + "minecraft:coarse_dirt", + "minecraft:rooted_dirt" + ], + "#minecraft:doors": [ + "minecraft:iron_door", + "minecraft:crimson_door", + "minecraft:copper_door", + "minecraft:warped_door", + "minecraft:spruce_door", + "minecraft:mangrove_door", + "minecraft:bamboo_door", + "minecraft:waxed_weathered_copper_door", + "minecraft:oak_door", + "minecraft:cherry_door", + "minecraft:acacia_door", + "minecraft:pale_oak_door", + "minecraft:waxed_oxidized_copper_door", + "minecraft:oxidized_copper_door", + "minecraft:birch_door", + "minecraft:weathered_copper_door", + "minecraft:waxed_copper_door", + "minecraft:exposed_copper_door", + "minecraft:dark_oak_door", + "minecraft:jungle_door", + "minecraft:waxed_exposed_copper_door" + ], + "#minecraft:drowned_preferred_weapons": [ + "minecraft:trident" + ], + "#minecraft:duplicates_allays": [ + "minecraft:amethyst_shard" + ], + "#minecraft:dyes": [ + "minecraft:magenta_dye", + "minecraft:yellow_dye", + "minecraft:green_dye", + "minecraft:gray_dye", + "minecraft:white_dye", + "minecraft:pink_dye", + "minecraft:light_gray_dye", + "minecraft:orange_dye", + "minecraft:blue_dye", + "minecraft:red_dye", + "minecraft:purple_dye", + "minecraft:black_dye", + "minecraft:brown_dye", + "minecraft:light_blue_dye", + "minecraft:lime_dye", + "minecraft:cyan_dye" + ], + "#minecraft:eggs": [ + "minecraft:blue_egg", + "minecraft:egg", + "minecraft:brown_egg" + ], + "#minecraft:emerald_ores": [ + "minecraft:emerald_ore", + "minecraft:deepslate_emerald_ore" + ], + "#minecraft:fence_gates": [ + "minecraft:bamboo_fence_gate", + "minecraft:oak_fence_gate", + "minecraft:spruce_fence_gate", + "minecraft:jungle_fence_gate", + "minecraft:birch_fence_gate", + "minecraft:mangrove_fence_gate", + "minecraft:dark_oak_fence_gate", + "minecraft:crimson_fence_gate", + "minecraft:cherry_fence_gate", + "minecraft:warped_fence_gate", + "minecraft:acacia_fence_gate", + "minecraft:pale_oak_fence_gate" + ], + "#minecraft:fences": [ + "minecraft:acacia_fence", + "minecraft:dark_oak_fence", + "minecraft:spruce_fence", + "minecraft:crimson_fence", + "minecraft:oak_fence", + "minecraft:jungle_fence", + "minecraft:mangrove_fence", + "minecraft:warped_fence", + "minecraft:bamboo_fence", + "minecraft:nether_brick_fence", + "minecraft:birch_fence", + "minecraft:pale_oak_fence", + "minecraft:cherry_fence" + ], + "#minecraft:fishes": [ + "minecraft:cod", + "minecraft:cooked_salmon", + "minecraft:pufferfish", + "minecraft:cooked_cod", + "minecraft:salmon", + "minecraft:tropical_fish" + ], + "#minecraft:flowers": [ + "minecraft:red_tulip", + "minecraft:blue_orchid", + "minecraft:wither_rose", + "minecraft:oxeye_daisy", + "minecraft:flowering_azalea", + "minecraft:pink_tulip", + "minecraft:chorus_flower", + "minecraft:azure_bluet", + "minecraft:allium", + "minecraft:closed_eyeblossom", + "minecraft:lilac", + "minecraft:golden_dandelion", + "minecraft:flowering_azalea_leaves", + "minecraft:cherry_leaves", + "minecraft:mangrove_propagule", + "minecraft:poppy", + "minecraft:sunflower", + "minecraft:pitcher_plant", + "minecraft:rose_bush", + "minecraft:open_eyeblossom", + "minecraft:white_tulip", + "minecraft:spore_blossom", + "minecraft:orange_tulip", + "minecraft:lily_of_the_valley", + "minecraft:dandelion", + "minecraft:peony", + "minecraft:wildflowers", + "minecraft:pink_petals", + "minecraft:cactus_flower", + "minecraft:torchflower", + "minecraft:cornflower" + ], + "#minecraft:foot_armor": [ + "#minecraft:foot_armor" + ], + "#minecraft:fox_food": [ + "minecraft:sweet_berries", + "minecraft:glow_berries" + ], + "#minecraft:freeze_immune_wearables": [ + "minecraft:leather_helmet", + "minecraft:leather_boots", + "minecraft:leather_chestplate", + "minecraft:leather_horse_armor", + "minecraft:leather_leggings" + ], + "#minecraft:frog_food": [ + "minecraft:slime_ball" + ], + "#minecraft:furnace_minecart_fuel": [ + "minecraft:charcoal", + "minecraft:coal" + ], + "#minecraft:gaze_disguise_equipment": [ + "minecraft:carved_pumpkin" + ], + "#minecraft:glazed_terracotta": [ + "minecraft:pink_glazed_terracotta", + "minecraft:light_blue_glazed_terracotta", + "minecraft:purple_glazed_terracotta", + "minecraft:gray_glazed_terracotta", + "minecraft:black_glazed_terracotta", + "minecraft:white_glazed_terracotta", + "minecraft:red_glazed_terracotta", + "minecraft:magenta_glazed_terracotta", + "minecraft:orange_glazed_terracotta", + "minecraft:yellow_glazed_terracotta", + "minecraft:cyan_glazed_terracotta", + "minecraft:light_gray_glazed_terracotta", + "minecraft:blue_glazed_terracotta", + "minecraft:brown_glazed_terracotta", + "minecraft:green_glazed_terracotta", + "minecraft:lime_glazed_terracotta" + ], + "#minecraft:goat_food": [ + "minecraft:wheat" + ], + "#minecraft:gold_ores": [ + "minecraft:gold_ore", + "minecraft:nether_gold_ore", + "minecraft:deepslate_gold_ore" + ], + "#minecraft:gold_tool_materials": [ + "minecraft:gold_ingot" + ], + "#minecraft:grass_blocks": [ + "minecraft:grass_block", + "minecraft:podzol", + "minecraft:mycelium" + ], + "#minecraft:hanging_signs": [ + "minecraft:crimson_hanging_sign", + "minecraft:oak_hanging_sign", + "minecraft:spruce_hanging_sign", + "minecraft:pale_oak_hanging_sign", + "minecraft:birch_hanging_sign", + "minecraft:acacia_hanging_sign", + "minecraft:cherry_hanging_sign", + "minecraft:warped_hanging_sign", + "minecraft:bamboo_hanging_sign", + "minecraft:mangrove_hanging_sign", + "minecraft:dark_oak_hanging_sign", + "minecraft:jungle_hanging_sign" + ], + "#minecraft:happy_ghast_food": [ + "minecraft:snowball" + ], + "#minecraft:happy_ghast_tempt_items": [ + "minecraft:purple_harness", + "minecraft:white_harness", + "minecraft:lime_harness", + "minecraft:orange_harness", + "minecraft:yellow_harness", + "minecraft:red_harness", + "minecraft:black_harness", + "minecraft:green_harness", + "minecraft:cyan_harness", + "minecraft:pink_harness", + "minecraft:brown_harness", + "minecraft:gray_harness", + "minecraft:blue_harness", + "minecraft:light_blue_harness", + "minecraft:light_gray_harness", + "minecraft:magenta_harness", + "minecraft:snowball" + ], + "#minecraft:harnesses": [ + "minecraft:purple_harness", + "minecraft:white_harness", + "minecraft:lime_harness", + "minecraft:orange_harness", + "minecraft:yellow_harness", + "minecraft:red_harness", + "minecraft:black_harness", + "minecraft:green_harness", + "minecraft:cyan_harness", + "minecraft:pink_harness", + "minecraft:brown_harness", + "minecraft:gray_harness", + "minecraft:blue_harness", + "minecraft:light_blue_harness", + "minecraft:light_gray_harness", + "minecraft:magenta_harness" + ], + "#minecraft:head_armor": [ + "#minecraft:head_armor" + ], + "#minecraft:hoes": [ + "minecraft:golden_hoe", + "minecraft:diamond_hoe", + "minecraft:netherite_hoe", + "minecraft:wooden_hoe", + "minecraft:stone_hoe", + "minecraft:iron_hoe", + "minecraft:copper_hoe" + ], + "#minecraft:hoglin_food": [ + "minecraft:crimson_fungus" + ], + "#minecraft:horse_food": [ + "minecraft:wheat", + "minecraft:golden_apple", + "minecraft:golden_carrot", + "minecraft:enchanted_golden_apple", + "minecraft:hay_block", + "minecraft:apple", + "minecraft:carrot", + "minecraft:sugar" + ], + "#minecraft:horse_tempt_items": [ + "minecraft:enchanted_golden_apple", + "minecraft:golden_apple", + "minecraft:golden_carrot" + ], + "#minecraft:ignored_by_piglin_babies": [ + "minecraft:leather" + ], + "#minecraft:iron_ores": [ + "minecraft:iron_ore", + "minecraft:deepslate_iron_ore" + ], + "#minecraft:iron_tool_materials": [ + "minecraft:iron_ingot" + ], + "#minecraft:jungle_logs": [ + "minecraft:jungle_wood", + "minecraft:stripped_jungle_wood", + "minecraft:stripped_jungle_log", + "minecraft:jungle_log" + ], + "#minecraft:lanterns": [ + "minecraft:copper_lantern", + "minecraft:weathered_copper_lantern", + "minecraft:soul_lantern", + "minecraft:waxed_copper_lantern", + "minecraft:waxed_exposed_copper_lantern", + "minecraft:waxed_weathered_copper_lantern", + "minecraft:waxed_oxidized_copper_lantern", + "minecraft:oxidized_copper_lantern", + "minecraft:exposed_copper_lantern", + "minecraft:lantern" + ], + "#minecraft:lapis_ores": [ + "minecraft:lapis_ore", + "minecraft:deepslate_lapis_ore" + ], + "#minecraft:leaves": [ + "minecraft:dark_oak_leaves", + "minecraft:pale_oak_leaves", + "minecraft:flowering_azalea_leaves", + "minecraft:cherry_leaves", + "minecraft:birch_leaves", + "minecraft:oak_leaves", + "minecraft:azalea_leaves", + "minecraft:acacia_leaves", + "minecraft:mangrove_leaves", + "minecraft:jungle_leaves", + "minecraft:spruce_leaves" + ], + "#minecraft:lectern_books": [ + "minecraft:written_book", + "minecraft:writable_book" + ], + "#minecraft:leg_armor": [ + "#minecraft:leg_armor" + ], + "#minecraft:lightning_rods": [ + "minecraft:lightning_rod", + "minecraft:weathered_lightning_rod", + "minecraft:oxidized_lightning_rod", + "minecraft:waxed_exposed_lightning_rod", + "minecraft:waxed_weathered_lightning_rod", + "minecraft:exposed_lightning_rod", + "minecraft:waxed_lightning_rod", + "minecraft:waxed_oxidized_lightning_rod" + ], + "#minecraft:llama_food": [ + "minecraft:wheat", + "minecraft:hay_block" + ], + "#minecraft:llama_tempt_items": [ + "minecraft:hay_block" + ], + "#minecraft:logs": [ + "minecraft:stripped_mangrove_log", + "minecraft:stripped_warped_hyphae", + "minecraft:stripped_spruce_wood", + "minecraft:spruce_wood", + "minecraft:pale_oak_wood", + "minecraft:jungle_log", + "minecraft:dark_oak_wood", + "minecraft:stripped_mangrove_wood", + "minecraft:stripped_acacia_wood", + "minecraft:stripped_crimson_stem", + "minecraft:stripped_warped_stem", + "minecraft:stripped_acacia_log", + "minecraft:stripped_cherry_log", + "minecraft:acacia_log", + "minecraft:stripped_dark_oak_log", + "minecraft:stripped_dark_oak_wood", + "minecraft:stripped_jungle_log", + "minecraft:stripped_crimson_hyphae", + "minecraft:stripped_birch_wood", + "minecraft:mangrove_wood", + "minecraft:pale_oak_log", + "minecraft:mangrove_log", + "minecraft:cherry_log", + "minecraft:stripped_oak_wood", + "minecraft:spruce_log", + "minecraft:stripped_cherry_wood", + "minecraft:dark_oak_log", + "minecraft:birch_log", + "minecraft:stripped_pale_oak_log", + "minecraft:cherry_wood", + "minecraft:stripped_jungle_wood", + "minecraft:oak_log", + "minecraft:oak_wood", + "minecraft:acacia_wood", + "minecraft:stripped_spruce_log", + "minecraft:crimson_hyphae", + "minecraft:crimson_stem", + "minecraft:stripped_birch_log", + "minecraft:warped_hyphae", + "minecraft:stripped_oak_log", + "minecraft:warped_stem", + "minecraft:jungle_wood", + "minecraft:stripped_pale_oak_wood", + "minecraft:birch_wood" + ], + "#minecraft:logs_that_burn": [ + "minecraft:stripped_mangrove_log", + "minecraft:spruce_wood", + "minecraft:stripped_spruce_wood", + "minecraft:pale_oak_wood", + "minecraft:jungle_log", + "minecraft:dark_oak_wood", + "minecraft:stripped_mangrove_wood", + "minecraft:stripped_acacia_wood", + "minecraft:stripped_acacia_log", + "minecraft:stripped_cherry_log", + "minecraft:acacia_log", + "minecraft:stripped_dark_oak_log", + "minecraft:stripped_dark_oak_wood", + "minecraft:stripped_jungle_log", + "minecraft:stripped_birch_wood", + "minecraft:mangrove_wood", + "minecraft:pale_oak_log", + "minecraft:mangrove_log", + "minecraft:cherry_log", + "minecraft:stripped_oak_wood", + "minecraft:spruce_log", + "minecraft:stripped_cherry_wood", + "minecraft:dark_oak_log", + "minecraft:birch_log", + "minecraft:stripped_pale_oak_log", + "minecraft:cherry_wood", + "minecraft:stripped_jungle_wood", + "minecraft:oak_log", + "minecraft:oak_wood", + "minecraft:acacia_wood", + "minecraft:stripped_spruce_log", + "minecraft:stripped_birch_log", + "minecraft:stripped_oak_log", + "minecraft:jungle_wood", + "minecraft:stripped_pale_oak_wood", + "minecraft:birch_wood" + ], + "#minecraft:loom_dyes": [ + "minecraft:magenta_dye", + "minecraft:yellow_dye", + "minecraft:green_dye", + "minecraft:gray_dye", + "minecraft:white_dye", + "minecraft:pink_dye", + "minecraft:light_gray_dye", + "minecraft:orange_dye", + "minecraft:blue_dye", + "minecraft:red_dye", + "minecraft:purple_dye", + "minecraft:black_dye", + "minecraft:brown_dye", + "minecraft:light_blue_dye", + "minecraft:lime_dye", + "minecraft:cyan_dye" + ], + "#minecraft:loom_patterns": [ + "minecraft:mojang_banner_pattern", + "minecraft:piglin_banner_pattern", + "minecraft:bordure_indented_banner_pattern", + "minecraft:creeper_banner_pattern", + "minecraft:flow_banner_pattern", + "minecraft:flower_banner_pattern", + "minecraft:guster_banner_pattern", + "minecraft:field_masoned_banner_pattern", + "minecraft:skull_banner_pattern", + "minecraft:globe_banner_pattern" + ], + "#minecraft:mangrove_logs": [ + "minecraft:mangrove_log", + "minecraft:stripped_mangrove_wood", + "minecraft:mangrove_wood", + "minecraft:stripped_mangrove_log" + ], + "#minecraft:map_invisibility_equipment": [ + "minecraft:carved_pumpkin" + ], + "#minecraft:meat": [ + "minecraft:beef", + "minecraft:rotten_flesh", + "minecraft:mutton", + "minecraft:cooked_rabbit", + "minecraft:cooked_beef", + "minecraft:cooked_mutton", + "minecraft:rabbit", + "minecraft:chicken", + "minecraft:porkchop", + "minecraft:cooked_porkchop", + "minecraft:cooked_chicken" + ], + "#minecraft:metal_nuggets": [ + "minecraft:copper_nugget", + "minecraft:iron_nugget", + "minecraft:gold_nugget" + ], + "#minecraft:moss_blocks": [ + "minecraft:moss_block", + "minecraft:pale_moss_block" + ], + "#minecraft:mud": [ + "minecraft:muddy_mangrove_roots", + "minecraft:mud" + ], + "#minecraft:nautilus_bucket_food": [ + "minecraft:salmon_bucket", + "minecraft:tropical_fish_bucket", + "minecraft:pufferfish_bucket", + "minecraft:cod_bucket" + ], + "#minecraft:nautilus_food": [ + "minecraft:tropical_fish_bucket", + "minecraft:cod", + "minecraft:cooked_salmon", + "minecraft:pufferfish", + "minecraft:cooked_cod", + "minecraft:salmon_bucket", + "minecraft:salmon", + "minecraft:pufferfish_bucket", + "minecraft:tropical_fish", + "minecraft:cod_bucket" + ], + "#minecraft:nautilus_taming_items": [ + "minecraft:pufferfish", + "minecraft:pufferfish_bucket" + ], + "#minecraft:netherite_tool_materials": [ + "minecraft:netherite_ingot" + ], + "#minecraft:non_flammable_wood": [ + "minecraft:warped_pressure_plate", + "minecraft:crimson_planks", + "minecraft:stripped_warped_hyphae", + "minecraft:crimson_door", + "minecraft:crimson_fence_gate", + "minecraft:warped_door", + "minecraft:stripped_crimson_stem", + "minecraft:stripped_warped_stem", + "minecraft:warped_sign", + "minecraft:warped_shelf", + "minecraft:crimson_shelf", + "minecraft:stripped_crimson_hyphae", + "minecraft:crimson_button", + "minecraft:warped_planks", + "minecraft:warped_fence_gate", + "minecraft:crimson_pressure_plate", + "minecraft:crimson_fence", + "minecraft:crimson_hanging_sign", + "minecraft:crimson_trapdoor", + "minecraft:crimson_slab", + "minecraft:crimson_sign", + "minecraft:warped_trapdoor", + "minecraft:warped_hanging_sign", + "minecraft:warped_slab", + "minecraft:crimson_stem", + "minecraft:crimson_hyphae", + "minecraft:warped_fence", + "minecraft:warped_stairs", + "minecraft:warped_hyphae", + "minecraft:crimson_stairs", + "minecraft:warped_stem", + "minecraft:warped_button" + ], + "#minecraft:noteblock_top_instruments": [ + "minecraft:zombie_head", + "minecraft:piglin_head", + "minecraft:player_head", + "minecraft:skeleton_skull", + "minecraft:dragon_head", + "minecraft:wither_skeleton_skull", + "minecraft:creeper_head" + ], + "#minecraft:oak_logs": [ + "minecraft:oak_log", + "minecraft:oak_wood", + "minecraft:stripped_oak_wood", + "minecraft:stripped_oak_log" + ], + "#minecraft:ocelot_food": [ + "minecraft:cod", + "minecraft:salmon" + ], + "#minecraft:pale_oak_logs": [ + "minecraft:stripped_pale_oak_wood", + "minecraft:pale_oak_wood", + "minecraft:stripped_pale_oak_log", + "minecraft:pale_oak_log" + ], + "#minecraft:panda_eats_from_ground": [ + "minecraft:bamboo", + "minecraft:cake" + ], + "#minecraft:panda_food": [ + "minecraft:bamboo" + ], + "#minecraft:parrot_food": [ + "minecraft:pitcher_pod", + "minecraft:torchflower_seeds", + "minecraft:melon_seeds", + "minecraft:beetroot_seeds", + "minecraft:pumpkin_seeds", + "minecraft:wheat_seeds" + ], + "#minecraft:parrot_poisonous_food": [ + "minecraft:cookie" + ], + "#minecraft:pickaxes": [ + "minecraft:diamond_pickaxe", + "minecraft:wooden_pickaxe", + "minecraft:netherite_pickaxe", + "minecraft:copper_pickaxe", + "minecraft:iron_pickaxe", + "minecraft:golden_pickaxe", + "minecraft:stone_pickaxe" + ], + "#minecraft:pig_food": [ + "minecraft:carrot", + "minecraft:beetroot", + "minecraft:potato" + ], + "#minecraft:piglin_food": [ + "minecraft:porkchop", + "minecraft:cooked_porkchop" + ], + "#minecraft:piglin_loved": [ + "minecraft:gilded_blackstone", + "minecraft:golden_carrot", + "minecraft:golden_spear", + "minecraft:gold_block", + "minecraft:gold_ore", + "minecraft:golden_pickaxe", + "minecraft:golden_boots", + "minecraft:nether_gold_ore", + "minecraft:golden_chestplate", + "minecraft:golden_apple", + "minecraft:golden_leggings", + "minecraft:golden_hoe", + "minecraft:clock", + "minecraft:golden_dandelion", + "minecraft:light_weighted_pressure_plate", + "minecraft:enchanted_golden_apple", + "minecraft:golden_nautilus_armor", + "minecraft:glistering_melon_slice", + "minecraft:golden_shovel", + "minecraft:raw_gold", + "minecraft:golden_helmet", + "minecraft:deepslate_gold_ore", + "minecraft:golden_axe", + "minecraft:raw_gold_block", + "minecraft:golden_horse_armor", + "minecraft:bell", + "minecraft:gold_ingot", + "minecraft:golden_sword" + ], + "#minecraft:piglin_preferred_weapons": [ + "minecraft:crossbow", + "minecraft:golden_spear" + ], + "#minecraft:piglin_repellents": [ + "minecraft:soul_campfire", + "minecraft:soul_lantern", + "minecraft:soul_torch" + ], + "#minecraft:piglin_safe_armor": [ + "minecraft:golden_chestplate", + "minecraft:golden_helmet", + "minecraft:golden_boots", + "minecraft:golden_leggings" + ], + "#minecraft:pillager_preferred_weapons": [ + "minecraft:crossbow" + ], + "#minecraft:planks": [ + "minecraft:oak_planks", + "minecraft:cherry_planks", + "minecraft:pale_oak_planks", + "minecraft:crimson_planks", + "minecraft:bamboo_planks", + "minecraft:mangrove_planks", + "minecraft:acacia_planks", + "minecraft:birch_planks", + "minecraft:warped_planks", + "minecraft:jungle_planks", + "minecraft:dark_oak_planks", + "minecraft:spruce_planks" + ], + "#minecraft:rabbit_food": [ + "minecraft:carrot", + "minecraft:dandelion", + "minecraft:golden_carrot" + ], + "#minecraft:rails": [ + "minecraft:detector_rail", + "minecraft:powered_rail", + "minecraft:activator_rail", + "minecraft:rail" + ], + "#minecraft:redstone_ores": [ + "minecraft:deepslate_redstone_ore", + "minecraft:redstone_ore" + ], + "#minecraft:repairs_chain_armor": [ + "minecraft:iron_ingot" + ], + "#minecraft:repairs_copper_armor": [ + "minecraft:copper_ingot" + ], + "#minecraft:repairs_diamond_armor": [ + "minecraft:diamond" + ], + "#minecraft:repairs_gold_armor": [ + "minecraft:gold_ingot" + ], + "#minecraft:repairs_iron_armor": [ + "minecraft:iron_ingot" + ], + "#minecraft:repairs_leather_armor": [ + "minecraft:leather" + ], + "#minecraft:repairs_netherite_armor": [ + "minecraft:netherite_ingot" + ], + "#minecraft:repairs_turtle_helmet": [ + "minecraft:turtle_scute" + ], + "#minecraft:repairs_wolf_armor": [ + "minecraft:armadillo_scute" + ], + "#minecraft:sand": [ + "minecraft:sand", + "minecraft:suspicious_sand", + "minecraft:red_sand" + ], + "#minecraft:saplings": [ + "minecraft:cherry_sapling", + "minecraft:jungle_sapling", + "minecraft:dark_oak_sapling", + "minecraft:azalea", + "minecraft:mangrove_propagule", + "minecraft:flowering_azalea", + "minecraft:oak_sapling", + "minecraft:pale_oak_sapling", + "minecraft:acacia_sapling", + "minecraft:birch_sapling", + "minecraft:spruce_sapling" + ], + "#minecraft:shearable_from_copper_golem": [ + "minecraft:poppy" + ], + "#minecraft:sheep_food": [ + "minecraft:wheat" + ], + "#minecraft:shovels": [ + "minecraft:copper_shovel", + "minecraft:diamond_shovel", + "minecraft:wooden_shovel", + "minecraft:iron_shovel", + "minecraft:stone_shovel", + "minecraft:netherite_shovel", + "minecraft:golden_shovel" + ], + "#minecraft:shulker_boxes": [ + "minecraft:pink_shulker_box", + "minecraft:orange_shulker_box", + "minecraft:purple_shulker_box", + "minecraft:white_shulker_box", + "minecraft:green_shulker_box", + "minecraft:yellow_shulker_box", + "minecraft:blue_shulker_box", + "minecraft:red_shulker_box", + "minecraft:lime_shulker_box", + "minecraft:light_blue_shulker_box", + "minecraft:brown_shulker_box", + "minecraft:shulker_box", + "minecraft:gray_shulker_box", + "minecraft:cyan_shulker_box", + "minecraft:magenta_shulker_box", + "minecraft:black_shulker_box", + "minecraft:light_gray_shulker_box" + ], + "#minecraft:signs": [ + "minecraft:pale_oak_sign", + "minecraft:warped_sign", + "minecraft:spruce_sign", + "minecraft:jungle_sign", + "minecraft:acacia_sign", + "minecraft:dark_oak_sign", + "minecraft:mangrove_sign", + "minecraft:crimson_sign", + "minecraft:cherry_sign", + "minecraft:birch_sign", + "minecraft:oak_sign", + "minecraft:bamboo_sign" + ], + "#minecraft:skeleton_preferred_weapons": [ + "minecraft:bow" + ], + "#minecraft:skulls": [ + "minecraft:zombie_head", + "minecraft:piglin_head", + "minecraft:player_head", + "minecraft:skeleton_skull", + "minecraft:dragon_head", + "minecraft:wither_skeleton_skull", + "minecraft:creeper_head" + ], + "#minecraft:slabs": [ + "minecraft:cinnabar_slab", + "minecraft:cut_red_sandstone_slab", + "minecraft:stone_brick_slab", + "minecraft:smooth_stone_slab", + "minecraft:brick_slab", + "minecraft:end_stone_brick_slab", + "minecraft:polished_sulfur_slab", + "minecraft:cut_copper_slab", + "minecraft:sulfur_slab", + "minecraft:smooth_sandstone_slab", + "minecraft:acacia_slab", + "minecraft:prismarine_brick_slab", + "minecraft:tuff_slab", + "minecraft:polished_blackstone_slab", + "minecraft:mossy_stone_brick_slab", + "minecraft:granite_slab", + "minecraft:exposed_cut_copper_slab", + "minecraft:cobblestone_slab", + "minecraft:smooth_quartz_slab", + "minecraft:stone_slab", + "minecraft:dark_prismarine_slab", + "minecraft:diorite_slab", + "minecraft:blackstone_slab", + "minecraft:dark_oak_slab", + "minecraft:bamboo_slab", + "minecraft:red_nether_brick_slab", + "minecraft:cobbled_deepslate_slab", + "minecraft:andesite_slab", + "minecraft:bamboo_mosaic_slab", + "minecraft:tuff_brick_slab", + "minecraft:nether_brick_slab", + "minecraft:mossy_cobblestone_slab", + "minecraft:polished_diorite_slab", + "minecraft:purpur_slab", + "minecraft:polished_cinnabar_slab", + "minecraft:mangrove_slab", + "minecraft:polished_deepslate_slab", + "minecraft:pale_oak_slab", + "minecraft:polished_tuff_slab", + "minecraft:crimson_slab", + "minecraft:smooth_red_sandstone_slab", + "minecraft:sulfur_brick_slab", + "minecraft:birch_slab", + "minecraft:polished_granite_slab", + "minecraft:quartz_slab", + "minecraft:mud_brick_slab", + "minecraft:oak_slab", + "minecraft:spruce_slab", + "minecraft:cherry_slab", + "minecraft:polished_andesite_slab", + "minecraft:deepslate_tile_slab", + "minecraft:oxidized_cut_copper_slab", + "minecraft:red_sandstone_slab", + "minecraft:polished_blackstone_brick_slab", + "minecraft:warped_slab", + "minecraft:deepslate_brick_slab", + "minecraft:cut_sandstone_slab", + "minecraft:waxed_exposed_cut_copper_slab", + "minecraft:resin_brick_slab", + "minecraft:weathered_cut_copper_slab", + "minecraft:waxed_weathered_cut_copper_slab", + "minecraft:jungle_slab", + "minecraft:prismarine_slab", + "minecraft:waxed_cut_copper_slab", + "minecraft:sandstone_slab", + "minecraft:petrified_oak_slab", + "minecraft:cinnabar_brick_slab", + "minecraft:waxed_oxidized_cut_copper_slab" + ], + "#minecraft:small_flowers": [ + "minecraft:lily_of_the_valley", + "minecraft:closed_eyeblossom", + "minecraft:red_tulip", + "minecraft:allium", + "minecraft:blue_orchid", + "minecraft:wither_rose", + "minecraft:torchflower", + "minecraft:golden_dandelion", + "minecraft:dandelion", + "minecraft:open_eyeblossom", + "minecraft:oxeye_daisy", + "minecraft:poppy", + "minecraft:white_tulip", + "minecraft:pink_tulip", + "minecraft:cornflower", + "minecraft:orange_tulip", + "minecraft:azure_bluet" + ], + "#minecraft:smelts_to_glass": [ + "minecraft:sand", + "minecraft:red_sand" + ], + "#minecraft:sniffer_food": [ + "minecraft:torchflower_seeds" + ], + "#minecraft:soul_fire_base_blocks": [ + "minecraft:soul_soil", + "minecraft:soul_sand" + ], + "#minecraft:spears": [ + "minecraft:wooden_spear", + "minecraft:diamond_spear", + "minecraft:iron_spear", + "minecraft:golden_spear", + "minecraft:netherite_spear", + "minecraft:copper_spear", + "minecraft:stone_spear" + ], + "#minecraft:spruce_logs": [ + "minecraft:spruce_log", + "minecraft:stripped_spruce_wood", + "minecraft:stripped_spruce_log", + "minecraft:spruce_wood" + ], + "#minecraft:stairs": [ + "minecraft:birch_stairs", + "minecraft:mud_brick_stairs", + "minecraft:waxed_oxidized_cut_copper_stairs", + "minecraft:sulfur_stairs", + "minecraft:cherry_stairs", + "minecraft:cut_copper_stairs", + "minecraft:stone_stairs", + "minecraft:jungle_stairs", + "minecraft:smooth_quartz_stairs", + "minecraft:waxed_cut_copper_stairs", + "minecraft:stone_brick_stairs", + "minecraft:bamboo_mosaic_stairs", + "minecraft:blackstone_stairs", + "minecraft:exposed_cut_copper_stairs", + "minecraft:polished_blackstone_brick_stairs", + "minecraft:dark_prismarine_stairs", + "minecraft:cobblestone_stairs", + "minecraft:red_nether_brick_stairs", + "minecraft:cobbled_deepslate_stairs", + "minecraft:waxed_exposed_cut_copper_stairs", + "minecraft:granite_stairs", + "minecraft:red_sandstone_stairs", + "minecraft:end_stone_brick_stairs", + "minecraft:polished_granite_stairs", + "minecraft:andesite_stairs", + "minecraft:polished_tuff_stairs", + "minecraft:prismarine_stairs", + "minecraft:polished_cinnabar_stairs", + "minecraft:mossy_cobblestone_stairs", + "minecraft:prismarine_brick_stairs", + "minecraft:polished_diorite_stairs", + "minecraft:deepslate_brick_stairs", + "minecraft:resin_brick_stairs", + "minecraft:polished_sulfur_stairs", + "minecraft:bamboo_stairs", + "minecraft:brick_stairs", + "minecraft:pale_oak_stairs", + "minecraft:nether_brick_stairs", + "minecraft:polished_andesite_stairs", + "minecraft:diorite_stairs", + "minecraft:cinnabar_brick_stairs", + "minecraft:waxed_weathered_cut_copper_stairs", + "minecraft:sandstone_stairs", + "minecraft:dark_oak_stairs", + "minecraft:oxidized_cut_copper_stairs", + "minecraft:cinnabar_stairs", + "minecraft:weathered_cut_copper_stairs", + "minecraft:smooth_sandstone_stairs", + "minecraft:acacia_stairs", + "minecraft:polished_blackstone_stairs", + "minecraft:tuff_stairs", + "minecraft:smooth_red_sandstone_stairs", + "minecraft:sulfur_brick_stairs", + "minecraft:mangrove_stairs", + "minecraft:oak_stairs", + "minecraft:deepslate_tile_stairs", + "minecraft:tuff_brick_stairs", + "minecraft:warped_stairs", + "minecraft:purpur_stairs", + "minecraft:spruce_stairs", + "minecraft:crimson_stairs", + "minecraft:quartz_stairs", + "minecraft:polished_deepslate_stairs", + "minecraft:mossy_stone_brick_stairs" + ], + "#minecraft:stone_bricks": [ + "minecraft:chiseled_stone_bricks", + "minecraft:cracked_stone_bricks", + "minecraft:stone_bricks", + "minecraft:mossy_stone_bricks" + ], + "#minecraft:stone_buttons": [ + "minecraft:polished_blackstone_button", + "minecraft:stone_button" + ], + "#minecraft:stone_crafting_materials": [ + "minecraft:cobblestone", + "minecraft:blackstone", + "minecraft:cobbled_deepslate" + ], + "#minecraft:stone_tool_materials": [ + "minecraft:cobblestone", + "minecraft:blackstone", + "minecraft:cobbled_deepslate" + ], + "#minecraft:strider_food": [ + "minecraft:warped_fungus" + ], + "#minecraft:strider_tempt_items": [ + "minecraft:warped_fungus_on_a_stick", + "minecraft:warped_fungus" + ], + "#minecraft:sulfur_cube_food": [ + "minecraft:slime_ball" + ], + "#minecraft:sulfur_cube_swallowable": [ + "#minecraft:sulfur_cube_archetype/sticky", + "#minecraft:sulfur_cube_archetype/fast_flat", + "#minecraft:sulfur_cube_archetype/fast_sliding", + "#minecraft:sulfur_cube_archetype/explosive", + "#minecraft:sulfur_cube_archetype/slow_sliding", + "#minecraft:sulfur_cube_archetype/slow_flat", + "#minecraft:sulfur_cube_archetype/slow_bouncy", + "#minecraft:sulfur_cube_archetype/regular", + "#minecraft:sulfur_cube_archetype/bouncy", + "#minecraft:sulfur_cube_archetype/high_resistance", + "#minecraft:sulfur_cube_archetype/hot", + "#minecraft:sulfur_cube_archetype/light" + ], + "#minecraft:swords": [ + "minecraft:iron_sword", + "minecraft:wooden_sword", + "minecraft:stone_sword", + "minecraft:copper_sword", + "minecraft:diamond_sword", + "minecraft:golden_sword", + "minecraft:netherite_sword" + ], + "#minecraft:terracotta": [ + "minecraft:terracotta", + "minecraft:lime_terracotta", + "minecraft:purple_terracotta", + "minecraft:black_terracotta", + "minecraft:light_gray_terracotta", + "minecraft:green_terracotta", + "minecraft:white_terracotta", + "minecraft:yellow_terracotta", + "minecraft:cyan_terracotta", + "minecraft:red_terracotta", + "minecraft:magenta_terracotta", + "minecraft:brown_terracotta", + "minecraft:pink_terracotta", + "minecraft:gray_terracotta", + "minecraft:orange_terracotta", + "minecraft:blue_terracotta", + "minecraft:light_blue_terracotta" + ], + "#minecraft:trapdoors": [ + "minecraft:jungle_trapdoor", + "minecraft:weathered_copper_trapdoor", + "minecraft:waxed_weathered_copper_trapdoor", + "minecraft:copper_trapdoor", + "minecraft:waxed_copper_trapdoor", + "minecraft:oxidized_copper_trapdoor", + "minecraft:oak_trapdoor", + "minecraft:acacia_trapdoor", + "minecraft:pale_oak_trapdoor", + "minecraft:spruce_trapdoor", + "minecraft:dark_oak_trapdoor", + "minecraft:crimson_trapdoor", + "minecraft:birch_trapdoor", + "minecraft:bamboo_trapdoor", + "minecraft:waxed_exposed_copper_trapdoor", + "minecraft:mangrove_trapdoor", + "minecraft:warped_trapdoor", + "minecraft:waxed_oxidized_copper_trapdoor", + "minecraft:exposed_copper_trapdoor", + "minecraft:cherry_trapdoor", + "minecraft:iron_trapdoor" + ], + "#minecraft:trim_materials": [ + "minecraft:amethyst_shard", + "minecraft:lapis_lazuli", + "minecraft:quartz", + "minecraft:emerald", + "minecraft:copper_ingot", + "minecraft:gold_ingot", + "minecraft:iron_ingot", + "minecraft:diamond", + "minecraft:netherite_ingot", + "minecraft:resin_brick", + "minecraft:redstone" + ], + "#minecraft:trimmable_armor": [ + "#minecraft:foot_armor", + "#minecraft:chest_armor", + "#minecraft:head_armor", + "#minecraft:leg_armor" + ], + "#minecraft:turtle_food": [ + "minecraft:seagrass" + ], + "#minecraft:villager_picks_up": [ + "minecraft:wheat", + "minecraft:pitcher_pod", + "minecraft:torchflower_seeds", + "minecraft:bread", + "minecraft:beetroot_seeds", + "minecraft:potato", + "minecraft:beetroot", + "minecraft:carrot", + "minecraft:wheat_seeds" + ], + "#minecraft:villager_plantable_seeds": [ + "minecraft:pitcher_pod", + "minecraft:torchflower_seeds", + "minecraft:beetroot_seeds", + "minecraft:potato", + "minecraft:carrot", + "minecraft:wheat_seeds" + ], + "#minecraft:walls": [ + "minecraft:sulfur_wall", + "minecraft:sulfur_brick_wall", + "minecraft:polished_blackstone_wall", + "minecraft:polished_blackstone_brick_wall", + "minecraft:mossy_stone_brick_wall", + "minecraft:brick_wall", + "minecraft:deepslate_brick_wall", + "minecraft:cinnabar_wall", + "minecraft:polished_deepslate_wall", + "minecraft:red_sandstone_wall", + "minecraft:resin_brick_wall", + "minecraft:diorite_wall", + "minecraft:nether_brick_wall", + "minecraft:cinnabar_brick_wall", + "minecraft:granite_wall", + "minecraft:tuff_brick_wall", + "minecraft:mossy_cobblestone_wall", + "minecraft:deepslate_tile_wall", + "minecraft:polished_cinnabar_wall", + "minecraft:red_nether_brick_wall", + "minecraft:sandstone_wall", + "minecraft:mud_brick_wall", + "minecraft:tuff_wall", + "minecraft:stone_brick_wall", + "minecraft:blackstone_wall", + "minecraft:end_stone_brick_wall", + "minecraft:prismarine_wall", + "minecraft:polished_sulfur_wall", + "minecraft:polished_tuff_wall", + "minecraft:cobblestone_wall", + "minecraft:andesite_wall", + "minecraft:cobbled_deepslate_wall" + ], + "#minecraft:warped_stems": [ + "minecraft:stripped_warped_hyphae", + "minecraft:stripped_warped_stem", + "minecraft:warped_stem", + "minecraft:warped_hyphae" + ], + "#minecraft:wart_blocks": [ + "minecraft:warped_wart_block", + "minecraft:nether_wart_block" + ], + "#minecraft:wither_skeleton_disliked_weapons": [ + "minecraft:bow", + "minecraft:crossbow" + ], + "#minecraft:wolf_collar_dyes": [ + "minecraft:magenta_dye", + "minecraft:yellow_dye", + "minecraft:green_dye", + "minecraft:gray_dye", + "minecraft:white_dye", + "minecraft:pink_dye", + "minecraft:light_gray_dye", + "minecraft:orange_dye", + "minecraft:blue_dye", + "minecraft:red_dye", + "minecraft:purple_dye", + "minecraft:black_dye", + "minecraft:brown_dye", + "minecraft:light_blue_dye", + "minecraft:lime_dye", + "minecraft:cyan_dye" + ], + "#minecraft:wolf_food": [ + "minecraft:cod", + "minecraft:beef", + "minecraft:rotten_flesh", + "minecraft:mutton", + "minecraft:cooked_rabbit", + "minecraft:cooked_cod", + "minecraft:cooked_beef", + "minecraft:cooked_salmon", + "minecraft:pufferfish", + "minecraft:cooked_mutton", + "minecraft:rabbit", + "minecraft:chicken", + "minecraft:porkchop", + "minecraft:cooked_porkchop", + "minecraft:salmon", + "minecraft:tropical_fish", + "minecraft:rabbit_stew", + "minecraft:cooked_chicken" + ], + "#minecraft:wooden_buttons": [ + "minecraft:dark_oak_button", + "minecraft:pale_oak_button", + "minecraft:cherry_button", + "minecraft:bamboo_button", + "minecraft:acacia_button", + "minecraft:birch_button", + "minecraft:jungle_button", + "minecraft:crimson_button", + "minecraft:oak_button", + "minecraft:warped_button", + "minecraft:spruce_button", + "minecraft:mangrove_button" + ], + "#minecraft:wooden_doors": [ + "minecraft:bamboo_door", + "minecraft:crimson_door", + "minecraft:oak_door", + "minecraft:dark_oak_door", + "minecraft:cherry_door", + "minecraft:acacia_door", + "minecraft:jungle_door", + "minecraft:pale_oak_door", + "minecraft:warped_door", + "minecraft:spruce_door", + "minecraft:mangrove_door", + "minecraft:birch_door" + ], + "#minecraft:wooden_fences": [ + "minecraft:acacia_fence", + "minecraft:dark_oak_fence", + "minecraft:spruce_fence", + "minecraft:crimson_fence", + "minecraft:oak_fence", + "minecraft:jungle_fence", + "minecraft:mangrove_fence", + "minecraft:warped_fence", + "minecraft:bamboo_fence", + "minecraft:birch_fence", + "minecraft:pale_oak_fence", + "minecraft:cherry_fence" + ], + "#minecraft:wooden_pressure_plates": [ + "minecraft:spruce_pressure_plate", + "minecraft:crimson_pressure_plate", + "minecraft:warped_pressure_plate", + "minecraft:oak_pressure_plate", + "minecraft:bamboo_pressure_plate", + "minecraft:acacia_pressure_plate", + "minecraft:mangrove_pressure_plate", + "minecraft:pale_oak_pressure_plate", + "minecraft:birch_pressure_plate", + "minecraft:jungle_pressure_plate", + "minecraft:dark_oak_pressure_plate", + "minecraft:cherry_pressure_plate" + ], + "#minecraft:wooden_shelves": [ + "minecraft:warped_shelf", + "minecraft:crimson_shelf", + "minecraft:jungle_shelf", + "minecraft:acacia_shelf", + "minecraft:birch_shelf", + "minecraft:pale_oak_shelf", + "minecraft:mangrove_shelf", + "minecraft:oak_shelf", + "minecraft:cherry_shelf", + "minecraft:spruce_shelf", + "minecraft:dark_oak_shelf", + "minecraft:bamboo_shelf" + ], + "#minecraft:wooden_slabs": [ + "minecraft:warped_slab", + "minecraft:jungle_slab", + "minecraft:mangrove_slab", + "minecraft:acacia_slab", + "minecraft:dark_oak_slab", + "minecraft:pale_oak_slab", + "minecraft:crimson_slab", + "minecraft:bamboo_slab", + "minecraft:oak_slab", + "minecraft:birch_slab", + "minecraft:spruce_slab", + "minecraft:cherry_slab" + ], + "#minecraft:wooden_stairs": [ + "minecraft:acacia_stairs", + "minecraft:birch_stairs", + "minecraft:bamboo_stairs", + "minecraft:mangrove_stairs", + "minecraft:oak_stairs", + "minecraft:pale_oak_stairs", + "minecraft:warped_stairs", + "minecraft:spruce_stairs", + "minecraft:crimson_stairs", + "minecraft:cherry_stairs", + "minecraft:jungle_stairs", + "minecraft:dark_oak_stairs" + ], + "#minecraft:wooden_tool_materials": [ + "minecraft:oak_planks", + "minecraft:cherry_planks", + "minecraft:crimson_planks", + "minecraft:pale_oak_planks", + "minecraft:bamboo_planks", + "minecraft:mangrove_planks", + "minecraft:acacia_planks", + "minecraft:birch_planks", + "minecraft:warped_planks", + "minecraft:jungle_planks", + "minecraft:dark_oak_planks", + "minecraft:spruce_planks" + ], + "#minecraft:wooden_trapdoors": [ + "minecraft:dark_oak_trapdoor", + "minecraft:jungle_trapdoor", + "minecraft:crimson_trapdoor", + "minecraft:birch_trapdoor", + "minecraft:bamboo_trapdoor", + "minecraft:cherry_trapdoor", + "minecraft:oak_trapdoor", + "minecraft:mangrove_trapdoor", + "minecraft:acacia_trapdoor", + "minecraft:pale_oak_trapdoor", + "minecraft:warped_trapdoor", + "minecraft:spruce_trapdoor" + ], + "#minecraft:wool": [ + "minecraft:pink_wool", + "minecraft:yellow_wool", + "minecraft:green_wool", + "minecraft:light_gray_wool", + "minecraft:gray_wool", + "minecraft:lime_wool", + "minecraft:cyan_wool", + "minecraft:black_wool", + "minecraft:orange_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:light_blue_wool", + "minecraft:brown_wool", + "minecraft:red_wool", + "minecraft:magenta_wool", + "minecraft:white_wool" + ], + "#minecraft:wool_carpets": [ + "minecraft:white_carpet", + "minecraft:purple_carpet", + "minecraft:light_blue_carpet", + "minecraft:gray_carpet", + "minecraft:red_carpet", + "minecraft:blue_carpet", + "minecraft:light_gray_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:cyan_carpet", + "minecraft:green_carpet", + "minecraft:magenta_carpet", + "minecraft:brown_carpet", + "minecraft:orange_carpet", + "minecraft:pink_carpet", + "minecraft:black_carpet" + ], + "#minecraft:zombie_horse_food": [ + "minecraft:red_mushroom" + ], + "#minecraft:armor": [ + "#minecraft:enchantable/chest_armor", + "#minecraft:enchantable/head_armor", + "#minecraft:enchantable/foot_armor", + "#minecraft:enchantable/leg_armor" + ], + "#minecraft:bow": [ + "minecraft:bow" + ], + "#minecraft:crossbow": [ + "minecraft:crossbow" + ], + "#minecraft:durability": [ + "minecraft:trident", + "minecraft:brush", + "minecraft:shield", + "minecraft:wooden_sword", + "minecraft:diamond_shovel", + "minecraft:crossbow", + "minecraft:diamond_sword", + "minecraft:golden_spear", + "minecraft:wooden_shovel", + "minecraft:warped_fungus_on_a_stick", + "minecraft:stone_shovel", + "minecraft:copper_hoe", + "minecraft:golden_pickaxe", + "#minecraft:leg_armor", + "minecraft:stone_pickaxe", + "minecraft:fishing_rod", + "minecraft:iron_sword", + "minecraft:golden_hoe", + "minecraft:diamond_spear", + "minecraft:stone_sword", + "minecraft:stone_spear", + "minecraft:netherite_pickaxe", + "minecraft:copper_sword", + "minecraft:iron_shovel", + "#minecraft:foot_armor", + "minecraft:copper_axe", + "minecraft:netherite_shovel", + "minecraft:golden_shovel", + "minecraft:shears", + "minecraft:diamond_pickaxe", + "minecraft:stone_axe", + "minecraft:iron_axe", + "minecraft:copper_shovel", + "minecraft:wooden_axe", + "minecraft:wooden_pickaxe", + "minecraft:diamond_hoe", + "minecraft:netherite_hoe", + "minecraft:carrot_on_a_stick", + "minecraft:copper_pickaxe", + "minecraft:wooden_hoe", + "minecraft:golden_axe", + "minecraft:mace", + "minecraft:iron_pickaxe", + "minecraft:bow", + "minecraft:stone_hoe", + "minecraft:elytra", + "minecraft:iron_hoe", + "minecraft:netherite_axe", + "minecraft:wooden_spear", + "minecraft:iron_spear", + "#minecraft:chest_armor", + "minecraft:diamond_axe", + "minecraft:flint_and_steel", + "minecraft:golden_sword", + "minecraft:netherite_spear", + "minecraft:copper_spear", + "minecraft:netherite_sword", + "#minecraft:head_armor" + ], + "#minecraft:equippable": [ + "minecraft:zombie_head", + "minecraft:piglin_head", + "minecraft:carved_pumpkin", + "minecraft:player_head", + "minecraft:skeleton_skull", + "#minecraft:chest_armor", + "minecraft:dragon_head", + "minecraft:wither_skeleton_skull", + "minecraft:creeper_head", + "#minecraft:foot_armor", + "minecraft:elytra", + "#minecraft:head_armor", + "#minecraft:leg_armor" + ], + "#minecraft:fire_aspect": [ + "minecraft:mace", + "#minecraft:enchantable/melee_weapon" + ], + "#minecraft:fishing": [ + "minecraft:fishing_rod" + ], + "#minecraft:lunge": [ + "minecraft:wooden_spear", + "minecraft:iron_spear", + "minecraft:diamond_spear", + "minecraft:golden_spear", + "minecraft:netherite_spear", + "minecraft:copper_spear", + "minecraft:stone_spear" + ], + "#minecraft:mace": [ + "minecraft:mace" + ], + "#minecraft:melee_weapon": [ + "minecraft:iron_sword", + "minecraft:wooden_spear", + "minecraft:diamond_spear", + "minecraft:wooden_sword", + "minecraft:stone_sword", + "minecraft:iron_spear", + "minecraft:copper_sword", + "minecraft:golden_spear", + "minecraft:diamond_sword", + "minecraft:netherite_spear", + "minecraft:golden_sword", + "minecraft:copper_spear", + "minecraft:netherite_sword", + "minecraft:stone_spear" + ], + "#minecraft:mining": [ + "minecraft:diamond_shovel", + "minecraft:wooden_shovel", + "minecraft:stone_shovel", + "minecraft:copper_hoe", + "minecraft:golden_pickaxe", + "minecraft:stone_pickaxe", + "minecraft:golden_hoe", + "minecraft:netherite_pickaxe", + "minecraft:iron_shovel", + "minecraft:copper_axe", + "minecraft:netherite_shovel", + "minecraft:golden_shovel", + "minecraft:shears", + "minecraft:diamond_pickaxe", + "minecraft:stone_axe", + "minecraft:iron_axe", + "minecraft:copper_shovel", + "minecraft:wooden_axe", + "minecraft:wooden_pickaxe", + "minecraft:diamond_hoe", + "minecraft:netherite_hoe", + "minecraft:copper_pickaxe", + "minecraft:wooden_hoe", + "minecraft:golden_axe", + "minecraft:iron_pickaxe", + "minecraft:stone_hoe", + "minecraft:iron_hoe", + "minecraft:netherite_axe", + "minecraft:diamond_axe" + ], + "#minecraft:mining_loot": [ + "minecraft:diamond_shovel", + "minecraft:wooden_shovel", + "minecraft:stone_shovel", + "minecraft:copper_hoe", + "minecraft:golden_pickaxe", + "minecraft:stone_pickaxe", + "minecraft:golden_hoe", + "minecraft:netherite_pickaxe", + "minecraft:iron_shovel", + "minecraft:copper_axe", + "minecraft:netherite_shovel", + "minecraft:golden_shovel", + "minecraft:diamond_pickaxe", + "minecraft:stone_axe", + "minecraft:iron_axe", + "minecraft:copper_shovel", + "minecraft:wooden_axe", + "minecraft:wooden_pickaxe", + "minecraft:diamond_hoe", + "minecraft:netherite_hoe", + "minecraft:copper_pickaxe", + "minecraft:wooden_hoe", + "minecraft:golden_axe", + "minecraft:iron_pickaxe", + "minecraft:stone_hoe", + "minecraft:iron_hoe", + "minecraft:netherite_axe", + "minecraft:diamond_axe" + ], + "#minecraft:sharp_weapon": [ + "minecraft:stone_axe", + "minecraft:iron_axe", + "minecraft:wooden_axe", + "minecraft:diamond_axe", + "#minecraft:enchantable/melee_weapon", + "minecraft:golden_axe", + "minecraft:copper_axe", + "minecraft:netherite_axe" + ], + "#minecraft:sweeping": [ + "minecraft:iron_sword", + "minecraft:wooden_sword", + "minecraft:stone_sword", + "minecraft:copper_sword", + "minecraft:diamond_sword", + "minecraft:golden_sword", + "minecraft:netherite_sword" + ], + "#minecraft:trident": [ + "minecraft:trident" + ], + "#minecraft:vanishing": [ + "minecraft:zombie_head", + "minecraft:piglin_head", + "minecraft:carved_pumpkin", + "minecraft:player_head", + "minecraft:compass", + "minecraft:skeleton_skull", + "minecraft:dragon_head", + "minecraft:wither_skeleton_skull", + "minecraft:creeper_head", + "#minecraft:enchantable/durability" + ], + "#minecraft:weapon": [ + "minecraft:mace", + "#minecraft:enchantable/sharp_weapon" + ], + "#minecraft:bouncy": [ + "minecraft:crimson_planks", + "minecraft:bamboo_planks", + "minecraft:mangrove_planks", + "minecraft:stripped_warped_hyphae", + "minecraft:stripped_mangrove_log", + "minecraft:stripped_spruce_wood", + "minecraft:spruce_wood", + "minecraft:pale_oak_wood", + "minecraft:jungle_log", + "minecraft:dark_oak_wood", + "minecraft:stripped_mangrove_wood", + "minecraft:jungle_planks", + "minecraft:stripped_acacia_wood", + "minecraft:stripped_crimson_stem", + "minecraft:stripped_warped_stem", + "minecraft:cherry_planks", + "minecraft:stripped_acacia_log", + "minecraft:stripped_cherry_log", + "minecraft:acacia_log", + "minecraft:stripped_dark_oak_log", + "minecraft:stripped_dark_oak_wood", + "minecraft:stripped_jungle_log", + "minecraft:stripped_crimson_hyphae", + "minecraft:stripped_birch_wood", + "minecraft:birch_planks", + "minecraft:warped_planks", + "minecraft:mangrove_wood", + "minecraft:pale_oak_log", + "minecraft:mangrove_log", + "minecraft:bamboo_block", + "minecraft:cherry_log", + "minecraft:stripped_oak_wood", + "minecraft:bamboo_mosaic", + "minecraft:spruce_log", + "minecraft:stripped_cherry_wood", + "minecraft:dark_oak_log", + "minecraft:birch_log", + "minecraft:acacia_planks", + "minecraft:stripped_pale_oak_log", + "minecraft:stripped_bamboo_block", + "minecraft:cherry_wood", + "minecraft:stripped_jungle_wood", + "minecraft:dark_oak_planks", + "minecraft:spruce_planks", + "minecraft:oak_log", + "minecraft:oak_wood", + "minecraft:oak_planks", + "minecraft:pale_oak_planks", + "minecraft:acacia_wood", + "minecraft:stripped_spruce_log", + "minecraft:crimson_hyphae", + "minecraft:crimson_stem", + "minecraft:stripped_birch_log", + "minecraft:stripped_oak_log", + "minecraft:warped_hyphae", + "minecraft:warped_stem", + "minecraft:jungle_wood", + "minecraft:stripped_pale_oak_wood", + "minecraft:birch_wood" + ], + "#minecraft:explosive": [ + "minecraft:tnt" + ], + "#minecraft:fast_flat": [ + "minecraft:chiseled_resin_bricks", + "minecraft:fire_coral_block", + "minecraft:pearlescent_froglight", + "minecraft:bubble_coral_block", + "minecraft:brain_coral_block", + "minecraft:dead_bubble_coral_block", + "minecraft:moss_block", + "minecraft:pumpkin", + "minecraft:horn_coral_block", + "minecraft:tube_coral_block", + "minecraft:jack_o_lantern", + "minecraft:dried_kelp_block", + "minecraft:dead_horn_coral_block", + "minecraft:dead_tube_coral_block", + "minecraft:ochre_froglight", + "minecraft:dead_fire_coral_block", + "minecraft:sponge", + "minecraft:resin_bricks", + "minecraft:hay_block", + "minecraft:melon", + "minecraft:wet_sponge", + "minecraft:resin_block", + "minecraft:verdant_froglight", + "minecraft:carved_pumpkin", + "minecraft:dead_brain_coral_block", + "minecraft:pale_moss_block" + ], + "#minecraft:fast_sliding": [ + "minecraft:packed_ice", + "minecraft:snow_block", + "minecraft:blue_ice" + ], + "#minecraft:high_resistance": [ + "minecraft:soul_soil", + "minecraft:soul_sand" + ], + "#minecraft:hot": [ + "minecraft:magma_block" + ], + "#minecraft:light": [ + "minecraft:pink_wool", + "minecraft:yellow_wool", + "minecraft:green_wool", + "minecraft:light_gray_wool", + "minecraft:gray_wool", + "minecraft:lime_wool", + "minecraft:cyan_wool", + "minecraft:black_wool", + "minecraft:orange_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:light_blue_wool", + "minecraft:brown_wool", + "minecraft:red_wool", + "minecraft:magenta_wool", + "minecraft:white_wool" + ], + "#minecraft:regular": [ + "minecraft:lime_concrete_powder", + "minecraft:blue_concrete_powder", + "minecraft:orange_concrete_powder", + "minecraft:pink_concrete_powder", + "minecraft:magenta_concrete_powder", + "minecraft:light_gray_concrete_powder", + "minecraft:coarse_dirt", + "minecraft:bone_block", + "minecraft:coal_block", + "minecraft:rooted_dirt", + "minecraft:clay", + "minecraft:white_concrete_powder", + "minecraft:gray_concrete_powder", + "minecraft:brown_concrete_powder", + "minecraft:red_concrete_powder", + "minecraft:purple_concrete_powder", + "minecraft:cyan_concrete_powder", + "minecraft:light_blue_concrete_powder", + "minecraft:podzol", + "minecraft:green_concrete_powder", + "minecraft:black_concrete_powder", + "minecraft:yellow_concrete_powder", + "minecraft:packed_mud", + "minecraft:grass_block", + "minecraft:mud", + "minecraft:muddy_mangrove_roots", + "minecraft:dirt" + ], + "#minecraft:slow_bouncy": [ + "minecraft:amethyst_block", + "minecraft:bricks", + "minecraft:nether_quartz_ore", + "minecraft:gilded_blackstone", + "minecraft:deepslate_diamond_ore", + "minecraft:red_concrete", + "minecraft:red_sandstone", + "minecraft:black_concrete", + "minecraft:deepslate_emerald_ore", + "minecraft:white_concrete", + "minecraft:chiseled_red_sandstone", + "minecraft:cinnabar", + "minecraft:light_gray_terracotta", + "minecraft:white_glazed_terracotta", + "minecraft:redstone_lamp", + "minecraft:purpur_pillar", + "minecraft:deepslate_redstone_ore", + "minecraft:andesite", + "minecraft:deepslate", + "minecraft:chiseled_nether_bricks", + "minecraft:nether_bricks", + "minecraft:diamond_block", + "minecraft:netherrack", + "minecraft:chiseled_tuff_bricks", + "minecraft:green_terracotta", + "minecraft:white_terracotta", + "minecraft:polished_blackstone_bricks", + "minecraft:polished_basalt", + "minecraft:green_concrete", + "minecraft:quartz_pillar", + "minecraft:quartz_bricks", + "minecraft:dripstone_block", + "minecraft:pink_terracotta", + "minecraft:gray_concrete", + "minecraft:chiseled_sandstone", + "minecraft:smooth_stone", + "minecraft:terracotta", + "minecraft:black_terracotta", + "minecraft:black_glazed_terracotta", + "minecraft:smooth_red_sandstone", + "minecraft:cyan_glazed_terracotta", + "minecraft:blue_concrete", + "minecraft:light_gray_glazed_terracotta", + "minecraft:mossy_cobblestone", + "minecraft:coal_ore", + "minecraft:cut_red_sandstone", + "minecraft:redstone_ore", + "minecraft:light_gray_concrete", + "minecraft:chiseled_tuff", + "minecraft:warped_nylium", + "minecraft:lapis_ore", + "minecraft:gray_terracotta", + "minecraft:diamond_ore", + "minecraft:lime_concrete", + "minecraft:yellow_concrete", + "minecraft:dark_prismarine", + "minecraft:orange_terracotta", + "minecraft:brown_concrete", + "minecraft:light_blue_terracotta", + "minecraft:blackstone", + "minecraft:smooth_quartz", + "minecraft:obsidian", + "minecraft:sulfur", + "minecraft:sulfur_bricks", + "minecraft:orange_glazed_terracotta", + "minecraft:magenta_terracotta", + "minecraft:blue_terracotta", + "minecraft:cracked_deepslate_bricks", + "minecraft:polished_cinnabar", + "minecraft:chiseled_quartz_block", + "minecraft:cyan_terracotta", + "minecraft:glowstone", + "minecraft:red_glazed_terracotta", + "minecraft:magenta_glazed_terracotta", + "minecraft:deepslate_bricks", + "minecraft:cracked_deepslate_tiles", + "minecraft:cut_sandstone", + "minecraft:pink_glazed_terracotta", + "minecraft:light_blue_glazed_terracotta", + "minecraft:tuff", + "minecraft:calcite", + "minecraft:brown_terracotta", + "minecraft:mossy_stone_bricks", + "minecraft:purple_terracotta", + "minecraft:chiseled_cinnabar", + "minecraft:polished_tuff", + "minecraft:end_stone", + "minecraft:tuff_bricks", + "minecraft:green_glazed_terracotta", + "minecraft:brown_glazed_terracotta", + "minecraft:end_stone_bricks", + "minecraft:emerald_block", + "minecraft:sea_lantern", + "minecraft:polished_diorite", + "minecraft:prismarine_bricks", + "minecraft:emerald_ore", + "minecraft:deepslate_lapis_ore", + "minecraft:stone", + "minecraft:polished_andesite", + "minecraft:chiseled_sulfur", + "minecraft:smooth_sandstone", + "minecraft:cobbled_deepslate", + "minecraft:quartz_block", + "minecraft:yellow_terracotta", + "minecraft:blue_glazed_terracotta", + "minecraft:lapis_block", + "minecraft:smooth_basalt", + "minecraft:stone_bricks", + "minecraft:lime_terracotta", + "minecraft:purple_glazed_terracotta", + "minecraft:gray_glazed_terracotta", + "minecraft:chiseled_polished_blackstone", + "minecraft:polished_sulfur", + "minecraft:crimson_nylium", + "minecraft:red_terracotta", + "minecraft:cobblestone", + "minecraft:cyan_concrete", + "minecraft:prismarine", + "minecraft:light_blue_concrete", + "minecraft:diorite", + "minecraft:lime_glazed_terracotta", + "minecraft:magenta_concrete", + "minecraft:purple_concrete", + "minecraft:chiseled_stone_bricks", + "minecraft:granite", + "minecraft:purpur_block", + "minecraft:orange_concrete", + "minecraft:sandstone", + "minecraft:deepslate_coal_ore", + "minecraft:yellow_glazed_terracotta", + "minecraft:polished_blackstone", + "minecraft:cracked_stone_bricks", + "minecraft:basalt", + "minecraft:polished_granite", + "minecraft:cinnabar_bricks", + "minecraft:observer", + "minecraft:polished_deepslate", + "minecraft:mud_bricks", + "minecraft:chiseled_deepslate", + "minecraft:red_nether_bricks", + "minecraft:crying_obsidian", + "minecraft:cracked_polished_blackstone_bricks", + "minecraft:cracked_nether_bricks", + "minecraft:deepslate_tiles", + "minecraft:pink_concrete" + ], + "#minecraft:slow_flat": [ + "minecraft:iron_block", + "minecraft:copper_block", + "minecraft:waxed_oxidized_copper", + "minecraft:copper_bulb", + "minecraft:gold_block", + "minecraft:gold_ore", + "minecraft:waxed_copper_block", + "minecraft:waxed_exposed_chiseled_copper", + "minecraft:waxed_cut_copper", + "minecraft:nether_gold_ore", + "minecraft:weathered_copper_bulb", + "minecraft:waxed_oxidized_chiseled_copper", + "minecraft:netherite_block", + "minecraft:waxed_oxidized_cut_copper", + "minecraft:copper_ore", + "minecraft:oxidized_copper_bulb", + "minecraft:waxed_exposed_copper_bulb", + "minecraft:deepslate_iron_ore", + "minecraft:raw_iron_block", + "minecraft:oxidized_cut_copper", + "minecraft:waxed_weathered_cut_copper", + "minecraft:waxed_chiseled_copper", + "minecraft:exposed_copper_bulb", + "minecraft:weathered_chiseled_copper", + "minecraft:waxed_weathered_copper_bulb", + "minecraft:cut_copper", + "minecraft:waxed_copper_bulb", + "minecraft:waxed_weathered_copper", + "minecraft:waxed_exposed_copper", + "minecraft:deepslate_gold_ore", + "minecraft:deepslate_copper_ore", + "minecraft:weathered_copper", + "minecraft:iron_ore", + "minecraft:weathered_cut_copper", + "minecraft:waxed_exposed_cut_copper", + "minecraft:oxidized_copper", + "minecraft:ancient_debris", + "minecraft:raw_copper_block", + "minecraft:chiseled_copper", + "minecraft:waxed_oxidized_copper_bulb", + "minecraft:oxidized_chiseled_copper", + "minecraft:raw_gold_block", + "minecraft:waxed_weathered_chiseled_copper", + "minecraft:exposed_copper", + "minecraft:exposed_chiseled_copper", + "minecraft:exposed_cut_copper" + ], + "#minecraft:slow_sliding": [ + "minecraft:shroomlight", + "minecraft:mycelium", + "minecraft:mushroom_stem", + "minecraft:nether_wart_block", + "minecraft:warped_wart_block", + "minecraft:brown_mushroom_block", + "minecraft:red_mushroom_block" + ], + "#minecraft:sticky": [ + "minecraft:honeycomb_block" + ] + } +} \ No newline at end of file