diff --git a/.gitea/workflows/build-readme.yml b/.gitea/workflows/build-readme.yml new file mode 100644 index 0000000..37d20bc --- /dev/null +++ b/.gitea/workflows/build-readme.yml @@ -0,0 +1,56 @@ +name: Build renameable item readme + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Set up Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + + - name: Resolve latest Minecraft release + run: | + mkdir -p build + python build/scripts/resolve_latest_minecraft_release.py > build/minecraft-version.txt + + - name: Read latest Minecraft release + id: minecraft_version + shell: bash + run: | + release=$(head -n 1 build/minecraft-version.txt) + echo "release=$release" >> "$GITHUB_OUTPUT" + + - name: Build readme + run: python build/scripts/build_readme.py --pack-root resourcepack --output-dir build + + - name: Render model previews + env: + MINECRAFT_VERSION: ${{ steps.minecraft_version.outputs.release }} + RENDER_MANIFEST: ${{ github.workspace }}/build/renameable-items.json + RENDER_OUTPUT_DIR: ${{ github.workspace }}/build + RENDER_PACK_ROOT: ${{ github.workspace }}/resourcepack + run: python build/scripts/render_client_items.py --manifest build/renameable-items.json --pack-root resourcepack --output-dir build + + - name: Publish generated catalog artifacts + uses: actions/upload-artifact@v4 + with: + name: renameable-item-catalog + path: | + build + README.md \ No newline at end of file diff --git a/.gitea/workflows/package-resourcepack.yml b/.gitea/workflows/package-resourcepack.yml new file mode 100644 index 0000000..0c3bea6 --- /dev/null +++ b/.gitea/workflows/package-resourcepack.yml @@ -0,0 +1,25 @@ +name: Package resourcepack release + +on: + push: + tags: + - "v*" + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Package resourcepack and create release + env: + RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} + GITEA_SERVER_URL: ${{ github.server_url }} + GITEA_REPOSITORY: ${{ github.repository }} + run: python build/scripts/publish_resourcepack_release.py --resourcepack-root resourcepack --archive-path build/resourcepack.zip --tag ${{ github.ref_name }} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6f1e313 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# Renameable Item Catalog + +Generated from the resource pack item model JSON. + +## Summary + +- Base items: 26 +- Rename variants: 229 +- Full catalog: [build/renameable-items.md](build/renameable-items.md) + +## Item Index + +- [apple](build/renameable-items.md#apple) +- [baked_potato](build/renameable-items.md#baked_potato) +- [beetroot_soup](build/renameable-items.md#beetroot_soup) +- [bone](build/renameable-items.md#bone) +- [bread](build/renameable-items.md#bread) +- [cake](build/renameable-items.md#cake) +- [candle](build/renameable-items.md#candle) +- [carrot](build/renameable-items.md#carrot) +- [cocoa_beans](build/renameable-items.md#cocoa_beans) +- [cod](build/renameable-items.md#cod) +- [cooked_beef](build/renameable-items.md#cooked_beef) +- [cooked_chicken](build/renameable-items.md#cooked_chicken) +- [cooked_cod](build/renameable-items.md#cooked_cod) +- [cooked_porkchop](build/renameable-items.md#cooked_porkchop) +- [cooked_rabbit](build/renameable-items.md#cooked_rabbit) +- [cookie](build/renameable-items.md#cookie) +- [dried_kelp](build/renameable-items.md#dried_kelp) +- [glass_bottle](build/renameable-items.md#glass_bottle) +- [glow_berries](build/renameable-items.md#glow_berries) +- [melon_slice](build/renameable-items.md#melon_slice) +- [mushroom_stew](build/renameable-items.md#mushroom_stew) +- [oak_sapling](build/renameable-items.md#oak_sapling) +- [paper](build/renameable-items.md#paper) +- [pumpkin_pie](build/renameable-items.md#pumpkin_pie) +- [salmon](build/renameable-items.md#salmon) +- [sweet_berries](build/renameable-items.md#sweet_berries) + +The linked catalog contains the generated item sections and rename variants. \ No newline at end of file diff --git a/build/client-renderer/build.gradle b/build/client-renderer/build.gradle new file mode 100644 index 0000000..77796e5 --- /dev/null +++ b/build/client-renderer/build.gradle @@ -0,0 +1,48 @@ +plugins { + id 'fabric-loom' version '1.7-SNAPSHOT' + id 'java' +} + +group = 'dev.github.copilot' +version = '1.0.0' + +repositories { + maven { url = 'https://maven.fabricmc.net/' } + mavenCentral() +} + +def minecraftVersion = providers.environmentVariable('MINECRAFT_VERSION') + .orElse(providers.gradleProperty('minecraft_version')) + .get() + +dependencies { + minecraft "com.mojang:minecraft:${minecraftVersion}" + mappings loom.officialMojangMappings() + modImplementation "net.fabricmc:fabric-loader:0.16.10" + implementation 'com.google.code.gson:gson:2.11.0' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' + options.release = 21 +} + +sourceSets { + main { + resources.srcDir(file('../resourcepack')) + } +} + +loom { + runs { + client { + programArgs '--username', 'RenderBot' + } + } +} \ No newline at end of file diff --git a/build/client-renderer/settings.gradle b/build/client-renderer/settings.gradle new file mode 100644 index 0000000..6106c1d --- /dev/null +++ b/build/client-renderer/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'renameable-item-renderer' \ No newline at end of file diff --git a/build/client-renderer/src/main/java/dev/github/copilot/renameable/RenderCatalogClient.java b/build/client-renderer/src/main/java/dev/github/copilot/renameable/RenderCatalogClient.java new file mode 100644 index 0000000..d5005b9 --- /dev/null +++ b/build/client-renderer/src/main/java/dev/github/copilot/renameable/RenderCatalogClient.java @@ -0,0 +1,216 @@ +package dev.github.copilot.renameable; + +import java.io.IOException; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import net.fabricmc.api.ClientModInitializer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.util.ScreenshotRecorder; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.Registries; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public final class RenderCatalogClient implements ClientModInitializer { + private static final Gson GSON = new Gson(); + + private final List jobs = new ArrayList<>(); + private Path outputDir; + private int currentJobIndex; + + @Override + public void onInitializeClient() { + Path manifestPath = readPathEnv("RENDER_MANIFEST"); + outputDir = readPathEnv("RENDER_OUTPUT_DIR"); + + if (manifestPath == null || outputDir == null) { + return; + } + + try { + loadJobs(manifestPath); + } catch (IOException exception) { + throw new RuntimeException("Failed to load render manifest", exception); + } + + jobs.sort(Comparator.comparing(RenderJob::outputPath)); + if (jobs.isEmpty()) { + return; + } + + MinecraftClient client = MinecraftClient.getInstance(); + client.execute(() -> client.setScreen(new RenderScreen())); + } + + private void loadJobs(Path manifestPath) throws IOException { + try (Reader reader = Files.newBufferedReader(manifestPath, StandardCharsets.UTF_8)) { + JsonElement root = JsonParser.parseReader(reader); + if (!root.isJsonArray()) { + return; + } + + JsonArray records = root.getAsJsonArray(); + for (JsonElement recordElement : records) { + if (!recordElement.isJsonObject()) { + continue; + } + + JsonObject record = recordElement.getAsJsonObject(); + collectJob(record.get("item"), record.get("render_path"), null); + + JsonElement casesElement = record.get("cases"); + if (!casesElement.isJsonArray()) { + continue; + } + + for (JsonElement caseElement : casesElement.getAsJsonArray()) { + if (!caseElement.isJsonObject()) { + continue; + } + + JsonObject caseRecord = caseElement.getAsJsonObject(); + collectJob(record.get("item"), caseRecord.get("render_path"), caseRecord.get("when")); + } + } + } + } + + private void collectJob(JsonElement itemElement, JsonElement renderPathElement, JsonElement customNameElement) { + if (itemElement == null || !itemElement.isJsonPrimitive()) { + return; + } + + if (renderPathElement == null || renderPathElement.isJsonNull() || !renderPathElement.isJsonPrimitive()) { + return; + } + + String itemId = itemElement.getAsString(); + String renderPath = renderPathElement.getAsString(); + String customName = customNameElement != null && customNameElement.isJsonPrimitive() ? customNameElement.getAsString() : null; + + ItemStack stack = new ItemStack(Registries.ITEM.get(Identifier.of("minecraft", itemId))); + if (stack.isEmpty()) { + return; + } + + if (customName != null) { + stack.setCustomName(Text.literal(customName)); + } + + jobs.add(new RenderJob(renderPath, stack)); + } + + private Path readPathEnv(String key) { + String value = System.getenv(key); + if (value == null || value.isBlank()) { + return null; + } + + return Path.of(value); + } + + private void renderCurrentJob(MinecraftClient client, RenderScreen screen) { + if (currentJobIndex >= jobs.size()) { + client.scheduleStop(); + return; + } + + RenderJob job = jobs.get(currentJobIndex); + Path jobPath = outputDir.resolve(job.outputPath()).normalize(); + Path parent = jobPath.getParent(); + if (parent == null) { + client.scheduleStop(); + return; + } + + try { + Files.createDirectories(parent); + } catch (IOException exception) { + throw new RuntimeException("Failed to create render output directory", exception); + } + + String fileName = stripPngSuffix(jobPath.getFileName().toString()); + ScreenshotRecorder.saveScreenshot(parent.toFile(), fileName, client.getFramebuffer(), client.getWindow().getFramebufferWidth(), status -> client.execute(this::advanceJob)); + screen.markCaptureQueued(); + } + + private void advanceJob() { + currentJobIndex++; + MinecraftClient client = MinecraftClient.getInstance(); + if (currentJobIndex >= jobs.size()) { + client.scheduleStop(); + return; + } + + Screen currentScreen = client.currentScreen; + if (currentScreen instanceof RenderScreen renderScreen) { + renderScreen.resetCaptureState(); + } + } + + private String stripPngSuffix(String fileName) { + if (fileName.endsWith(".png")) { + return fileName.substring(0, fileName.length() - 4); + } + + return fileName; + } + + private record RenderJob(String outputPath, ItemStack stack) { + } + + private final class RenderScreen extends Screen { + private boolean captureQueued; + + private RenderScreen() { + super(Text.literal("Rendering renameable items")); + } + + private void markCaptureQueued() { + captureQueued = true; + } + + private void resetCaptureState() { + captureQueued = false; + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + context.fill(0, 0, width, height, 0x00000000); + + if (currentJobIndex < jobs.size()) { + RenderJob job = jobs.get(currentJobIndex); + context.getMatrices().push(); + context.getMatrices().translate(width / 2.0, height / 2.0, 0.0); + context.getMatrices().scale(8.0f, 8.0f, 1.0f); + context.drawItem((LivingEntity) null, job.stack(), -1, -1, 0); + context.getMatrices().pop(); + + if (!captureQueued) { + captureQueued = true; + MinecraftClient client = MinecraftClient.getInstance(); + client.execute(() -> renderCurrentJob(client, this)); + } + } + } + + @Override + public boolean shouldPause() { + return false; + } + } +} \ No newline at end of file diff --git a/build/client-renderer/src/main/resources/fabric.mod.json b/build/client-renderer/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..c14f97b --- /dev/null +++ b/build/client-renderer/src/main/resources/fabric.mod.json @@ -0,0 +1,17 @@ +{ + "schemaVersion": 1, + "id": "renameable-item-renderer", + "version": "${version}", + "name": "Renameable Item Renderer", + "description": "Renders renameable item previews with the Minecraft client renderer.", + "environment": "client", + "entrypoints": { + "client": [ + "dev.github.copilot.renameable.RenderCatalogClient" + ] + }, + "depends": { + "minecraft": "*", + "fabricloader": ">=0.16.10" + } +} \ No newline at end of file diff --git a/build/renameable-items.json b/build/renameable-items.json new file mode 100644 index 0000000..9e45fbe --- /dev/null +++ b/build/renameable-items.json @@ -0,0 +1,1355 @@ +[ + { + "item": "apple", + "fallback_model": "minecraft:item/apple", + "source_file": "assets/minecraft/items/apple.json", + "render_path": null, + "cases": [ + { + "when": "cider", + "model": "lz:food/drink_apple_cider", + "render_path": "renders/lz/food/drink_apple_cider.png" + }, + { + "when": "pie", + "model": "lz:food/pie_apple", + "render_path": "renders/lz/food/pie_apple.png" + }, + { + "when": "pie1", + "model": "lz:food/pie_apple1", + "render_path": "renders/lz/food/pie_apple1.png" + }, + { + "when": "pie2", + "model": "lz:food/pie_apple2", + "render_path": "renders/lz/food/pie_apple2.png" + }, + { + "when": "pie3", + "model": "lz:food/pie_apple3", + "render_path": "renders/lz/food/pie_apple3.png" + }, + { + "when": "pie4", + "model": "lz:food/pie_apple4", + "render_path": "renders/lz/food/pie_apple4.png" + } + ] + }, + { + "item": "baked_potato", + "fallback_model": "minecraft:item/baked_potato", + "source_file": "assets/minecraft/items/baked_potato.json", + "render_path": null, + "cases": [ + { + "when": "baked", + "model": "lz:food/plated_baked_potato", + "render_path": "renders/lz/food/plated_baked_potato.png" + }, + { + "when": "baked1", + "model": "lz:food/plated_baked_potato1", + "render_path": "renders/lz/food/plated_baked_potato1.png" + }, + { + "when": "baked2", + "model": "lz:food/plated_baked_potato2", + "render_path": "renders/lz/food/plated_baked_potato2.png" + }, + { + "when": "baked3", + "model": "lz:food/plated_baked_potato3", + "render_path": "renders/lz/food/plated_baked_potato3.png" + } + ] + }, + { + "item": "beetroot_soup", + "fallback_model": "minecraft:item/beetroot_soup", + "source_file": "assets/minecraft/items/beetroot_soup.json", + "render_path": null, + "cases": [ + { + "when": "soup", + "model": "lz:food/soup_beetroot", + "render_path": "renders/lz/food/soup_beetroot.png" + } + ] + }, + { + "item": "bone", + "fallback_model": "minecraft:item/bone", + "source_file": "assets/minecraft/items/bone.json", + "render_path": null, + "cases": [ + { + "when": "broth", + "model": "lz:food/soup_bone_broth", + "render_path": "renders/lz/food/soup_bone_broth.png" + } + ] + }, + { + "item": "bread", + "fallback_model": "minecraft:item/bread", + "source_file": "assets/minecraft/items/bread.json", + "render_path": null, + "cases": [ + { + "when": "sandwich_chicken1", + "model": "lz:food/plated_sandwich_chicken1", + "render_path": "renders/lz/food/plated_sandwich_chicken1.png" + }, + { + "when": "sandwich_chicken2", + "model": "lz:food/plated_sandwich_chicken2", + "render_path": "renders/lz/food/plated_sandwich_chicken2.png" + }, + { + "when": "sandwich_egg1", + "model": "lz:food/plated_sandwich_egg1", + "render_path": "renders/lz/food/plated_sandwich_egg1.png" + }, + { + "when": "sandwich_egg2", + "model": "lz:food/plated_sandwich_egg2", + "render_path": "renders/lz/food/plated_sandwich_egg2.png" + }, + { + "when": "sandwich_glow_berry", + "model": "lz:food/plated_sandwich_glow_berry", + "render_path": "renders/lz/food/plated_sandwich_glow_berry.png" + }, + { + "when": "sandwich_glow_berry_dark", + "model": "lz:food/plated_sandwich_glow_berry_dark", + "render_path": "renders/lz/food/plated_sandwich_glow_berry_dark.png" + }, + { + "when": "sandwich_sweet_berry", + "model": "lz:food/plated_sandwich_sweet_berry", + "render_path": "renders/lz/food/plated_sandwich_sweet_berry.png" + }, + { + "when": "sandwich_sweet_berry_dark", + "model": "lz:food/plated_sandwich_sweet_berry_dark", + "render_path": "renders/lz/food/plated_sandwich_sweet_berry_dark.png" + } + ] + }, + { + "item": "cake", + "fallback_model": "minecraft:item/cake", + "source_file": "assets/minecraft/items/cake.json", + "render_path": null, + "cases": [ + { + "when": "slice", + "model": "lz:food/plated_cake_slice", + "render_path": "renders/lz/food/plated_cake_slice.png" + } + ] + }, + { + "item": "candle", + "fallback_model": "minecraft:item/candle", + "source_file": "assets/minecraft/items/candle.json", + "render_path": null, + "cases": [ + { + "when": "candelabra", + "model": "lz:items/candle_stand", + "render_path": "renders/lz/items/candle_stand.png" + } + ] + }, + { + "item": "carrot", + "fallback_model": "minecraft:item/carrot", + "source_file": "assets/minecraft/items/carrot.json", + "render_path": null, + "cases": [ + { + "when": "soup", + "model": "lz:food/soup_vegetable", + "render_path": "renders/lz/food/soup_vegetable.png" + } + ] + }, + { + "item": "cocoa_beans", + "fallback_model": "minecraft:item/cocoa_beans", + "source_file": "assets/minecraft/items/cocoa_beans.json", + "render_path": null, + "cases": [ + { + "when": "drink", + "model": "lz:food/drink_cocoa", + "render_path": "renders/lz/food/drink_cocoa.png" + }, + { + "when": "pie", + "model": "lz:food/pie_chocolate", + "render_path": "renders/lz/food/pie_chocolate.png" + }, + { + "when": "pie1", + "model": "lz:food/pie_chocolate1", + "render_path": "renders/lz/food/pie_chocolate1.png" + }, + { + "when": "pie2", + "model": "lz:food/pie_chocolate2", + "render_path": "renders/lz/food/pie_chocolate2.png" + }, + { + "when": "pie3", + "model": "lz:food/pie_chocolate3", + "render_path": "renders/lz/food/pie_chocolate3.png" + }, + { + "when": "pie4", + "model": "lz:food/pie_chocolate4", + "render_path": "renders/lz/food/pie_chocolate4.png" + } + ] + }, + { + "item": "cod", + "fallback_model": "minecraft:item/cod", + "source_file": "assets/minecraft/items/cod.json", + "render_path": null, + "cases": [ + { + "when": "roll", + "model": "lz:food/plated_cod_roll", + "render_path": "renders/lz/food/plated_cod_roll.png" + }, + { + "when": "roll1", + "model": "lz:food/plated_cod_roll_1", + "render_path": "renders/lz/food/plated_cod_roll_1.png" + }, + { + "when": "roll2", + "model": "lz:food/plated_cod_roll_2", + "render_path": "renders/lz/food/plated_cod_roll_2.png" + }, + { + "when": "roll3", + "model": "lz:food/plated_cod_roll_3", + "render_path": "renders/lz/food/plated_cod_roll_3.png" + }, + { + "when": "roll4", + "model": "lz:food/plated_cod_roll_4", + "render_path": "renders/lz/food/plated_cod_roll_4.png" + }, + { + "when": "roll5", + "model": "lz:food/plated_cod_roll_5", + "render_path": "renders/lz/food/plated_cod_roll_5.png" + }, + { + "when": "roll6", + "model": "lz:food/plated_cod_roll_6", + "render_path": "renders/lz/food/plated_cod_roll_6.png" + }, + { + "when": "stew", + "model": "lz:food/stew_baked_cod", + "render_path": "renders/lz/food/stew_baked_cod.png" + } + ] + }, + { + "item": "cooked_beef", + "fallback_model": "minecraft:item/cooked_beef", + "source_file": "assets/minecraft/items/cooked_beef.json", + "render_path": null, + "cases": [ + { + "when": "stew", + "model": "lz:food/stew_beef", + "render_path": "renders/lz/food/stew_beef.png" + } + ] + }, + { + "item": "cooked_chicken", + "fallback_model": "minecraft:item/cooked_chicken", + "source_file": "assets/minecraft/items/cooked_chicken.json", + "render_path": null, + "cases": [ + { + "when": "roast", + "model": "lz:food/plated_roast_chicken", + "render_path": "renders/lz/food/plated_roast_chicken.png" + }, + { + "when": "roast0", + "model": "lz:food/plated_roast_chicken0", + "render_path": "renders/lz/food/plated_roast_chicken0.png" + }, + { + "when": "roast1", + "model": "lz:food/plated_roast_chicken1", + "render_path": "renders/lz/food/plated_roast_chicken1.png" + }, + { + "when": "roast2", + "model": "lz:food/plated_roast_chicken2", + "render_path": "renders/lz/food/plated_roast_chicken2.png" + }, + { + "when": "roast3", + "model": "lz:food/plated_roast_chicken3", + "render_path": "renders/lz/food/plated_roast_chicken3.png" + }, + { + "when": "roast4", + "model": "lz:food/plated_roast_chicken4", + "render_path": "renders/lz/food/plated_roast_chicken4.png" + }, + { + "when": "soup", + "model": "lz:food/soup_chicken", + "render_path": "renders/lz/food/soup_chicken.png" + } + ] + }, + { + "item": "cooked_cod", + "fallback_model": "minecraft:item/cooked_cod", + "source_file": "assets/minecraft/items/cooked_cod.json", + "render_path": null, + "cases": [ + { + "when": "stew", + "model": "lz:food/stew_baked_cod", + "render_path": "renders/lz/food/stew_baked_cod.png" + }, + { + "when": "stew_fish", + "model": "lz:food/stew_fish", + "render_path": "renders/lz/food/stew_fish.png" + } + ] + }, + { + "item": "cooked_porkchop", + "fallback_model": "minecraft:item/cooked_porkchop", + "source_file": "assets/minecraft/items/cooked_porkchop.json", + "render_path": null, + "cases": [ + { + "when": "ham", + "model": "lz:food/plated_honey_glazed_ham", + "render_path": "renders/lz/food/plated_honey_glazed_ham.png" + }, + { + "when": "ham0", + "model": "lz:food/plated_honey_glazed_ham0", + "render_path": "renders/lz/food/plated_honey_glazed_ham0.png" + }, + { + "when": "ham1", + "model": "lz:food/plated_honey_glazed_ham1", + "render_path": "renders/lz/food/plated_honey_glazed_ham1.png" + }, + { + "when": "ham2", + "model": "lz:food/plated_honey_glazed_ham2", + "render_path": "renders/lz/food/plated_honey_glazed_ham2.png" + }, + { + "when": "ham3", + "model": "lz:food/plated_honey_glazed_ham3", + "render_path": "renders/lz/food/plated_honey_glazed_ham3.png" + }, + { + "when": "ham4", + "model": "lz:food/plated_honey_glazed_ham4", + "render_path": "renders/lz/food/plated_honey_glazed_ham4.png" + } + ] + }, + { + "item": "cooked_rabbit", + "fallback_model": "minecraft:item/cooked_rabbit", + "source_file": "assets/minecraft/items/cooked_rabbit.json", + "render_path": null, + "cases": [ + { + "when": "stew", + "model": "lz:food/stew_rabbit", + "render_path": "renders/lz/food/stew_rabbit.png" + } + ] + }, + { + "item": "cookie", + "fallback_model": "minecraft:item/cookie", + "source_file": "assets/minecraft/items/cookie.json", + "render_path": null, + "cases": [ + { + "when": "chocolate", + "model": "lz:food/plated_cookie_chocolate", + "render_path": "renders/lz/food/plated_cookie_chocolate.png" + }, + { + "when": "chocolate1", + "model": "lz:food/plated_cookie_chocolate1", + "render_path": "renders/lz/food/plated_cookie_chocolate1.png" + }, + { + "when": "chocolate2", + "model": "lz:food/plated_cookie_chocolate2", + "render_path": "renders/lz/food/plated_cookie_chocolate2.png" + }, + { + "when": "chocolate3", + "model": "lz:food/plated_cookie_chocolate3", + "render_path": "renders/lz/food/plated_cookie_chocolate3.png" + }, + { + "when": "chocolate4", + "model": "lz:food/plated_cookie_chocolate4", + "render_path": "renders/lz/food/plated_cookie_chocolate4.png" + }, + { + "when": "cookie", + "model": "lz:food/plated_cookie", + "render_path": "renders/lz/food/plated_cookie.png" + }, + { + "when": "cookie1", + "model": "lz:food/plated_cookie1", + "render_path": "renders/lz/food/plated_cookie1.png" + }, + { + "when": "cookie2", + "model": "lz:food/plated_cookie2", + "render_path": "renders/lz/food/plated_cookie2.png" + }, + { + "when": "cookie3", + "model": "lz:food/plated_cookie3", + "render_path": "renders/lz/food/plated_cookie3.png" + }, + { + "when": "cookie4", + "model": "lz:food/plated_cookie4", + "render_path": "renders/lz/food/plated_cookie4.png" + }, + { + "when": "honey", + "model": "lz:food/plated_cookie_honey", + "render_path": "renders/lz/food/plated_cookie_honey.png" + }, + { + "when": "honey1", + "model": "lz:food/plated_cookie_honey1", + "render_path": "renders/lz/food/plated_cookie_honey1.png" + }, + { + "when": "honey2", + "model": "lz:food/plated_cookie_honey2", + "render_path": "renders/lz/food/plated_cookie_honey2.png" + }, + { + "when": "honey3", + "model": "lz:food/plated_cookie_honey3", + "render_path": "renders/lz/food/plated_cookie_honey3.png" + }, + { + "when": "honey4", + "model": "lz:food/plated_cookie_honey4", + "render_path": "renders/lz/food/plated_cookie_honey4.png" + }, + { + "when": "sugar", + "model": "lz:food/plated_cookie_sugar", + "render_path": "renders/lz/food/plated_cookie_sugar.png" + }, + { + "when": "sugar1", + "model": "lz:food/plated_cookie_sugar1", + "render_path": "renders/lz/food/plated_cookie_sugar1.png" + }, + { + "when": "sugar2", + "model": "lz:food/plated_cookie_sugar2", + "render_path": "renders/lz/food/plated_cookie_sugar2.png" + }, + { + "when": "sugar3", + "model": "lz:food/plated_cookie_sugar3", + "render_path": "renders/lz/food/plated_cookie_sugar3.png" + }, + { + "when": "sugar4", + "model": "lz:food/plated_cookie_sugar4", + "render_path": "renders/lz/food/plated_cookie_sugar4.png" + }, + { + "when": "sweet_berry", + "model": "lz:food/plated_cookie_sweet_berry", + "render_path": "renders/lz/food/plated_cookie_sweet_berry.png" + }, + { + "when": "sweet_berry1", + "model": "lz:food/plated_cookie_sweet_berry1", + "render_path": "renders/lz/food/plated_cookie_sweet_berry1.png" + }, + { + "when": "sweet_berry2", + "model": "lz:food/plated_cookie_sweet_berry2", + "render_path": "renders/lz/food/plated_cookie_sweet_berry2.png" + }, + { + "when": "sweet_berry3", + "model": "lz:food/plated_cookie_sweet_berry3", + "render_path": "renders/lz/food/plated_cookie_sweet_berry3.png" + }, + { + "when": "sweet_berry4", + "model": "lz:food/plated_cookie_sweet_berry4", + "render_path": "renders/lz/food/plated_cookie_sweet_berry4.png" + } + ] + }, + { + "item": "dried_kelp", + "fallback_model": "minecraft:item/dried_kelp", + "source_file": "assets/minecraft/items/dried_kelp.json", + "render_path": null, + "cases": [ + { + "when": "roll", + "model": "lz:food/plated_kelp_roll", + "render_path": "renders/lz/food/plated_kelp_roll.png" + }, + { + "when": "roll1", + "model": "lz:food/plated_kelp_roll_1", + "render_path": "renders/lz/food/plated_kelp_roll_1.png" + }, + { + "when": "roll2", + "model": "lz:food/plated_kelp_roll_2", + "render_path": "renders/lz/food/plated_kelp_roll_2.png" + }, + { + "when": "roll3", + "model": "lz:food/plated_kelp_roll_3", + "render_path": "renders/lz/food/plated_kelp_roll_3.png" + } + ] + }, + { + "item": "glass_bottle", + "fallback_model": "minecraft:item/glass_bottle", + "source_file": "assets/minecraft/items/glass_bottle.json", + "render_path": null, + "cases": [ + { + "when": "drink", + "model": "lz:food/glass_bottle", + "render_path": "renders/lz/food/glass_bottle.png" + }, + { + "when": "drink_water", + "model": "lz:food/drink_water", + "render_path": "renders/lz/food/drink_water.png" + }, + { + "when": "mug_chocolate", + "model": "lz:festive/hot_chocolate_mug", + "render_path": "renders/lz/festive/hot_chocolate_mug.png" + } + ] + }, + { + "item": "glow_berries", + "fallback_model": "minecraft:item/glow_berries", + "source_file": "assets/minecraft/items/glow_berries.json", + "render_path": null, + "cases": [ + { + "when": "drink", + "model": "lz:food/drink_glow_berry", + "render_path": "renders/lz/food/drink_glow_berry.png" + }, + { + "when": "roll", + "model": "lz:food/plated_glow_berry_sweet_roll", + "render_path": "renders/lz/food/plated_glow_berry_sweet_roll.png" + }, + { + "when": "roll1", + "model": "lz:food/plated_glow_berry_sweet_roll1", + "render_path": "renders/lz/food/plated_glow_berry_sweet_roll1.png" + }, + { + "when": "roll2", + "model": "lz:food/plated_glow_berry_sweet_roll2", + "render_path": "renders/lz/food/plated_glow_berry_sweet_roll2.png" + }, + { + "when": "roll3", + "model": "lz:food/plated_glow_berry_sweet_roll3", + "render_path": "renders/lz/food/plated_glow_berry_sweet_roll3.png" + }, + { + "when": "roll4", + "model": "lz:food/plated_glow_berry_sweet_roll4", + "render_path": "renders/lz/food/plated_glow_berry_sweet_roll4.png" + } + ] + }, + { + "item": "melon_slice", + "fallback_model": "minecraft:item/melon_slice", + "source_file": "assets/minecraft/items/melon_slice.json", + "render_path": null, + "cases": [ + { + "when": "drink", + "model": "lz:food/drink_melon_juice", + "render_path": "renders/lz/food/drink_melon_juice.png" + }, + { + "when": "popsicle1", + "model": "lz:food/plated_melon_popsicle1", + "render_path": "renders/lz/food/plated_melon_popsicle1.png" + }, + { + "when": "popsicle2", + "model": "lz:food/plated_melon_popsicle2", + "render_path": "renders/lz/food/plated_melon_popsicle2.png" + } + ] + }, + { + "item": "mushroom_stew", + "fallback_model": "minecraft:item/mushroom_stew", + "source_file": "assets/minecraft/items/mushroom_stew.json", + "render_path": null, + "cases": [ + { + "when": "stew", + "model": "lz:food/stew_mushroom", + "render_path": "renders/lz/food/stew_mushroom.png" + } + ] + }, + { + "item": "oak_sapling", + "fallback_model": "minecraft:item/oak_sapling", + "source_file": "assets/minecraft/items/oak_sapling.json", + "render_path": null, + "cases": [ + { + "when": "christmas", + "model": "lz:festive/christmas_tree", + "render_path": "renders/lz/festive/christmas_tree.png" + } + ] + }, + { + "item": "paper", + "fallback_model": "minecraft:item/paper", + "source_file": "assets/minecraft/items/paper.json", + "render_path": null, + "cases": [ + { + "when": "card_back", + "model": "cards:item/back", + "render_path": "renders/cards/item/back.png" + }, + { + "when": "card_base", + "model": "cards:item/base", + "render_path": "renders/cards/item/base.png" + }, + { + "when": "card_c01", + "model": "cards:item/c_01", + "render_path": "renders/cards/item/c_01.png" + }, + { + "when": "card_c02", + "model": "cards:item/c_02", + "render_path": "renders/cards/item/c_02.png" + }, + { + "when": "card_c03", + "model": "cards:item/c_03", + "render_path": "renders/cards/item/c_03.png" + }, + { + "when": "card_c04", + "model": "cards:item/c_04", + "render_path": "renders/cards/item/c_04.png" + }, + { + "when": "card_c05", + "model": "cards:item/c_05", + "render_path": "renders/cards/item/c_05.png" + }, + { + "when": "card_c06", + "model": "cards:item/c_06", + "render_path": "renders/cards/item/c_06.png" + }, + { + "when": "card_c07", + "model": "cards:item/c_07", + "render_path": "renders/cards/item/c_07.png" + }, + { + "when": "card_c08", + "model": "cards:item/c_08", + "render_path": "renders/cards/item/c_08.png" + }, + { + "when": "card_c09", + "model": "cards:item/c_09", + "render_path": "renders/cards/item/c_09.png" + }, + { + "when": "card_c10", + "model": "cards:item/c_10", + "render_path": "renders/cards/item/c_10.png" + }, + { + "when": "card_c11", + "model": "cards:item/c_11", + "render_path": "renders/cards/item/c_11.png" + }, + { + "when": "card_c12", + "model": "cards:item/c_12", + "render_path": "renders/cards/item/c_12.png" + }, + { + "when": "card_c13", + "model": "cards:item/c_13", + "render_path": "renders/cards/item/c_13.png" + }, + { + "when": "card_custom_back", + "model": "cards:item/custom/back", + "render_path": "renders/cards/item/custom/back.png" + }, + { + "when": "card_custom_base", + "model": "cards:item/base", + "render_path": "renders/cards/item/base.png" + }, + { + "when": "card_custom_c01", + "model": "cards:item/custom/c_01", + "render_path": "renders/cards/item/custom/c_01.png" + }, + { + "when": "card_custom_c02", + "model": "cards:item/custom/c_02", + "render_path": "renders/cards/item/custom/c_02.png" + }, + { + "when": "card_custom_c03", + "model": "cards:item/custom/c_03", + "render_path": "renders/cards/item/custom/c_03.png" + }, + { + "when": "card_custom_c04", + "model": "cards:item/custom/c_04", + "render_path": "renders/cards/item/custom/c_04.png" + }, + { + "when": "card_custom_c05", + "model": "cards:item/custom/c_05", + "render_path": "renders/cards/item/custom/c_05.png" + }, + { + "when": "card_custom_c06", + "model": "cards:item/custom/c_06", + "render_path": "renders/cards/item/custom/c_06.png" + }, + { + "when": "card_custom_c07", + "model": "cards:item/custom/c_07", + "render_path": "renders/cards/item/custom/c_07.png" + }, + { + "when": "card_custom_c08", + "model": "cards:item/custom/c_08", + "render_path": "renders/cards/item/custom/c_08.png" + }, + { + "when": "card_custom_c09", + "model": "cards:item/custom/c_09", + "render_path": "renders/cards/item/custom/c_09.png" + }, + { + "when": "card_custom_c10", + "model": "cards:item/custom/c_10", + "render_path": "renders/cards/item/custom/c_10.png" + }, + { + "when": "card_custom_c11", + "model": "cards:item/custom/c_11", + "render_path": "renders/cards/item/custom/c_11.png" + }, + { + "when": "card_custom_c12", + "model": "cards:item/custom/c_12", + "render_path": "renders/cards/item/custom/c_12.png" + }, + { + "when": "card_custom_c13", + "model": "cards:item/custom/c_13", + "render_path": "renders/cards/item/custom/c_13.png" + }, + { + "when": "card_custom_d01", + "model": "cards:item/custom/d_01", + "render_path": "renders/cards/item/custom/d_01.png" + }, + { + "when": "card_custom_d02", + "model": "cards:item/custom/d_02", + "render_path": "renders/cards/item/custom/d_02.png" + }, + { + "when": "card_custom_d03", + "model": "cards:item/custom/d_03", + "render_path": "renders/cards/item/custom/d_03.png" + }, + { + "when": "card_custom_d04", + "model": "cards:item/custom/d_04", + "render_path": "renders/cards/item/custom/d_04.png" + }, + { + "when": "card_custom_d05", + "model": "cards:item/custom/d_05", + "render_path": "renders/cards/item/custom/d_05.png" + }, + { + "when": "card_custom_d06", + "model": "cards:item/custom/d_06", + "render_path": "renders/cards/item/custom/d_06.png" + }, + { + "when": "card_custom_d07", + "model": "cards:item/custom/d_07", + "render_path": "renders/cards/item/custom/d_07.png" + }, + { + "when": "card_custom_d08", + "model": "cards:item/custom/d_08", + "render_path": "renders/cards/item/custom/d_08.png" + }, + { + "when": "card_custom_d09", + "model": "cards:item/custom/d_09", + "render_path": "renders/cards/item/custom/d_09.png" + }, + { + "when": "card_custom_d10", + "model": "cards:item/custom/d_10", + "render_path": "renders/cards/item/custom/d_10.png" + }, + { + "when": "card_custom_d11", + "model": "cards:item/custom/d_11", + "render_path": "renders/cards/item/custom/d_11.png" + }, + { + "when": "card_custom_d12", + "model": "cards:item/custom/d_12", + "render_path": "renders/cards/item/custom/d_12.png" + }, + { + "when": "card_custom_d13", + "model": "cards:item/custom/d_13", + "render_path": "renders/cards/item/custom/d_13.png" + }, + { + "when": "card_custom_h01", + "model": "cards:item/custom/h_01", + "render_path": "renders/cards/item/custom/h_01.png" + }, + { + "when": "card_custom_h02", + "model": "cards:item/custom/h_02", + "render_path": "renders/cards/item/custom/h_02.png" + }, + { + "when": "card_custom_h03", + "model": "cards:item/custom/h_03", + "render_path": "renders/cards/item/custom/h_03.png" + }, + { + "when": "card_custom_h04", + "model": "cards:item/custom/h_04", + "render_path": "renders/cards/item/custom/h_04.png" + }, + { + "when": "card_custom_h05", + "model": "cards:item/custom/h_05", + "render_path": "renders/cards/item/custom/h_05.png" + }, + { + "when": "card_custom_h06", + "model": "cards:item/custom/h_06", + "render_path": "renders/cards/item/custom/h_06.png" + }, + { + "when": "card_custom_h07", + "model": "cards:item/custom/h_07", + "render_path": "renders/cards/item/custom/h_07.png" + }, + { + "when": "card_custom_h08", + "model": "cards:item/custom/h_08", + "render_path": "renders/cards/item/custom/h_08.png" + }, + { + "when": "card_custom_h09", + "model": "cards:item/custom/h_09", + "render_path": "renders/cards/item/custom/h_09.png" + }, + { + "when": "card_custom_h10", + "model": "cards:item/custom/h_10", + "render_path": "renders/cards/item/custom/h_10.png" + }, + { + "when": "card_custom_h11", + "model": "cards:item/custom/h_11", + "render_path": "renders/cards/item/custom/h_11.png" + }, + { + "when": "card_custom_h12", + "model": "cards:item/custom/h_12", + "render_path": "renders/cards/item/custom/h_12.png" + }, + { + "when": "card_custom_h13", + "model": "cards:item/custom/h_13", + "render_path": "renders/cards/item/custom/h_13.png" + }, + { + "when": "card_custom_jb", + "model": "cards:item/custom/joker_black", + "render_path": "renders/cards/item/custom/joker_black.png" + }, + { + "when": "card_custom_jr", + "model": "cards:item/custom/joker_red", + "render_path": "renders/cards/item/custom/joker_red.png" + }, + { + "when": "card_custom_s01", + "model": "cards:item/custom/s_01", + "render_path": "renders/cards/item/custom/s_01.png" + }, + { + "when": "card_custom_s02", + "model": "cards:item/custom/s_02", + "render_path": "renders/cards/item/custom/s_02.png" + }, + { + "when": "card_custom_s03", + "model": "cards:item/custom/s_03", + "render_path": "renders/cards/item/custom/s_03.png" + }, + { + "when": "card_custom_s04", + "model": "cards:item/custom/s_04", + "render_path": "renders/cards/item/custom/s_04.png" + }, + { + "when": "card_custom_s05", + "model": "cards:item/custom/s_05", + "render_path": "renders/cards/item/custom/s_05.png" + }, + { + "when": "card_custom_s06", + "model": "cards:item/custom/s_06", + "render_path": "renders/cards/item/custom/s_06.png" + }, + { + "when": "card_custom_s07", + "model": "cards:item/custom/s_07", + "render_path": "renders/cards/item/custom/s_07.png" + }, + { + "when": "card_custom_s08", + "model": "cards:item/custom/s_08", + "render_path": "renders/cards/item/custom/s_08.png" + }, + { + "when": "card_custom_s09", + "model": "cards:item/custom/s_09", + "render_path": "renders/cards/item/custom/s_09.png" + }, + { + "when": "card_custom_s10", + "model": "cards:item/custom/s_10", + "render_path": "renders/cards/item/custom/s_10.png" + }, + { + "when": "card_custom_s11", + "model": "cards:item/custom/s_11", + "render_path": "renders/cards/item/custom/s_11.png" + }, + { + "when": "card_custom_s12", + "model": "cards:item/custom/s_12", + "render_path": "renders/cards/item/custom/s_12.png" + }, + { + "when": "card_custom_s13", + "model": "cards:item/custom/s_13", + "render_path": "renders/cards/item/custom/s_13.png" + }, + { + "when": "card_d01", + "model": "cards:item/d_01", + "render_path": "renders/cards/item/d_01.png" + }, + { + "when": "card_d02", + "model": "cards:item/d_02", + "render_path": "renders/cards/item/d_02.png" + }, + { + "when": "card_d03", + "model": "cards:item/d_03", + "render_path": "renders/cards/item/d_03.png" + }, + { + "when": "card_d04", + "model": "cards:item/d_04", + "render_path": "renders/cards/item/d_04.png" + }, + { + "when": "card_d05", + "model": "cards:item/d_05", + "render_path": "renders/cards/item/d_05.png" + }, + { + "when": "card_d06", + "model": "cards:item/d_06", + "render_path": "renders/cards/item/d_06.png" + }, + { + "when": "card_d07", + "model": "cards:item/d_07", + "render_path": "renders/cards/item/d_07.png" + }, + { + "when": "card_d08", + "model": "cards:item/d_08", + "render_path": "renders/cards/item/d_08.png" + }, + { + "when": "card_d09", + "model": "cards:item/d_09", + "render_path": "renders/cards/item/d_09.png" + }, + { + "when": "card_d10", + "model": "cards:item/d_10", + "render_path": "renders/cards/item/d_10.png" + }, + { + "when": "card_d11", + "model": "cards:item/d_11", + "render_path": "renders/cards/item/d_11.png" + }, + { + "when": "card_d12", + "model": "cards:item/d_12", + "render_path": "renders/cards/item/d_12.png" + }, + { + "when": "card_d13", + "model": "cards:item/d_13", + "render_path": "renders/cards/item/d_13.png" + }, + { + "when": "card_h01", + "model": "cards:item/h_01", + "render_path": "renders/cards/item/h_01.png" + }, + { + "when": "card_h02", + "model": "cards:item/h_02", + "render_path": "renders/cards/item/h_02.png" + }, + { + "when": "card_h03", + "model": "cards:item/h_03", + "render_path": "renders/cards/item/h_03.png" + }, + { + "when": "card_h04", + "model": "cards:item/h_04", + "render_path": "renders/cards/item/h_04.png" + }, + { + "when": "card_h05", + "model": "cards:item/h_05", + "render_path": "renders/cards/item/h_05.png" + }, + { + "when": "card_h06", + "model": "cards:item/h_06", + "render_path": "renders/cards/item/h_06.png" + }, + { + "when": "card_h07", + "model": "cards:item/h_07", + "render_path": "renders/cards/item/h_07.png" + }, + { + "when": "card_h08", + "model": "cards:item/h_08", + "render_path": "renders/cards/item/h_08.png" + }, + { + "when": "card_h09", + "model": "cards:item/h_09", + "render_path": "renders/cards/item/h_09.png" + }, + { + "when": "card_h10", + "model": "cards:item/h_10", + "render_path": "renders/cards/item/h_10.png" + }, + { + "when": "card_h11", + "model": "cards:item/h_11", + "render_path": "renders/cards/item/h_11.png" + }, + { + "when": "card_h12", + "model": "cards:item/h_12", + "render_path": "renders/cards/item/h_12.png" + }, + { + "when": "card_h13", + "model": "cards:item/h_13", + "render_path": "renders/cards/item/h_13.png" + }, + { + "when": "card_jb", + "model": "cards:item/joker_black", + "render_path": "renders/cards/item/joker_black.png" + }, + { + "when": "card_jr", + "model": "cards:item/joker_red", + "render_path": "renders/cards/item/joker_red.png" + }, + { + "when": "card_s01", + "model": "cards:item/s_01", + "render_path": "renders/cards/item/s_01.png" + }, + { + "when": "card_s02", + "model": "cards:item/s_02", + "render_path": "renders/cards/item/s_02.png" + }, + { + "when": "card_s03", + "model": "cards:item/s_03", + "render_path": "renders/cards/item/s_03.png" + }, + { + "when": "card_s04", + "model": "cards:item/s_04", + "render_path": "renders/cards/item/s_04.png" + }, + { + "when": "card_s05", + "model": "cards:item/s_05", + "render_path": "renders/cards/item/s_05.png" + }, + { + "when": "card_s06", + "model": "cards:item/s_06", + "render_path": "renders/cards/item/s_06.png" + }, + { + "when": "card_s07", + "model": "cards:item/s_07", + "render_path": "renders/cards/item/s_07.png" + }, + { + "when": "card_s08", + "model": "cards:item/s_08", + "render_path": "renders/cards/item/s_08.png" + }, + { + "when": "card_s09", + "model": "cards:item/s_09", + "render_path": "renders/cards/item/s_09.png" + }, + { + "when": "card_s10", + "model": "cards:item/s_10", + "render_path": "renders/cards/item/s_10.png" + }, + { + "when": "card_s11", + "model": "cards:item/s_11", + "render_path": "renders/cards/item/s_11.png" + }, + { + "when": "card_s12", + "model": "cards:item/s_12", + "render_path": "renders/cards/item/s_12.png" + }, + { + "when": "card_s13", + "model": "cards:item/s_13", + "render_path": "renders/cards/item/s_13.png" + }, + { + "when": "presents", + "model": "lz:festive/presents", + "render_path": "renders/lz/festive/presents.png" + } + ] + }, + { + "item": "pumpkin_pie", + "fallback_model": "minecraft:item/pumpkin_pie", + "source_file": "assets/minecraft/items/pumpkin_pie.json", + "render_path": null, + "cases": [ + { + "when": "pie", + "model": "lz:food/pie_pumpkin", + "render_path": "renders/lz/food/pie_pumpkin.png" + }, + { + "when": "pie1", + "model": "lz:food/pie_pumpkin1", + "render_path": "renders/lz/food/pie_pumpkin1.png" + }, + { + "when": "pie2", + "model": "lz:food/pie_pumpkin2", + "render_path": "renders/lz/food/pie_pumpkin2.png" + }, + { + "when": "pie3", + "model": "lz:food/pie_pumpkin3", + "render_path": "renders/lz/food/pie_pumpkin3.png" + }, + { + "when": "pie4", + "model": "lz:food/pie_pumpkin4", + "render_path": "renders/lz/food/pie_pumpkin4.png" + }, + { + "when": "soup", + "model": "lz:food/soup_pumpkin", + "render_path": "renders/lz/food/soup_pumpkin.png" + } + ] + }, + { + "item": "salmon", + "fallback_model": "minecraft:item/salmon", + "source_file": "assets/minecraft/items/salmon.json", + "render_path": null, + "cases": [ + { + "when": "roll", + "model": "lz:food/plated_salmon_roll", + "render_path": "renders/lz/food/plated_salmon_roll.png" + }, + { + "when": "roll1", + "model": "lz:food/plated_salmon_roll_1", + "render_path": "renders/lz/food/plated_salmon_roll_1.png" + }, + { + "when": "roll2", + "model": "lz:food/plated_salmon_roll_2", + "render_path": "renders/lz/food/plated_salmon_roll_2.png" + }, + { + "when": "roll3", + "model": "lz:food/plated_salmon_roll_3", + "render_path": "renders/lz/food/plated_salmon_roll_3.png" + }, + { + "when": "roll4", + "model": "lz:food/plated_salmon_roll_4", + "render_path": "renders/lz/food/plated_salmon_roll_4.png" + }, + { + "when": "roll5", + "model": "lz:food/plated_salmon_roll_5", + "render_path": "renders/lz/food/plated_salmon_roll_5.png" + }, + { + "when": "roll6", + "model": "lz:food/plated_salmon_roll_6", + "render_path": "renders/lz/food/plated_salmon_roll_6.png" + } + ] + }, + { + "item": "sweet_berries", + "fallback_model": "minecraft:item/sweet_berries", + "source_file": "assets/minecraft/items/sweet_berries.json", + "render_path": null, + "cases": [ + { + "when": "drink", + "model": "lz:food/drink_sweet_berry", + "render_path": "renders/lz/food/drink_sweet_berry.png" + }, + { + "when": "pie", + "model": "lz:food/pie_sweet_berry", + "render_path": "renders/lz/food/pie_sweet_berry.png" + }, + { + "when": "pie1", + "model": "lz:food/pie_sweet_berry1", + "render_path": "renders/lz/food/pie_sweet_berry1.png" + }, + { + "when": "pie2", + "model": "lz:food/pie_sweet_berry2", + "render_path": "renders/lz/food/pie_sweet_berry2.png" + }, + { + "when": "pie3", + "model": "lz:food/pie_sweet_berry3", + "render_path": "renders/lz/food/pie_sweet_berry3.png" + }, + { + "when": "pie4", + "model": "lz:food/pie_sweet_berry4", + "render_path": "renders/lz/food/pie_sweet_berry4.png" + } + ] + } +] \ No newline at end of file diff --git a/build/renameable-items.md b/build/renameable-items.md new file mode 100644 index 0000000..247c3e7 --- /dev/null +++ b/build/renameable-items.md @@ -0,0 +1,706 @@ +# Renameable Item Catalog + +Generated from the resource pack item model JSON. + +## Summary + +- Base items: 26 +- Rename variants: 229 +- Render mode: pluggable + +Sections are sorted by the item they are generated from. +## apple + +- Generated from: `assets/minecraft/items/apple.json` +- Fallback model: `minecraft:item/apple` +- Base render: not present yet + +### Rename variants + +- `cider` -> `lz:food/drink_apple_cider` + - Preview: cider +- `pie` -> `lz:food/pie_apple` + - Preview: pie +- `pie1` -> `lz:food/pie_apple1` + - Preview: pie1 +- `pie2` -> `lz:food/pie_apple2` + - Preview: pie2 +- `pie3` -> `lz:food/pie_apple3` + - Preview: pie3 +- `pie4` -> `lz:food/pie_apple4` + - Preview: pie4 + +## baked_potato + +- Generated from: `assets/minecraft/items/baked_potato.json` +- Fallback model: `minecraft:item/baked_potato` +- Base render: not present yet + +### Rename variants + +- `baked` -> `lz:food/plated_baked_potato` + - Preview: baked +- `baked1` -> `lz:food/plated_baked_potato1` + - Preview: baked1 +- `baked2` -> `lz:food/plated_baked_potato2` + - Preview: baked2 +- `baked3` -> `lz:food/plated_baked_potato3` + - Preview: baked3 + +## beetroot_soup + +- Generated from: `assets/minecraft/items/beetroot_soup.json` +- Fallback model: `minecraft:item/beetroot_soup` +- Base render: not present yet + +### Rename variants + +- `soup` -> `lz:food/soup_beetroot` + - Preview: soup + +## bone + +- Generated from: `assets/minecraft/items/bone.json` +- Fallback model: `minecraft:item/bone` +- Base render: not present yet + +### Rename variants + +- `broth` -> `lz:food/soup_bone_broth` + - Preview: broth + +## bread + +- Generated from: `assets/minecraft/items/bread.json` +- Fallback model: `minecraft:item/bread` +- Base render: not present yet + +### Rename variants + +- `sandwich_chicken1` -> `lz:food/plated_sandwich_chicken1` + - Preview: sandwich_chicken1 +- `sandwich_chicken2` -> `lz:food/plated_sandwich_chicken2` + - Preview: sandwich_chicken2 +- `sandwich_egg1` -> `lz:food/plated_sandwich_egg1` + - Preview: sandwich_egg1 +- `sandwich_egg2` -> `lz:food/plated_sandwich_egg2` + - Preview: sandwich_egg2 +- `sandwich_glow_berry` -> `lz:food/plated_sandwich_glow_berry` + - Preview: sandwich_glow_berry +- `sandwich_glow_berry_dark` -> `lz:food/plated_sandwich_glow_berry_dark` + - Preview: sandwich_glow_berry_dark +- `sandwich_sweet_berry` -> `lz:food/plated_sandwich_sweet_berry` + - Preview: sandwich_sweet_berry +- `sandwich_sweet_berry_dark` -> `lz:food/plated_sandwich_sweet_berry_dark` + - Preview: sandwich_sweet_berry_dark + +## cake + +- Generated from: `assets/minecraft/items/cake.json` +- Fallback model: `minecraft:item/cake` +- Base render: not present yet + +### Rename variants + +- `slice` -> `lz:food/plated_cake_slice` + - Preview: slice + +## candle + +- Generated from: `assets/minecraft/items/candle.json` +- Fallback model: `minecraft:item/candle` +- Base render: not present yet + +### Rename variants + +- `candelabra` -> `lz:items/candle_stand` + - Preview: candelabra + +## carrot + +- Generated from: `assets/minecraft/items/carrot.json` +- Fallback model: `minecraft:item/carrot` +- Base render: not present yet + +### Rename variants + +- `soup` -> `lz:food/soup_vegetable` + - Preview: soup + +## cocoa_beans + +- Generated from: `assets/minecraft/items/cocoa_beans.json` +- Fallback model: `minecraft:item/cocoa_beans` +- Base render: not present yet + +### Rename variants + +- `drink` -> `lz:food/drink_cocoa` + - Preview: drink +- `pie` -> `lz:food/pie_chocolate` + - Preview: pie +- `pie1` -> `lz:food/pie_chocolate1` + - Preview: pie1 +- `pie2` -> `lz:food/pie_chocolate2` + - Preview: pie2 +- `pie3` -> `lz:food/pie_chocolate3` + - Preview: pie3 +- `pie4` -> `lz:food/pie_chocolate4` + - Preview: pie4 + +## cod + +- Generated from: `assets/minecraft/items/cod.json` +- Fallback model: `minecraft:item/cod` +- Base render: not present yet + +### Rename variants + +- `roll` -> `lz:food/plated_cod_roll` + - Preview: roll +- `roll1` -> `lz:food/plated_cod_roll_1` + - Preview: roll1 +- `roll2` -> `lz:food/plated_cod_roll_2` + - Preview: roll2 +- `roll3` -> `lz:food/plated_cod_roll_3` + - Preview: roll3 +- `roll4` -> `lz:food/plated_cod_roll_4` + - Preview: roll4 +- `roll5` -> `lz:food/plated_cod_roll_5` + - Preview: roll5 +- `roll6` -> `lz:food/plated_cod_roll_6` + - Preview: roll6 +- `stew` -> `lz:food/stew_baked_cod` + - Preview: stew + +## cooked_beef + +- Generated from: `assets/minecraft/items/cooked_beef.json` +- Fallback model: `minecraft:item/cooked_beef` +- Base render: not present yet + +### Rename variants + +- `stew` -> `lz:food/stew_beef` + - Preview: stew + +## cooked_chicken + +- Generated from: `assets/minecraft/items/cooked_chicken.json` +- Fallback model: `minecraft:item/cooked_chicken` +- Base render: not present yet + +### Rename variants + +- `roast` -> `lz:food/plated_roast_chicken` + - Preview: roast +- `roast0` -> `lz:food/plated_roast_chicken0` + - Preview: roast0 +- `roast1` -> `lz:food/plated_roast_chicken1` + - Preview: roast1 +- `roast2` -> `lz:food/plated_roast_chicken2` + - Preview: roast2 +- `roast3` -> `lz:food/plated_roast_chicken3` + - Preview: roast3 +- `roast4` -> `lz:food/plated_roast_chicken4` + - Preview: roast4 +- `soup` -> `lz:food/soup_chicken` + - Preview: soup + +## cooked_cod + +- Generated from: `assets/minecraft/items/cooked_cod.json` +- Fallback model: `minecraft:item/cooked_cod` +- Base render: not present yet + +### Rename variants + +- `stew` -> `lz:food/stew_baked_cod` + - Preview: stew +- `stew_fish` -> `lz:food/stew_fish` + - Preview: stew_fish + +## cooked_porkchop + +- Generated from: `assets/minecraft/items/cooked_porkchop.json` +- Fallback model: `minecraft:item/cooked_porkchop` +- Base render: not present yet + +### Rename variants + +- `ham` -> `lz:food/plated_honey_glazed_ham` + - Preview: ham +- `ham0` -> `lz:food/plated_honey_glazed_ham0` + - Preview: ham0 +- `ham1` -> `lz:food/plated_honey_glazed_ham1` + - Preview: ham1 +- `ham2` -> `lz:food/plated_honey_glazed_ham2` + - Preview: ham2 +- `ham3` -> `lz:food/plated_honey_glazed_ham3` + - Preview: ham3 +- `ham4` -> `lz:food/plated_honey_glazed_ham4` + - Preview: ham4 + +## cooked_rabbit + +- Generated from: `assets/minecraft/items/cooked_rabbit.json` +- Fallback model: `minecraft:item/cooked_rabbit` +- Base render: not present yet + +### Rename variants + +- `stew` -> `lz:food/stew_rabbit` + - Preview: stew + +## cookie + +- Generated from: `assets/minecraft/items/cookie.json` +- Fallback model: `minecraft:item/cookie` +- Base render: not present yet + +### Rename variants + +- `chocolate` -> `lz:food/plated_cookie_chocolate` + - Preview: chocolate +- `chocolate1` -> `lz:food/plated_cookie_chocolate1` + - Preview: chocolate1 +- `chocolate2` -> `lz:food/plated_cookie_chocolate2` + - Preview: chocolate2 +- `chocolate3` -> `lz:food/plated_cookie_chocolate3` + - Preview: chocolate3 +- `chocolate4` -> `lz:food/plated_cookie_chocolate4` + - Preview: chocolate4 +- `cookie` -> `lz:food/plated_cookie` + - Preview: cookie +- `cookie1` -> `lz:food/plated_cookie1` + - Preview: cookie1 +- `cookie2` -> `lz:food/plated_cookie2` + - Preview: cookie2 +- `cookie3` -> `lz:food/plated_cookie3` + - Preview: cookie3 +- `cookie4` -> `lz:food/plated_cookie4` + - Preview: cookie4 +- `honey` -> `lz:food/plated_cookie_honey` + - Preview: honey +- `honey1` -> `lz:food/plated_cookie_honey1` + - Preview: honey1 +- `honey2` -> `lz:food/plated_cookie_honey2` + - Preview: honey2 +- `honey3` -> `lz:food/plated_cookie_honey3` + - Preview: honey3 +- `honey4` -> `lz:food/plated_cookie_honey4` + - Preview: honey4 +- `sugar` -> `lz:food/plated_cookie_sugar` + - Preview: sugar +- `sugar1` -> `lz:food/plated_cookie_sugar1` + - Preview: sugar1 +- `sugar2` -> `lz:food/plated_cookie_sugar2` + - Preview: sugar2 +- `sugar3` -> `lz:food/plated_cookie_sugar3` + - Preview: sugar3 +- `sugar4` -> `lz:food/plated_cookie_sugar4` + - Preview: sugar4 +- `sweet_berry` -> `lz:food/plated_cookie_sweet_berry` + - Preview: sweet_berry +- `sweet_berry1` -> `lz:food/plated_cookie_sweet_berry1` + - Preview: sweet_berry1 +- `sweet_berry2` -> `lz:food/plated_cookie_sweet_berry2` + - Preview: sweet_berry2 +- `sweet_berry3` -> `lz:food/plated_cookie_sweet_berry3` + - Preview: sweet_berry3 +- `sweet_berry4` -> `lz:food/plated_cookie_sweet_berry4` + - Preview: sweet_berry4 + +## dried_kelp + +- Generated from: `assets/minecraft/items/dried_kelp.json` +- Fallback model: `minecraft:item/dried_kelp` +- Base render: not present yet + +### Rename variants + +- `roll` -> `lz:food/plated_kelp_roll` + - Preview: roll +- `roll1` -> `lz:food/plated_kelp_roll_1` + - Preview: roll1 +- `roll2` -> `lz:food/plated_kelp_roll_2` + - Preview: roll2 +- `roll3` -> `lz:food/plated_kelp_roll_3` + - Preview: roll3 + +## glass_bottle + +- Generated from: `assets/minecraft/items/glass_bottle.json` +- Fallback model: `minecraft:item/glass_bottle` +- Base render: not present yet + +### Rename variants + +- `drink` -> `lz:food/glass_bottle` + - Preview: drink +- `drink_water` -> `lz:food/drink_water` + - Preview: drink_water +- `mug_chocolate` -> `lz:festive/hot_chocolate_mug` + - Preview: mug_chocolate + +## glow_berries + +- Generated from: `assets/minecraft/items/glow_berries.json` +- Fallback model: `minecraft:item/glow_berries` +- Base render: not present yet + +### Rename variants + +- `drink` -> `lz:food/drink_glow_berry` + - Preview: drink +- `roll` -> `lz:food/plated_glow_berry_sweet_roll` + - Preview: roll +- `roll1` -> `lz:food/plated_glow_berry_sweet_roll1` + - Preview: roll1 +- `roll2` -> `lz:food/plated_glow_berry_sweet_roll2` + - Preview: roll2 +- `roll3` -> `lz:food/plated_glow_berry_sweet_roll3` + - Preview: roll3 +- `roll4` -> `lz:food/plated_glow_berry_sweet_roll4` + - Preview: roll4 + +## melon_slice + +- Generated from: `assets/minecraft/items/melon_slice.json` +- Fallback model: `minecraft:item/melon_slice` +- Base render: not present yet + +### Rename variants + +- `drink` -> `lz:food/drink_melon_juice` + - Preview: drink +- `popsicle1` -> `lz:food/plated_melon_popsicle1` + - Preview: popsicle1 +- `popsicle2` -> `lz:food/plated_melon_popsicle2` + - Preview: popsicle2 + +## mushroom_stew + +- Generated from: `assets/minecraft/items/mushroom_stew.json` +- Fallback model: `minecraft:item/mushroom_stew` +- Base render: not present yet + +### Rename variants + +- `stew` -> `lz:food/stew_mushroom` + - Preview: stew + +## oak_sapling + +- Generated from: `assets/minecraft/items/oak_sapling.json` +- Fallback model: `minecraft:item/oak_sapling` +- Base render: not present yet + +### Rename variants + +- `christmas` -> `lz:festive/christmas_tree` + - Preview: christmas + +## paper + +- Generated from: `assets/minecraft/items/paper.json` +- Fallback model: `minecraft:item/paper` +- Base render: not present yet + +### Rename variants + +- `card_back` -> `cards:item/back` + - Preview: card_back +- `card_base` -> `cards:item/base` + - Preview: card_base +- `card_c01` -> `cards:item/c_01` + - Preview: card_c01 +- `card_c02` -> `cards:item/c_02` + - Preview: card_c02 +- `card_c03` -> `cards:item/c_03` + - Preview: card_c03 +- `card_c04` -> `cards:item/c_04` + - Preview: card_c04 +- `card_c05` -> `cards:item/c_05` + - Preview: card_c05 +- `card_c06` -> `cards:item/c_06` + - Preview: card_c06 +- `card_c07` -> `cards:item/c_07` + - Preview: card_c07 +- `card_c08` -> `cards:item/c_08` + - Preview: card_c08 +- `card_c09` -> `cards:item/c_09` + - Preview: card_c09 +- `card_c10` -> `cards:item/c_10` + - Preview: card_c10 +- `card_c11` -> `cards:item/c_11` + - Preview: card_c11 +- `card_c12` -> `cards:item/c_12` + - Preview: card_c12 +- `card_c13` -> `cards:item/c_13` + - Preview: card_c13 +- `card_custom_back` -> `cards:item/custom/back` + - Preview: card_custom_back +- `card_custom_base` -> `cards:item/base` + - Preview: card_custom_base +- `card_custom_c01` -> `cards:item/custom/c_01` + - Preview: card_custom_c01 +- `card_custom_c02` -> `cards:item/custom/c_02` + - Preview: card_custom_c02 +- `card_custom_c03` -> `cards:item/custom/c_03` + - Preview: card_custom_c03 +- `card_custom_c04` -> `cards:item/custom/c_04` + - Preview: card_custom_c04 +- `card_custom_c05` -> `cards:item/custom/c_05` + - Preview: card_custom_c05 +- `card_custom_c06` -> `cards:item/custom/c_06` + - Preview: card_custom_c06 +- `card_custom_c07` -> `cards:item/custom/c_07` + - Preview: card_custom_c07 +- `card_custom_c08` -> `cards:item/custom/c_08` + - Preview: card_custom_c08 +- `card_custom_c09` -> `cards:item/custom/c_09` + - Preview: card_custom_c09 +- `card_custom_c10` -> `cards:item/custom/c_10` + - Preview: card_custom_c10 +- `card_custom_c11` -> `cards:item/custom/c_11` + - Preview: card_custom_c11 +- `card_custom_c12` -> `cards:item/custom/c_12` + - Preview: card_custom_c12 +- `card_custom_c13` -> `cards:item/custom/c_13` + - Preview: card_custom_c13 +- `card_custom_d01` -> `cards:item/custom/d_01` + - Preview: card_custom_d01 +- `card_custom_d02` -> `cards:item/custom/d_02` + - Preview: card_custom_d02 +- `card_custom_d03` -> `cards:item/custom/d_03` + - Preview: card_custom_d03 +- `card_custom_d04` -> `cards:item/custom/d_04` + - Preview: card_custom_d04 +- `card_custom_d05` -> `cards:item/custom/d_05` + - Preview: card_custom_d05 +- `card_custom_d06` -> `cards:item/custom/d_06` + - Preview: card_custom_d06 +- `card_custom_d07` -> `cards:item/custom/d_07` + - Preview: card_custom_d07 +- `card_custom_d08` -> `cards:item/custom/d_08` + - Preview: card_custom_d08 +- `card_custom_d09` -> `cards:item/custom/d_09` + - Preview: card_custom_d09 +- `card_custom_d10` -> `cards:item/custom/d_10` + - Preview: card_custom_d10 +- `card_custom_d11` -> `cards:item/custom/d_11` + - Preview: card_custom_d11 +- `card_custom_d12` -> `cards:item/custom/d_12` + - Preview: card_custom_d12 +- `card_custom_d13` -> `cards:item/custom/d_13` + - Preview: card_custom_d13 +- `card_custom_h01` -> `cards:item/custom/h_01` + - Preview: card_custom_h01 +- `card_custom_h02` -> `cards:item/custom/h_02` + - Preview: card_custom_h02 +- `card_custom_h03` -> `cards:item/custom/h_03` + - Preview: card_custom_h03 +- `card_custom_h04` -> `cards:item/custom/h_04` + - Preview: card_custom_h04 +- `card_custom_h05` -> `cards:item/custom/h_05` + - Preview: card_custom_h05 +- `card_custom_h06` -> `cards:item/custom/h_06` + - Preview: card_custom_h06 +- `card_custom_h07` -> `cards:item/custom/h_07` + - Preview: card_custom_h07 +- `card_custom_h08` -> `cards:item/custom/h_08` + - Preview: card_custom_h08 +- `card_custom_h09` -> `cards:item/custom/h_09` + - Preview: card_custom_h09 +- `card_custom_h10` -> `cards:item/custom/h_10` + - Preview: card_custom_h10 +- `card_custom_h11` -> `cards:item/custom/h_11` + - Preview: card_custom_h11 +- `card_custom_h12` -> `cards:item/custom/h_12` + - Preview: card_custom_h12 +- `card_custom_h13` -> `cards:item/custom/h_13` + - Preview: card_custom_h13 +- `card_custom_jb` -> `cards:item/custom/joker_black` + - Preview: card_custom_jb +- `card_custom_jr` -> `cards:item/custom/joker_red` + - Preview: card_custom_jr +- `card_custom_s01` -> `cards:item/custom/s_01` + - Preview: card_custom_s01 +- `card_custom_s02` -> `cards:item/custom/s_02` + - Preview: card_custom_s02 +- `card_custom_s03` -> `cards:item/custom/s_03` + - Preview: card_custom_s03 +- `card_custom_s04` -> `cards:item/custom/s_04` + - Preview: card_custom_s04 +- `card_custom_s05` -> `cards:item/custom/s_05` + - Preview: card_custom_s05 +- `card_custom_s06` -> `cards:item/custom/s_06` + - Preview: card_custom_s06 +- `card_custom_s07` -> `cards:item/custom/s_07` + - Preview: card_custom_s07 +- `card_custom_s08` -> `cards:item/custom/s_08` + - Preview: card_custom_s08 +- `card_custom_s09` -> `cards:item/custom/s_09` + - Preview: card_custom_s09 +- `card_custom_s10` -> `cards:item/custom/s_10` + - Preview: card_custom_s10 +- `card_custom_s11` -> `cards:item/custom/s_11` + - Preview: card_custom_s11 +- `card_custom_s12` -> `cards:item/custom/s_12` + - Preview: card_custom_s12 +- `card_custom_s13` -> `cards:item/custom/s_13` + - Preview: card_custom_s13 +- `card_d01` -> `cards:item/d_01` + - Preview: card_d01 +- `card_d02` -> `cards:item/d_02` + - Preview: card_d02 +- `card_d03` -> `cards:item/d_03` + - Preview: card_d03 +- `card_d04` -> `cards:item/d_04` + - Preview: card_d04 +- `card_d05` -> `cards:item/d_05` + - Preview: card_d05 +- `card_d06` -> `cards:item/d_06` + - Preview: card_d06 +- `card_d07` -> `cards:item/d_07` + - Preview: card_d07 +- `card_d08` -> `cards:item/d_08` + - Preview: card_d08 +- `card_d09` -> `cards:item/d_09` + - Preview: card_d09 +- `card_d10` -> `cards:item/d_10` + - Preview: card_d10 +- `card_d11` -> `cards:item/d_11` + - Preview: card_d11 +- `card_d12` -> `cards:item/d_12` + - Preview: card_d12 +- `card_d13` -> `cards:item/d_13` + - Preview: card_d13 +- `card_h01` -> `cards:item/h_01` + - Preview: card_h01 +- `card_h02` -> `cards:item/h_02` + - Preview: card_h02 +- `card_h03` -> `cards:item/h_03` + - Preview: card_h03 +- `card_h04` -> `cards:item/h_04` + - Preview: card_h04 +- `card_h05` -> `cards:item/h_05` + - Preview: card_h05 +- `card_h06` -> `cards:item/h_06` + - Preview: card_h06 +- `card_h07` -> `cards:item/h_07` + - Preview: card_h07 +- `card_h08` -> `cards:item/h_08` + - Preview: card_h08 +- `card_h09` -> `cards:item/h_09` + - Preview: card_h09 +- `card_h10` -> `cards:item/h_10` + - Preview: card_h10 +- `card_h11` -> `cards:item/h_11` + - Preview: card_h11 +- `card_h12` -> `cards:item/h_12` + - Preview: card_h12 +- `card_h13` -> `cards:item/h_13` + - Preview: card_h13 +- `card_jb` -> `cards:item/joker_black` + - Preview: card_jb +- `card_jr` -> `cards:item/joker_red` + - Preview: card_jr +- `card_s01` -> `cards:item/s_01` + - Preview: card_s01 +- `card_s02` -> `cards:item/s_02` + - Preview: card_s02 +- `card_s03` -> `cards:item/s_03` + - Preview: card_s03 +- `card_s04` -> `cards:item/s_04` + - Preview: card_s04 +- `card_s05` -> `cards:item/s_05` + - Preview: card_s05 +- `card_s06` -> `cards:item/s_06` + - Preview: card_s06 +- `card_s07` -> `cards:item/s_07` + - Preview: card_s07 +- `card_s08` -> `cards:item/s_08` + - Preview: card_s08 +- `card_s09` -> `cards:item/s_09` + - Preview: card_s09 +- `card_s10` -> `cards:item/s_10` + - Preview: card_s10 +- `card_s11` -> `cards:item/s_11` + - Preview: card_s11 +- `card_s12` -> `cards:item/s_12` + - Preview: card_s12 +- `card_s13` -> `cards:item/s_13` + - Preview: card_s13 +- `presents` -> `lz:festive/presents` + - Preview: presents + +## pumpkin_pie + +- Generated from: `assets/minecraft/items/pumpkin_pie.json` +- Fallback model: `minecraft:item/pumpkin_pie` +- Base render: not present yet + +### Rename variants + +- `pie` -> `lz:food/pie_pumpkin` + - Preview: pie +- `pie1` -> `lz:food/pie_pumpkin1` + - Preview: pie1 +- `pie2` -> `lz:food/pie_pumpkin2` + - Preview: pie2 +- `pie3` -> `lz:food/pie_pumpkin3` + - Preview: pie3 +- `pie4` -> `lz:food/pie_pumpkin4` + - Preview: pie4 +- `soup` -> `lz:food/soup_pumpkin` + - Preview: soup + +## salmon + +- Generated from: `assets/minecraft/items/salmon.json` +- Fallback model: `minecraft:item/salmon` +- Base render: not present yet + +### Rename variants + +- `roll` -> `lz:food/plated_salmon_roll` + - Preview: roll +- `roll1` -> `lz:food/plated_salmon_roll_1` + - Preview: roll1 +- `roll2` -> `lz:food/plated_salmon_roll_2` + - Preview: roll2 +- `roll3` -> `lz:food/plated_salmon_roll_3` + - Preview: roll3 +- `roll4` -> `lz:food/plated_salmon_roll_4` + - Preview: roll4 +- `roll5` -> `lz:food/plated_salmon_roll_5` + - Preview: roll5 +- `roll6` -> `lz:food/plated_salmon_roll_6` + - Preview: roll6 + +## sweet_berries + +- Generated from: `assets/minecraft/items/sweet_berries.json` +- Fallback model: `minecraft:item/sweet_berries` +- Base render: not present yet + +### Rename variants + +- `drink` -> `lz:food/drink_sweet_berry` + - Preview: drink +- `pie` -> `lz:food/pie_sweet_berry` + - Preview: pie +- `pie1` -> `lz:food/pie_sweet_berry1` + - Preview: pie1 +- `pie2` -> `lz:food/pie_sweet_berry2` + - Preview: pie2 +- `pie3` -> `lz:food/pie_sweet_berry3` + - Preview: pie3 +- `pie4` -> `lz:food/pie_sweet_berry4` + - Preview: pie4 + +--- + +This file is generated. Add your renderer output under the matching `renders/` paths to populate image previews later. \ No newline at end of file diff --git a/build/renders/cards/item/back.png b/build/renders/cards/item/back.png new file mode 100644 index 0000000..1042106 Binary files /dev/null and b/build/renders/cards/item/back.png differ diff --git a/build/renders/cards/item/base.png b/build/renders/cards/item/base.png new file mode 100644 index 0000000..e0f78c9 Binary files /dev/null and b/build/renders/cards/item/base.png differ diff --git a/build/renders/cards/item/c_01.png b/build/renders/cards/item/c_01.png new file mode 100644 index 0000000..469952a Binary files /dev/null and b/build/renders/cards/item/c_01.png differ diff --git a/build/renders/cards/item/c_02.png b/build/renders/cards/item/c_02.png new file mode 100644 index 0000000..2f08ffa Binary files /dev/null and b/build/renders/cards/item/c_02.png differ diff --git a/build/renders/cards/item/c_03.png b/build/renders/cards/item/c_03.png new file mode 100644 index 0000000..47da0d1 Binary files /dev/null and b/build/renders/cards/item/c_03.png differ diff --git a/build/renders/cards/item/c_04.png b/build/renders/cards/item/c_04.png new file mode 100644 index 0000000..17dbd97 Binary files /dev/null and b/build/renders/cards/item/c_04.png differ diff --git a/build/renders/cards/item/c_05.png b/build/renders/cards/item/c_05.png new file mode 100644 index 0000000..4d4fdbd Binary files /dev/null and b/build/renders/cards/item/c_05.png differ diff --git a/build/renders/cards/item/c_06.png b/build/renders/cards/item/c_06.png new file mode 100644 index 0000000..e33161a Binary files /dev/null and b/build/renders/cards/item/c_06.png differ diff --git a/build/renders/cards/item/c_07.png b/build/renders/cards/item/c_07.png new file mode 100644 index 0000000..f3f0df6 Binary files /dev/null and b/build/renders/cards/item/c_07.png differ diff --git a/build/renders/cards/item/c_08.png b/build/renders/cards/item/c_08.png new file mode 100644 index 0000000..8ca60be Binary files /dev/null and b/build/renders/cards/item/c_08.png differ diff --git a/build/renders/cards/item/c_09.png b/build/renders/cards/item/c_09.png new file mode 100644 index 0000000..8f952bd Binary files /dev/null and b/build/renders/cards/item/c_09.png differ diff --git a/build/renders/cards/item/c_10.png b/build/renders/cards/item/c_10.png new file mode 100644 index 0000000..075f987 Binary files /dev/null and b/build/renders/cards/item/c_10.png differ diff --git a/build/renders/cards/item/c_11.png b/build/renders/cards/item/c_11.png new file mode 100644 index 0000000..6212487 Binary files /dev/null and b/build/renders/cards/item/c_11.png differ diff --git a/build/renders/cards/item/c_12.png b/build/renders/cards/item/c_12.png new file mode 100644 index 0000000..39f969b Binary files /dev/null and b/build/renders/cards/item/c_12.png differ diff --git a/build/renders/cards/item/c_13.png b/build/renders/cards/item/c_13.png new file mode 100644 index 0000000..d2fef5b Binary files /dev/null and b/build/renders/cards/item/c_13.png differ diff --git a/build/renders/cards/item/custom/back.png b/build/renders/cards/item/custom/back.png new file mode 100644 index 0000000..8651a12 Binary files /dev/null and b/build/renders/cards/item/custom/back.png differ diff --git a/build/renders/cards/item/custom/c_01.png b/build/renders/cards/item/custom/c_01.png new file mode 100644 index 0000000..ce5e5ed Binary files /dev/null and b/build/renders/cards/item/custom/c_01.png differ diff --git a/build/renders/cards/item/custom/c_02.png b/build/renders/cards/item/custom/c_02.png new file mode 100644 index 0000000..f5eb125 Binary files /dev/null and b/build/renders/cards/item/custom/c_02.png differ diff --git a/build/renders/cards/item/custom/c_03.png b/build/renders/cards/item/custom/c_03.png new file mode 100644 index 0000000..95fbea2 Binary files /dev/null and b/build/renders/cards/item/custom/c_03.png differ diff --git a/build/renders/cards/item/custom/c_04.png b/build/renders/cards/item/custom/c_04.png new file mode 100644 index 0000000..ba4eca3 Binary files /dev/null and b/build/renders/cards/item/custom/c_04.png differ diff --git a/build/renders/cards/item/custom/c_05.png b/build/renders/cards/item/custom/c_05.png new file mode 100644 index 0000000..274cf04 Binary files /dev/null and b/build/renders/cards/item/custom/c_05.png differ diff --git a/build/renders/cards/item/custom/c_06.png b/build/renders/cards/item/custom/c_06.png new file mode 100644 index 0000000..4bc31dd Binary files /dev/null and b/build/renders/cards/item/custom/c_06.png differ diff --git a/build/renders/cards/item/custom/c_07.png b/build/renders/cards/item/custom/c_07.png new file mode 100644 index 0000000..7bb86de Binary files /dev/null and b/build/renders/cards/item/custom/c_07.png differ diff --git a/build/renders/cards/item/custom/c_08.png b/build/renders/cards/item/custom/c_08.png new file mode 100644 index 0000000..b736b14 Binary files /dev/null and b/build/renders/cards/item/custom/c_08.png differ diff --git a/build/renders/cards/item/custom/c_09.png b/build/renders/cards/item/custom/c_09.png new file mode 100644 index 0000000..085d278 Binary files /dev/null and b/build/renders/cards/item/custom/c_09.png differ diff --git a/build/renders/cards/item/custom/c_10.png b/build/renders/cards/item/custom/c_10.png new file mode 100644 index 0000000..25a78cf Binary files /dev/null and b/build/renders/cards/item/custom/c_10.png differ diff --git a/build/renders/cards/item/custom/c_11.png b/build/renders/cards/item/custom/c_11.png new file mode 100644 index 0000000..8f5197e Binary files /dev/null and b/build/renders/cards/item/custom/c_11.png differ diff --git a/build/renders/cards/item/custom/c_12.png b/build/renders/cards/item/custom/c_12.png new file mode 100644 index 0000000..16a0eed Binary files /dev/null and b/build/renders/cards/item/custom/c_12.png differ diff --git a/build/renders/cards/item/custom/c_13.png b/build/renders/cards/item/custom/c_13.png new file mode 100644 index 0000000..ccb0a0e Binary files /dev/null and b/build/renders/cards/item/custom/c_13.png differ diff --git a/build/renders/cards/item/custom/d_01.png b/build/renders/cards/item/custom/d_01.png new file mode 100644 index 0000000..c8aefd8 Binary files /dev/null and b/build/renders/cards/item/custom/d_01.png differ diff --git a/build/renders/cards/item/custom/d_02.png b/build/renders/cards/item/custom/d_02.png new file mode 100644 index 0000000..7e1cce6 Binary files /dev/null and b/build/renders/cards/item/custom/d_02.png differ diff --git a/build/renders/cards/item/custom/d_03.png b/build/renders/cards/item/custom/d_03.png new file mode 100644 index 0000000..ce0dc9c Binary files /dev/null and b/build/renders/cards/item/custom/d_03.png differ diff --git a/build/renders/cards/item/custom/d_04.png b/build/renders/cards/item/custom/d_04.png new file mode 100644 index 0000000..47ad6c9 Binary files /dev/null and b/build/renders/cards/item/custom/d_04.png differ diff --git a/build/renders/cards/item/custom/d_05.png b/build/renders/cards/item/custom/d_05.png new file mode 100644 index 0000000..b3ec110 Binary files /dev/null and b/build/renders/cards/item/custom/d_05.png differ diff --git a/build/renders/cards/item/custom/d_06.png b/build/renders/cards/item/custom/d_06.png new file mode 100644 index 0000000..38ea9a8 Binary files /dev/null and b/build/renders/cards/item/custom/d_06.png differ diff --git a/build/renders/cards/item/custom/d_07.png b/build/renders/cards/item/custom/d_07.png new file mode 100644 index 0000000..5367350 Binary files /dev/null and b/build/renders/cards/item/custom/d_07.png differ diff --git a/build/renders/cards/item/custom/d_08.png b/build/renders/cards/item/custom/d_08.png new file mode 100644 index 0000000..5f29177 Binary files /dev/null and b/build/renders/cards/item/custom/d_08.png differ diff --git a/build/renders/cards/item/custom/d_09.png b/build/renders/cards/item/custom/d_09.png new file mode 100644 index 0000000..2e6d100 Binary files /dev/null and b/build/renders/cards/item/custom/d_09.png differ diff --git a/build/renders/cards/item/custom/d_10.png b/build/renders/cards/item/custom/d_10.png new file mode 100644 index 0000000..0eadb47 Binary files /dev/null and b/build/renders/cards/item/custom/d_10.png differ diff --git a/build/renders/cards/item/custom/d_11.png b/build/renders/cards/item/custom/d_11.png new file mode 100644 index 0000000..54c0cbe Binary files /dev/null and b/build/renders/cards/item/custom/d_11.png differ diff --git a/build/renders/cards/item/custom/d_12.png b/build/renders/cards/item/custom/d_12.png new file mode 100644 index 0000000..e4630da Binary files /dev/null and b/build/renders/cards/item/custom/d_12.png differ diff --git a/build/renders/cards/item/custom/d_13.png b/build/renders/cards/item/custom/d_13.png new file mode 100644 index 0000000..a078ce0 Binary files /dev/null and b/build/renders/cards/item/custom/d_13.png differ diff --git a/build/renders/cards/item/custom/h_01.png b/build/renders/cards/item/custom/h_01.png new file mode 100644 index 0000000..be14aed Binary files /dev/null and b/build/renders/cards/item/custom/h_01.png differ diff --git a/build/renders/cards/item/custom/h_02.png b/build/renders/cards/item/custom/h_02.png new file mode 100644 index 0000000..c3dd322 Binary files /dev/null and b/build/renders/cards/item/custom/h_02.png differ diff --git a/build/renders/cards/item/custom/h_03.png b/build/renders/cards/item/custom/h_03.png new file mode 100644 index 0000000..d937c33 Binary files /dev/null and b/build/renders/cards/item/custom/h_03.png differ diff --git a/build/renders/cards/item/custom/h_04.png b/build/renders/cards/item/custom/h_04.png new file mode 100644 index 0000000..d996c53 Binary files /dev/null and b/build/renders/cards/item/custom/h_04.png differ diff --git a/build/renders/cards/item/custom/h_05.png b/build/renders/cards/item/custom/h_05.png new file mode 100644 index 0000000..afe9763 Binary files /dev/null and b/build/renders/cards/item/custom/h_05.png differ diff --git a/build/renders/cards/item/custom/h_06.png b/build/renders/cards/item/custom/h_06.png new file mode 100644 index 0000000..d7460d2 Binary files /dev/null and b/build/renders/cards/item/custom/h_06.png differ diff --git a/build/renders/cards/item/custom/h_07.png b/build/renders/cards/item/custom/h_07.png new file mode 100644 index 0000000..129e588 Binary files /dev/null and b/build/renders/cards/item/custom/h_07.png differ diff --git a/build/renders/cards/item/custom/h_08.png b/build/renders/cards/item/custom/h_08.png new file mode 100644 index 0000000..d25034d Binary files /dev/null and b/build/renders/cards/item/custom/h_08.png differ diff --git a/build/renders/cards/item/custom/h_09.png b/build/renders/cards/item/custom/h_09.png new file mode 100644 index 0000000..d1faf3a Binary files /dev/null and b/build/renders/cards/item/custom/h_09.png differ diff --git a/build/renders/cards/item/custom/h_10.png b/build/renders/cards/item/custom/h_10.png new file mode 100644 index 0000000..424b74e Binary files /dev/null and b/build/renders/cards/item/custom/h_10.png differ diff --git a/build/renders/cards/item/custom/h_11.png b/build/renders/cards/item/custom/h_11.png new file mode 100644 index 0000000..f964367 Binary files /dev/null and b/build/renders/cards/item/custom/h_11.png differ diff --git a/build/renders/cards/item/custom/h_12.png b/build/renders/cards/item/custom/h_12.png new file mode 100644 index 0000000..9e4f4c4 Binary files /dev/null and b/build/renders/cards/item/custom/h_12.png differ diff --git a/build/renders/cards/item/custom/h_13.png b/build/renders/cards/item/custom/h_13.png new file mode 100644 index 0000000..ec81600 Binary files /dev/null and b/build/renders/cards/item/custom/h_13.png differ diff --git a/build/renders/cards/item/custom/joker_black.png b/build/renders/cards/item/custom/joker_black.png new file mode 100644 index 0000000..af34cb9 Binary files /dev/null and b/build/renders/cards/item/custom/joker_black.png differ diff --git a/build/renders/cards/item/custom/joker_red.png b/build/renders/cards/item/custom/joker_red.png new file mode 100644 index 0000000..c9da419 Binary files /dev/null and b/build/renders/cards/item/custom/joker_red.png differ diff --git a/build/renders/cards/item/custom/s_01.png b/build/renders/cards/item/custom/s_01.png new file mode 100644 index 0000000..ff188b4 Binary files /dev/null and b/build/renders/cards/item/custom/s_01.png differ diff --git a/build/renders/cards/item/custom/s_02.png b/build/renders/cards/item/custom/s_02.png new file mode 100644 index 0000000..624446d Binary files /dev/null and b/build/renders/cards/item/custom/s_02.png differ diff --git a/build/renders/cards/item/custom/s_03.png b/build/renders/cards/item/custom/s_03.png new file mode 100644 index 0000000..30da0d9 Binary files /dev/null and b/build/renders/cards/item/custom/s_03.png differ diff --git a/build/renders/cards/item/custom/s_04.png b/build/renders/cards/item/custom/s_04.png new file mode 100644 index 0000000..097c79a Binary files /dev/null and b/build/renders/cards/item/custom/s_04.png differ diff --git a/build/renders/cards/item/custom/s_05.png b/build/renders/cards/item/custom/s_05.png new file mode 100644 index 0000000..f7dca12 Binary files /dev/null and b/build/renders/cards/item/custom/s_05.png differ diff --git a/build/renders/cards/item/custom/s_06.png b/build/renders/cards/item/custom/s_06.png new file mode 100644 index 0000000..03b6382 Binary files /dev/null and b/build/renders/cards/item/custom/s_06.png differ diff --git a/build/renders/cards/item/custom/s_07.png b/build/renders/cards/item/custom/s_07.png new file mode 100644 index 0000000..a23ac03 Binary files /dev/null and b/build/renders/cards/item/custom/s_07.png differ diff --git a/build/renders/cards/item/custom/s_08.png b/build/renders/cards/item/custom/s_08.png new file mode 100644 index 0000000..b9a56e2 Binary files /dev/null and b/build/renders/cards/item/custom/s_08.png differ diff --git a/build/renders/cards/item/custom/s_09.png b/build/renders/cards/item/custom/s_09.png new file mode 100644 index 0000000..c08dcf1 Binary files /dev/null and b/build/renders/cards/item/custom/s_09.png differ diff --git a/build/renders/cards/item/custom/s_10.png b/build/renders/cards/item/custom/s_10.png new file mode 100644 index 0000000..4ad0cb2 Binary files /dev/null and b/build/renders/cards/item/custom/s_10.png differ diff --git a/build/renders/cards/item/custom/s_11.png b/build/renders/cards/item/custom/s_11.png new file mode 100644 index 0000000..96d2cc7 Binary files /dev/null and b/build/renders/cards/item/custom/s_11.png differ diff --git a/build/renders/cards/item/custom/s_12.png b/build/renders/cards/item/custom/s_12.png new file mode 100644 index 0000000..878c4f8 Binary files /dev/null and b/build/renders/cards/item/custom/s_12.png differ diff --git a/build/renders/cards/item/custom/s_13.png b/build/renders/cards/item/custom/s_13.png new file mode 100644 index 0000000..ecd8c15 Binary files /dev/null and b/build/renders/cards/item/custom/s_13.png differ diff --git a/build/renders/cards/item/d_01.png b/build/renders/cards/item/d_01.png new file mode 100644 index 0000000..b698232 Binary files /dev/null and b/build/renders/cards/item/d_01.png differ diff --git a/build/renders/cards/item/d_02.png b/build/renders/cards/item/d_02.png new file mode 100644 index 0000000..d686012 Binary files /dev/null and b/build/renders/cards/item/d_02.png differ diff --git a/build/renders/cards/item/d_03.png b/build/renders/cards/item/d_03.png new file mode 100644 index 0000000..4800ccf Binary files /dev/null and b/build/renders/cards/item/d_03.png differ diff --git a/build/renders/cards/item/d_04.png b/build/renders/cards/item/d_04.png new file mode 100644 index 0000000..095668f Binary files /dev/null and b/build/renders/cards/item/d_04.png differ diff --git a/build/renders/cards/item/d_05.png b/build/renders/cards/item/d_05.png new file mode 100644 index 0000000..cbbd01f Binary files /dev/null and b/build/renders/cards/item/d_05.png differ diff --git a/build/renders/cards/item/d_06.png b/build/renders/cards/item/d_06.png new file mode 100644 index 0000000..338a58b Binary files /dev/null and b/build/renders/cards/item/d_06.png differ diff --git a/build/renders/cards/item/d_07.png b/build/renders/cards/item/d_07.png new file mode 100644 index 0000000..a4ff752 Binary files /dev/null and b/build/renders/cards/item/d_07.png differ diff --git a/build/renders/cards/item/d_08.png b/build/renders/cards/item/d_08.png new file mode 100644 index 0000000..f59ee24 Binary files /dev/null and b/build/renders/cards/item/d_08.png differ diff --git a/build/renders/cards/item/d_09.png b/build/renders/cards/item/d_09.png new file mode 100644 index 0000000..73ca4b5 Binary files /dev/null and b/build/renders/cards/item/d_09.png differ diff --git a/build/renders/cards/item/d_10.png b/build/renders/cards/item/d_10.png new file mode 100644 index 0000000..0acc241 Binary files /dev/null and b/build/renders/cards/item/d_10.png differ diff --git a/build/renders/cards/item/d_11.png b/build/renders/cards/item/d_11.png new file mode 100644 index 0000000..571cc77 Binary files /dev/null and b/build/renders/cards/item/d_11.png differ diff --git a/build/renders/cards/item/d_12.png b/build/renders/cards/item/d_12.png new file mode 100644 index 0000000..14fb7e7 Binary files /dev/null and b/build/renders/cards/item/d_12.png differ diff --git a/build/renders/cards/item/d_13.png b/build/renders/cards/item/d_13.png new file mode 100644 index 0000000..c1c1477 Binary files /dev/null and b/build/renders/cards/item/d_13.png differ diff --git a/build/renders/cards/item/h_01.png b/build/renders/cards/item/h_01.png new file mode 100644 index 0000000..be14aed Binary files /dev/null and b/build/renders/cards/item/h_01.png differ diff --git a/build/renders/cards/item/h_02.png b/build/renders/cards/item/h_02.png new file mode 100644 index 0000000..c3dd322 Binary files /dev/null and b/build/renders/cards/item/h_02.png differ diff --git a/build/renders/cards/item/h_03.png b/build/renders/cards/item/h_03.png new file mode 100644 index 0000000..d937c33 Binary files /dev/null and b/build/renders/cards/item/h_03.png differ diff --git a/build/renders/cards/item/h_04.png b/build/renders/cards/item/h_04.png new file mode 100644 index 0000000..d996c53 Binary files /dev/null and b/build/renders/cards/item/h_04.png differ diff --git a/build/renders/cards/item/h_05.png b/build/renders/cards/item/h_05.png new file mode 100644 index 0000000..afe9763 Binary files /dev/null and b/build/renders/cards/item/h_05.png differ diff --git a/build/renders/cards/item/h_06.png b/build/renders/cards/item/h_06.png new file mode 100644 index 0000000..d7460d2 Binary files /dev/null and b/build/renders/cards/item/h_06.png differ diff --git a/build/renders/cards/item/h_07.png b/build/renders/cards/item/h_07.png new file mode 100644 index 0000000..129e588 Binary files /dev/null and b/build/renders/cards/item/h_07.png differ diff --git a/build/renders/cards/item/h_08.png b/build/renders/cards/item/h_08.png new file mode 100644 index 0000000..d25034d Binary files /dev/null and b/build/renders/cards/item/h_08.png differ diff --git a/build/renders/cards/item/h_09.png b/build/renders/cards/item/h_09.png new file mode 100644 index 0000000..d1faf3a Binary files /dev/null and b/build/renders/cards/item/h_09.png differ diff --git a/build/renders/cards/item/h_10.png b/build/renders/cards/item/h_10.png new file mode 100644 index 0000000..424b74e Binary files /dev/null and b/build/renders/cards/item/h_10.png differ diff --git a/build/renders/cards/item/h_11.png b/build/renders/cards/item/h_11.png new file mode 100644 index 0000000..f964367 Binary files /dev/null and b/build/renders/cards/item/h_11.png differ diff --git a/build/renders/cards/item/h_12.png b/build/renders/cards/item/h_12.png new file mode 100644 index 0000000..9e4f4c4 Binary files /dev/null and b/build/renders/cards/item/h_12.png differ diff --git a/build/renders/cards/item/h_13.png b/build/renders/cards/item/h_13.png new file mode 100644 index 0000000..ec81600 Binary files /dev/null and b/build/renders/cards/item/h_13.png differ diff --git a/build/renders/cards/item/joker_black.png b/build/renders/cards/item/joker_black.png new file mode 100644 index 0000000..af34cb9 Binary files /dev/null and b/build/renders/cards/item/joker_black.png differ diff --git a/build/renders/cards/item/joker_red.png b/build/renders/cards/item/joker_red.png new file mode 100644 index 0000000..c9da419 Binary files /dev/null and b/build/renders/cards/item/joker_red.png differ diff --git a/build/renders/cards/item/s_01.png b/build/renders/cards/item/s_01.png new file mode 100644 index 0000000..edeb804 Binary files /dev/null and b/build/renders/cards/item/s_01.png differ diff --git a/build/renders/cards/item/s_02.png b/build/renders/cards/item/s_02.png new file mode 100644 index 0000000..04f393e Binary files /dev/null and b/build/renders/cards/item/s_02.png differ diff --git a/build/renders/cards/item/s_03.png b/build/renders/cards/item/s_03.png new file mode 100644 index 0000000..148f48b Binary files /dev/null and b/build/renders/cards/item/s_03.png differ diff --git a/build/renders/cards/item/s_04.png b/build/renders/cards/item/s_04.png new file mode 100644 index 0000000..4366a1a Binary files /dev/null and b/build/renders/cards/item/s_04.png differ diff --git a/build/renders/cards/item/s_05.png b/build/renders/cards/item/s_05.png new file mode 100644 index 0000000..f432313 Binary files /dev/null and b/build/renders/cards/item/s_05.png differ diff --git a/build/renders/cards/item/s_06.png b/build/renders/cards/item/s_06.png new file mode 100644 index 0000000..c2bc2ce Binary files /dev/null and b/build/renders/cards/item/s_06.png differ diff --git a/build/renders/cards/item/s_07.png b/build/renders/cards/item/s_07.png new file mode 100644 index 0000000..1f71a29 Binary files /dev/null and b/build/renders/cards/item/s_07.png differ diff --git a/build/renders/cards/item/s_08.png b/build/renders/cards/item/s_08.png new file mode 100644 index 0000000..06cb373 Binary files /dev/null and b/build/renders/cards/item/s_08.png differ diff --git a/build/renders/cards/item/s_09.png b/build/renders/cards/item/s_09.png new file mode 100644 index 0000000..cdee955 Binary files /dev/null and b/build/renders/cards/item/s_09.png differ diff --git a/build/renders/cards/item/s_10.png b/build/renders/cards/item/s_10.png new file mode 100644 index 0000000..eff5142 Binary files /dev/null and b/build/renders/cards/item/s_10.png differ diff --git a/build/renders/cards/item/s_11.png b/build/renders/cards/item/s_11.png new file mode 100644 index 0000000..84f0693 Binary files /dev/null and b/build/renders/cards/item/s_11.png differ diff --git a/build/renders/cards/item/s_12.png b/build/renders/cards/item/s_12.png new file mode 100644 index 0000000..1be1b9d Binary files /dev/null and b/build/renders/cards/item/s_12.png differ diff --git a/build/renders/cards/item/s_13.png b/build/renders/cards/item/s_13.png new file mode 100644 index 0000000..b47fc96 Binary files /dev/null and b/build/renders/cards/item/s_13.png differ diff --git a/build/renders/lz/festive/christmas_tree.png b/build/renders/lz/festive/christmas_tree.png new file mode 100644 index 0000000..118d097 Binary files /dev/null and b/build/renders/lz/festive/christmas_tree.png differ diff --git a/build/renders/lz/festive/hot_chocolate_mug.png b/build/renders/lz/festive/hot_chocolate_mug.png new file mode 100644 index 0000000..44b3ab1 Binary files /dev/null and b/build/renders/lz/festive/hot_chocolate_mug.png differ diff --git a/build/renders/lz/festive/presents.png b/build/renders/lz/festive/presents.png new file mode 100644 index 0000000..48c798a Binary files /dev/null and b/build/renders/lz/festive/presents.png differ diff --git a/build/renders/lz/food/drink_apple_cider.png b/build/renders/lz/food/drink_apple_cider.png new file mode 100644 index 0000000..a8f500b Binary files /dev/null and b/build/renders/lz/food/drink_apple_cider.png differ diff --git a/build/renders/lz/food/drink_cocoa.png b/build/renders/lz/food/drink_cocoa.png new file mode 100644 index 0000000..1b3c212 Binary files /dev/null and b/build/renders/lz/food/drink_cocoa.png differ diff --git a/build/renders/lz/food/drink_glow_berry.png b/build/renders/lz/food/drink_glow_berry.png new file mode 100644 index 0000000..214ddf4 Binary files /dev/null and b/build/renders/lz/food/drink_glow_berry.png differ diff --git a/build/renders/lz/food/drink_melon_juice.png b/build/renders/lz/food/drink_melon_juice.png new file mode 100644 index 0000000..1d01a27 Binary files /dev/null and b/build/renders/lz/food/drink_melon_juice.png differ diff --git a/build/renders/lz/food/drink_sweet_berry.png b/build/renders/lz/food/drink_sweet_berry.png new file mode 100644 index 0000000..b3b5b71 Binary files /dev/null and b/build/renders/lz/food/drink_sweet_berry.png differ diff --git a/build/renders/lz/food/drink_water.png b/build/renders/lz/food/drink_water.png new file mode 100644 index 0000000..acda649 Binary files /dev/null and b/build/renders/lz/food/drink_water.png differ diff --git a/build/renders/lz/food/glass_bottle.png b/build/renders/lz/food/glass_bottle.png new file mode 100644 index 0000000..271f3ac Binary files /dev/null and b/build/renders/lz/food/glass_bottle.png differ diff --git a/build/renders/lz/food/pie_apple.png b/build/renders/lz/food/pie_apple.png new file mode 100644 index 0000000..7cc0a4e Binary files /dev/null and b/build/renders/lz/food/pie_apple.png differ diff --git a/build/renders/lz/food/pie_apple1.png b/build/renders/lz/food/pie_apple1.png new file mode 100644 index 0000000..b9e7e16 Binary files /dev/null and b/build/renders/lz/food/pie_apple1.png differ diff --git a/build/renders/lz/food/pie_apple2.png b/build/renders/lz/food/pie_apple2.png new file mode 100644 index 0000000..cb1e329 Binary files /dev/null and b/build/renders/lz/food/pie_apple2.png differ diff --git a/build/renders/lz/food/pie_apple3.png b/build/renders/lz/food/pie_apple3.png new file mode 100644 index 0000000..122dbe6 Binary files /dev/null and b/build/renders/lz/food/pie_apple3.png differ diff --git a/build/renders/lz/food/pie_apple4.png b/build/renders/lz/food/pie_apple4.png new file mode 100644 index 0000000..59d0da8 Binary files /dev/null and b/build/renders/lz/food/pie_apple4.png differ diff --git a/build/renders/lz/food/pie_chocolate.png b/build/renders/lz/food/pie_chocolate.png new file mode 100644 index 0000000..e3aa991 Binary files /dev/null and b/build/renders/lz/food/pie_chocolate.png differ diff --git a/build/renders/lz/food/pie_chocolate1.png b/build/renders/lz/food/pie_chocolate1.png new file mode 100644 index 0000000..29faf1c Binary files /dev/null and b/build/renders/lz/food/pie_chocolate1.png differ diff --git a/build/renders/lz/food/pie_chocolate2.png b/build/renders/lz/food/pie_chocolate2.png new file mode 100644 index 0000000..ba0afcd Binary files /dev/null and b/build/renders/lz/food/pie_chocolate2.png differ diff --git a/build/renders/lz/food/pie_chocolate3.png b/build/renders/lz/food/pie_chocolate3.png new file mode 100644 index 0000000..9fecd3c Binary files /dev/null and b/build/renders/lz/food/pie_chocolate3.png differ diff --git a/build/renders/lz/food/pie_chocolate4.png b/build/renders/lz/food/pie_chocolate4.png new file mode 100644 index 0000000..00a3927 Binary files /dev/null and b/build/renders/lz/food/pie_chocolate4.png differ diff --git a/build/renders/lz/food/pie_pumpkin.png b/build/renders/lz/food/pie_pumpkin.png new file mode 100644 index 0000000..f10c811 Binary files /dev/null and b/build/renders/lz/food/pie_pumpkin.png differ diff --git a/build/renders/lz/food/pie_pumpkin1.png b/build/renders/lz/food/pie_pumpkin1.png new file mode 100644 index 0000000..5d07f7a Binary files /dev/null and b/build/renders/lz/food/pie_pumpkin1.png differ diff --git a/build/renders/lz/food/pie_pumpkin2.png b/build/renders/lz/food/pie_pumpkin2.png new file mode 100644 index 0000000..1172197 Binary files /dev/null and b/build/renders/lz/food/pie_pumpkin2.png differ diff --git a/build/renders/lz/food/pie_pumpkin3.png b/build/renders/lz/food/pie_pumpkin3.png new file mode 100644 index 0000000..160c209 Binary files /dev/null and b/build/renders/lz/food/pie_pumpkin3.png differ diff --git a/build/renders/lz/food/pie_pumpkin4.png b/build/renders/lz/food/pie_pumpkin4.png new file mode 100644 index 0000000..d678ae9 Binary files /dev/null and b/build/renders/lz/food/pie_pumpkin4.png differ diff --git a/build/renders/lz/food/pie_sweet_berry.png b/build/renders/lz/food/pie_sweet_berry.png new file mode 100644 index 0000000..31808ee Binary files /dev/null and b/build/renders/lz/food/pie_sweet_berry.png differ diff --git a/build/renders/lz/food/pie_sweet_berry1.png b/build/renders/lz/food/pie_sweet_berry1.png new file mode 100644 index 0000000..a60ed3e Binary files /dev/null and b/build/renders/lz/food/pie_sweet_berry1.png differ diff --git a/build/renders/lz/food/pie_sweet_berry2.png b/build/renders/lz/food/pie_sweet_berry2.png new file mode 100644 index 0000000..abdeaed Binary files /dev/null and b/build/renders/lz/food/pie_sweet_berry2.png differ diff --git a/build/renders/lz/food/pie_sweet_berry3.png b/build/renders/lz/food/pie_sweet_berry3.png new file mode 100644 index 0000000..aed6dce Binary files /dev/null and b/build/renders/lz/food/pie_sweet_berry3.png differ diff --git a/build/renders/lz/food/pie_sweet_berry4.png b/build/renders/lz/food/pie_sweet_berry4.png new file mode 100644 index 0000000..0f67c56 Binary files /dev/null and b/build/renders/lz/food/pie_sweet_berry4.png differ diff --git a/build/renders/lz/food/plated_baked_potato.png b/build/renders/lz/food/plated_baked_potato.png new file mode 100644 index 0000000..c73f72f Binary files /dev/null and b/build/renders/lz/food/plated_baked_potato.png differ diff --git a/build/renders/lz/food/plated_baked_potato1.png b/build/renders/lz/food/plated_baked_potato1.png new file mode 100644 index 0000000..604d396 Binary files /dev/null and b/build/renders/lz/food/plated_baked_potato1.png differ diff --git a/build/renders/lz/food/plated_baked_potato2.png b/build/renders/lz/food/plated_baked_potato2.png new file mode 100644 index 0000000..b17527a Binary files /dev/null and b/build/renders/lz/food/plated_baked_potato2.png differ diff --git a/build/renders/lz/food/plated_baked_potato3.png b/build/renders/lz/food/plated_baked_potato3.png new file mode 100644 index 0000000..3f3bc7b Binary files /dev/null and b/build/renders/lz/food/plated_baked_potato3.png differ diff --git a/build/renders/lz/food/plated_cake_slice.png b/build/renders/lz/food/plated_cake_slice.png new file mode 100644 index 0000000..73613d2 Binary files /dev/null and b/build/renders/lz/food/plated_cake_slice.png differ diff --git a/build/renders/lz/food/plated_cod_roll.png b/build/renders/lz/food/plated_cod_roll.png new file mode 100644 index 0000000..943324a Binary files /dev/null and b/build/renders/lz/food/plated_cod_roll.png differ diff --git a/build/renders/lz/food/plated_cod_roll_1.png b/build/renders/lz/food/plated_cod_roll_1.png new file mode 100644 index 0000000..718f79f Binary files /dev/null and b/build/renders/lz/food/plated_cod_roll_1.png differ diff --git a/build/renders/lz/food/plated_cod_roll_2.png b/build/renders/lz/food/plated_cod_roll_2.png new file mode 100644 index 0000000..adcdd23 Binary files /dev/null and b/build/renders/lz/food/plated_cod_roll_2.png differ diff --git a/build/renders/lz/food/plated_cod_roll_3.png b/build/renders/lz/food/plated_cod_roll_3.png new file mode 100644 index 0000000..ccb17b1 Binary files /dev/null and b/build/renders/lz/food/plated_cod_roll_3.png differ diff --git a/build/renders/lz/food/plated_cod_roll_4.png b/build/renders/lz/food/plated_cod_roll_4.png new file mode 100644 index 0000000..7a7f22a Binary files /dev/null and b/build/renders/lz/food/plated_cod_roll_4.png differ diff --git a/build/renders/lz/food/plated_cod_roll_5.png b/build/renders/lz/food/plated_cod_roll_5.png new file mode 100644 index 0000000..5757432 Binary files /dev/null and b/build/renders/lz/food/plated_cod_roll_5.png differ diff --git a/build/renders/lz/food/plated_cod_roll_6.png b/build/renders/lz/food/plated_cod_roll_6.png new file mode 100644 index 0000000..e3080a2 Binary files /dev/null and b/build/renders/lz/food/plated_cod_roll_6.png differ diff --git a/build/renders/lz/food/plated_cookie.png b/build/renders/lz/food/plated_cookie.png new file mode 100644 index 0000000..bedb788 Binary files /dev/null and b/build/renders/lz/food/plated_cookie.png differ diff --git a/build/renders/lz/food/plated_cookie1.png b/build/renders/lz/food/plated_cookie1.png new file mode 100644 index 0000000..2130e9a Binary files /dev/null and b/build/renders/lz/food/plated_cookie1.png differ diff --git a/build/renders/lz/food/plated_cookie2.png b/build/renders/lz/food/plated_cookie2.png new file mode 100644 index 0000000..4ac7642 Binary files /dev/null and b/build/renders/lz/food/plated_cookie2.png differ diff --git a/build/renders/lz/food/plated_cookie3.png b/build/renders/lz/food/plated_cookie3.png new file mode 100644 index 0000000..069978a Binary files /dev/null and b/build/renders/lz/food/plated_cookie3.png differ diff --git a/build/renders/lz/food/plated_cookie4.png b/build/renders/lz/food/plated_cookie4.png new file mode 100644 index 0000000..a198d7d Binary files /dev/null and b/build/renders/lz/food/plated_cookie4.png differ diff --git a/build/renders/lz/food/plated_cookie_chocolate.png b/build/renders/lz/food/plated_cookie_chocolate.png new file mode 100644 index 0000000..fb2005b Binary files /dev/null and b/build/renders/lz/food/plated_cookie_chocolate.png differ diff --git a/build/renders/lz/food/plated_cookie_chocolate1.png b/build/renders/lz/food/plated_cookie_chocolate1.png new file mode 100644 index 0000000..ce0f17c Binary files /dev/null and b/build/renders/lz/food/plated_cookie_chocolate1.png differ diff --git a/build/renders/lz/food/plated_cookie_chocolate2.png b/build/renders/lz/food/plated_cookie_chocolate2.png new file mode 100644 index 0000000..82ebc68 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_chocolate2.png differ diff --git a/build/renders/lz/food/plated_cookie_chocolate3.png b/build/renders/lz/food/plated_cookie_chocolate3.png new file mode 100644 index 0000000..048261e Binary files /dev/null and b/build/renders/lz/food/plated_cookie_chocolate3.png differ diff --git a/build/renders/lz/food/plated_cookie_chocolate4.png b/build/renders/lz/food/plated_cookie_chocolate4.png new file mode 100644 index 0000000..49a3c72 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_chocolate4.png differ diff --git a/build/renders/lz/food/plated_cookie_honey.png b/build/renders/lz/food/plated_cookie_honey.png new file mode 100644 index 0000000..acc84f6 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_honey.png differ diff --git a/build/renders/lz/food/plated_cookie_honey1.png b/build/renders/lz/food/plated_cookie_honey1.png new file mode 100644 index 0000000..00582b3 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_honey1.png differ diff --git a/build/renders/lz/food/plated_cookie_honey2.png b/build/renders/lz/food/plated_cookie_honey2.png new file mode 100644 index 0000000..3e2d568 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_honey2.png differ diff --git a/build/renders/lz/food/plated_cookie_honey3.png b/build/renders/lz/food/plated_cookie_honey3.png new file mode 100644 index 0000000..a7f4456 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_honey3.png differ diff --git a/build/renders/lz/food/plated_cookie_honey4.png b/build/renders/lz/food/plated_cookie_honey4.png new file mode 100644 index 0000000..f7cdb00 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_honey4.png differ diff --git a/build/renders/lz/food/plated_cookie_sugar.png b/build/renders/lz/food/plated_cookie_sugar.png new file mode 100644 index 0000000..84e463e Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sugar.png differ diff --git a/build/renders/lz/food/plated_cookie_sugar1.png b/build/renders/lz/food/plated_cookie_sugar1.png new file mode 100644 index 0000000..946eedb Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sugar1.png differ diff --git a/build/renders/lz/food/plated_cookie_sugar2.png b/build/renders/lz/food/plated_cookie_sugar2.png new file mode 100644 index 0000000..86d586e Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sugar2.png differ diff --git a/build/renders/lz/food/plated_cookie_sugar3.png b/build/renders/lz/food/plated_cookie_sugar3.png new file mode 100644 index 0000000..41a8fa6 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sugar3.png differ diff --git a/build/renders/lz/food/plated_cookie_sugar4.png b/build/renders/lz/food/plated_cookie_sugar4.png new file mode 100644 index 0000000..e50bffa Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sugar4.png differ diff --git a/build/renders/lz/food/plated_cookie_sweet_berry.png b/build/renders/lz/food/plated_cookie_sweet_berry.png new file mode 100644 index 0000000..e6ce390 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sweet_berry.png differ diff --git a/build/renders/lz/food/plated_cookie_sweet_berry1.png b/build/renders/lz/food/plated_cookie_sweet_berry1.png new file mode 100644 index 0000000..7bc6488 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sweet_berry1.png differ diff --git a/build/renders/lz/food/plated_cookie_sweet_berry2.png b/build/renders/lz/food/plated_cookie_sweet_berry2.png new file mode 100644 index 0000000..b2e4a23 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sweet_berry2.png differ diff --git a/build/renders/lz/food/plated_cookie_sweet_berry3.png b/build/renders/lz/food/plated_cookie_sweet_berry3.png new file mode 100644 index 0000000..ffff521 Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sweet_berry3.png differ diff --git a/build/renders/lz/food/plated_cookie_sweet_berry4.png b/build/renders/lz/food/plated_cookie_sweet_berry4.png new file mode 100644 index 0000000..ec0a47e Binary files /dev/null and b/build/renders/lz/food/plated_cookie_sweet_berry4.png differ diff --git a/build/renders/lz/food/plated_glow_berry_sweet_roll.png b/build/renders/lz/food/plated_glow_berry_sweet_roll.png new file mode 100644 index 0000000..cc1ecec Binary files /dev/null and b/build/renders/lz/food/plated_glow_berry_sweet_roll.png differ diff --git a/build/renders/lz/food/plated_glow_berry_sweet_roll1.png b/build/renders/lz/food/plated_glow_berry_sweet_roll1.png new file mode 100644 index 0000000..4e83a02 Binary files /dev/null and b/build/renders/lz/food/plated_glow_berry_sweet_roll1.png differ diff --git a/build/renders/lz/food/plated_glow_berry_sweet_roll2.png b/build/renders/lz/food/plated_glow_berry_sweet_roll2.png new file mode 100644 index 0000000..33f3988 Binary files /dev/null and b/build/renders/lz/food/plated_glow_berry_sweet_roll2.png differ diff --git a/build/renders/lz/food/plated_glow_berry_sweet_roll3.png b/build/renders/lz/food/plated_glow_berry_sweet_roll3.png new file mode 100644 index 0000000..a830977 Binary files /dev/null and b/build/renders/lz/food/plated_glow_berry_sweet_roll3.png differ diff --git a/build/renders/lz/food/plated_glow_berry_sweet_roll4.png b/build/renders/lz/food/plated_glow_berry_sweet_roll4.png new file mode 100644 index 0000000..b96272a Binary files /dev/null and b/build/renders/lz/food/plated_glow_berry_sweet_roll4.png differ diff --git a/build/renders/lz/food/plated_honey_glazed_ham.png b/build/renders/lz/food/plated_honey_glazed_ham.png new file mode 100644 index 0000000..876f036 Binary files /dev/null and b/build/renders/lz/food/plated_honey_glazed_ham.png differ diff --git a/build/renders/lz/food/plated_honey_glazed_ham0.png b/build/renders/lz/food/plated_honey_glazed_ham0.png new file mode 100644 index 0000000..735c48d Binary files /dev/null and b/build/renders/lz/food/plated_honey_glazed_ham0.png differ diff --git a/build/renders/lz/food/plated_honey_glazed_ham1.png b/build/renders/lz/food/plated_honey_glazed_ham1.png new file mode 100644 index 0000000..6d8d70b Binary files /dev/null and b/build/renders/lz/food/plated_honey_glazed_ham1.png differ diff --git a/build/renders/lz/food/plated_honey_glazed_ham2.png b/build/renders/lz/food/plated_honey_glazed_ham2.png new file mode 100644 index 0000000..f9e2139 Binary files /dev/null and b/build/renders/lz/food/plated_honey_glazed_ham2.png differ diff --git a/build/renders/lz/food/plated_honey_glazed_ham3.png b/build/renders/lz/food/plated_honey_glazed_ham3.png new file mode 100644 index 0000000..072ef8c Binary files /dev/null and b/build/renders/lz/food/plated_honey_glazed_ham3.png differ diff --git a/build/renders/lz/food/plated_honey_glazed_ham4.png b/build/renders/lz/food/plated_honey_glazed_ham4.png new file mode 100644 index 0000000..d36fa0f Binary files /dev/null and b/build/renders/lz/food/plated_honey_glazed_ham4.png differ diff --git a/build/renders/lz/food/plated_kelp_roll.png b/build/renders/lz/food/plated_kelp_roll.png new file mode 100644 index 0000000..5226468 Binary files /dev/null and b/build/renders/lz/food/plated_kelp_roll.png differ diff --git a/build/renders/lz/food/plated_kelp_roll_1.png b/build/renders/lz/food/plated_kelp_roll_1.png new file mode 100644 index 0000000..181878d Binary files /dev/null and b/build/renders/lz/food/plated_kelp_roll_1.png differ diff --git a/build/renders/lz/food/plated_kelp_roll_2.png b/build/renders/lz/food/plated_kelp_roll_2.png new file mode 100644 index 0000000..2c712ff Binary files /dev/null and b/build/renders/lz/food/plated_kelp_roll_2.png differ diff --git a/build/renders/lz/food/plated_kelp_roll_3.png b/build/renders/lz/food/plated_kelp_roll_3.png new file mode 100644 index 0000000..49c900e Binary files /dev/null and b/build/renders/lz/food/plated_kelp_roll_3.png differ diff --git a/build/renders/lz/food/plated_melon_popsicle1.png b/build/renders/lz/food/plated_melon_popsicle1.png new file mode 100644 index 0000000..ddd8294 Binary files /dev/null and b/build/renders/lz/food/plated_melon_popsicle1.png differ diff --git a/build/renders/lz/food/plated_melon_popsicle2.png b/build/renders/lz/food/plated_melon_popsicle2.png new file mode 100644 index 0000000..251d7b3 Binary files /dev/null and b/build/renders/lz/food/plated_melon_popsicle2.png differ diff --git a/build/renders/lz/food/plated_roast_chicken.png b/build/renders/lz/food/plated_roast_chicken.png new file mode 100644 index 0000000..2688798 Binary files /dev/null and b/build/renders/lz/food/plated_roast_chicken.png differ diff --git a/build/renders/lz/food/plated_roast_chicken0.png b/build/renders/lz/food/plated_roast_chicken0.png new file mode 100644 index 0000000..9763153 Binary files /dev/null and b/build/renders/lz/food/plated_roast_chicken0.png differ diff --git a/build/renders/lz/food/plated_roast_chicken1.png b/build/renders/lz/food/plated_roast_chicken1.png new file mode 100644 index 0000000..4b4258b Binary files /dev/null and b/build/renders/lz/food/plated_roast_chicken1.png differ diff --git a/build/renders/lz/food/plated_roast_chicken2.png b/build/renders/lz/food/plated_roast_chicken2.png new file mode 100644 index 0000000..5f88f43 Binary files /dev/null and b/build/renders/lz/food/plated_roast_chicken2.png differ diff --git a/build/renders/lz/food/plated_roast_chicken3.png b/build/renders/lz/food/plated_roast_chicken3.png new file mode 100644 index 0000000..a68f270 Binary files /dev/null and b/build/renders/lz/food/plated_roast_chicken3.png differ diff --git a/build/renders/lz/food/plated_roast_chicken4.png b/build/renders/lz/food/plated_roast_chicken4.png new file mode 100644 index 0000000..b1915f4 Binary files /dev/null and b/build/renders/lz/food/plated_roast_chicken4.png differ diff --git a/build/renders/lz/food/plated_salmon_roll.png b/build/renders/lz/food/plated_salmon_roll.png new file mode 100644 index 0000000..73a7cd3 Binary files /dev/null and b/build/renders/lz/food/plated_salmon_roll.png differ diff --git a/build/renders/lz/food/plated_salmon_roll_1.png b/build/renders/lz/food/plated_salmon_roll_1.png new file mode 100644 index 0000000..2a449c1 Binary files /dev/null and b/build/renders/lz/food/plated_salmon_roll_1.png differ diff --git a/build/renders/lz/food/plated_salmon_roll_2.png b/build/renders/lz/food/plated_salmon_roll_2.png new file mode 100644 index 0000000..65ad900 Binary files /dev/null and b/build/renders/lz/food/plated_salmon_roll_2.png differ diff --git a/build/renders/lz/food/plated_salmon_roll_3.png b/build/renders/lz/food/plated_salmon_roll_3.png new file mode 100644 index 0000000..075754f Binary files /dev/null and b/build/renders/lz/food/plated_salmon_roll_3.png differ diff --git a/build/renders/lz/food/plated_salmon_roll_4.png b/build/renders/lz/food/plated_salmon_roll_4.png new file mode 100644 index 0000000..59817a1 Binary files /dev/null and b/build/renders/lz/food/plated_salmon_roll_4.png differ diff --git a/build/renders/lz/food/plated_salmon_roll_5.png b/build/renders/lz/food/plated_salmon_roll_5.png new file mode 100644 index 0000000..ad53eb2 Binary files /dev/null and b/build/renders/lz/food/plated_salmon_roll_5.png differ diff --git a/build/renders/lz/food/plated_salmon_roll_6.png b/build/renders/lz/food/plated_salmon_roll_6.png new file mode 100644 index 0000000..dbad22a Binary files /dev/null and b/build/renders/lz/food/plated_salmon_roll_6.png differ diff --git a/build/renders/lz/food/plated_sandwich_chicken1.png b/build/renders/lz/food/plated_sandwich_chicken1.png new file mode 100644 index 0000000..25c73b6 Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_chicken1.png differ diff --git a/build/renders/lz/food/plated_sandwich_chicken2.png b/build/renders/lz/food/plated_sandwich_chicken2.png new file mode 100644 index 0000000..5d106b0 Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_chicken2.png differ diff --git a/build/renders/lz/food/plated_sandwich_egg1.png b/build/renders/lz/food/plated_sandwich_egg1.png new file mode 100644 index 0000000..a824db1 Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_egg1.png differ diff --git a/build/renders/lz/food/plated_sandwich_egg2.png b/build/renders/lz/food/plated_sandwich_egg2.png new file mode 100644 index 0000000..0b61fe1 Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_egg2.png differ diff --git a/build/renders/lz/food/plated_sandwich_glow_berry.png b/build/renders/lz/food/plated_sandwich_glow_berry.png new file mode 100644 index 0000000..bc8ac6c Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_glow_berry.png differ diff --git a/build/renders/lz/food/plated_sandwich_glow_berry_dark.png b/build/renders/lz/food/plated_sandwich_glow_berry_dark.png new file mode 100644 index 0000000..6e4c809 Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_glow_berry_dark.png differ diff --git a/build/renders/lz/food/plated_sandwich_sweet_berry.png b/build/renders/lz/food/plated_sandwich_sweet_berry.png new file mode 100644 index 0000000..352abef Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_sweet_berry.png differ diff --git a/build/renders/lz/food/plated_sandwich_sweet_berry_dark.png b/build/renders/lz/food/plated_sandwich_sweet_berry_dark.png new file mode 100644 index 0000000..86d099e Binary files /dev/null and b/build/renders/lz/food/plated_sandwich_sweet_berry_dark.png differ diff --git a/build/renders/lz/food/soup_beetroot.png b/build/renders/lz/food/soup_beetroot.png new file mode 100644 index 0000000..6648307 Binary files /dev/null and b/build/renders/lz/food/soup_beetroot.png differ diff --git a/build/renders/lz/food/soup_bone_broth.png b/build/renders/lz/food/soup_bone_broth.png new file mode 100644 index 0000000..60ab0e6 Binary files /dev/null and b/build/renders/lz/food/soup_bone_broth.png differ diff --git a/build/renders/lz/food/soup_chicken.png b/build/renders/lz/food/soup_chicken.png new file mode 100644 index 0000000..d85fd47 Binary files /dev/null and b/build/renders/lz/food/soup_chicken.png differ diff --git a/build/renders/lz/food/soup_pumpkin.png b/build/renders/lz/food/soup_pumpkin.png new file mode 100644 index 0000000..cc54fe6 Binary files /dev/null and b/build/renders/lz/food/soup_pumpkin.png differ diff --git a/build/renders/lz/food/soup_vegetable.png b/build/renders/lz/food/soup_vegetable.png new file mode 100644 index 0000000..323e151 Binary files /dev/null and b/build/renders/lz/food/soup_vegetable.png differ diff --git a/build/renders/lz/food/stew_baked_cod.png b/build/renders/lz/food/stew_baked_cod.png new file mode 100644 index 0000000..66884f6 Binary files /dev/null and b/build/renders/lz/food/stew_baked_cod.png differ diff --git a/build/renders/lz/food/stew_beef.png b/build/renders/lz/food/stew_beef.png new file mode 100644 index 0000000..34a9fe3 Binary files /dev/null and b/build/renders/lz/food/stew_beef.png differ diff --git a/build/renders/lz/food/stew_fish.png b/build/renders/lz/food/stew_fish.png new file mode 100644 index 0000000..75ef6db Binary files /dev/null and b/build/renders/lz/food/stew_fish.png differ diff --git a/build/renders/lz/food/stew_mushroom.png b/build/renders/lz/food/stew_mushroom.png new file mode 100644 index 0000000..a3fb1d6 Binary files /dev/null and b/build/renders/lz/food/stew_mushroom.png differ diff --git a/build/renders/lz/food/stew_rabbit.png b/build/renders/lz/food/stew_rabbit.png new file mode 100644 index 0000000..8f9721a Binary files /dev/null and b/build/renders/lz/food/stew_rabbit.png differ diff --git a/build/renders/lz/items/candle_stand.png b/build/renders/lz/items/candle_stand.png new file mode 100644 index 0000000..7f379d5 Binary files /dev/null and b/build/renders/lz/items/candle_stand.png differ diff --git a/build/scripts/__pycache__/build_readme_impl.cpython-313.pyc b/build/scripts/__pycache__/build_readme_impl.cpython-313.pyc new file mode 100644 index 0000000..64e51ca Binary files /dev/null and b/build/scripts/__pycache__/build_readme_impl.cpython-313.pyc differ diff --git a/build/scripts/__pycache__/render_models.cpython-313.pyc b/build/scripts/__pycache__/render_models.cpython-313.pyc new file mode 100644 index 0000000..459f237 Binary files /dev/null and b/build/scripts/__pycache__/render_models.cpython-313.pyc differ diff --git a/build/scripts/build_readme.py b/build/scripts/build_readme.py new file mode 100644 index 0000000..baa5184 --- /dev/null +++ b/build/scripts/build_readme.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +from build_readme_impl import main + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/build/scripts/build_readme_impl.py b/build/scripts/build_readme_impl.py new file mode 100644 index 0000000..24f4160 --- /dev/null +++ b/build/scripts/build_readme_impl.py @@ -0,0 +1,436 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import html +import json +import shutil +from pathlib import Path +from typing import Any + + +def load_json(path: Path) -> Any: + with path.open("r", encoding="utf-8") as handle: + return json.load(handle) + + +def iter_custom_name_selects(node: Any) -> list[dict[str, Any]]: + selects: list[dict[str, Any]] = [] + + if isinstance(node, dict): + if node.get("type") == "select" and node.get("component") == "minecraft:custom_name": + selects.append(node) + + for value in node.values(): + selects.extend(iter_custom_name_selects(value)) + elif isinstance(node, list): + for value in node: + selects.extend(iter_custom_name_selects(value)) + + return selects + + +def resolve_model_ref(model_node: Any) -> str | None: + if not isinstance(model_node, dict): + return None + + model_ref = model_node.get("model") + if isinstance(model_ref, str): + return model_ref + + return None + + +def namespace_and_path(model_ref: str) -> tuple[str, str] | None: + if ":" not in model_ref: + return None + + namespace, path = model_ref.split(":", 1) + return namespace, path + + +def item_name_from_fallback(fallback_model: str) -> str | None: + prefix = "minecraft:item/" + if fallback_model.startswith(prefix): + return fallback_model[len(prefix) :] + + return None + + +def render_path_for_model(model_ref: str) -> Path | None: + resolved = namespace_and_path(model_ref) + if resolved is None: + return None + + namespace, path = resolved + if namespace == "minecraft" and path.startswith("item/"): + return None + + return Path("renders") / namespace / Path(path).with_suffix(".png") + + +def collect_renameable_items(pack_root: Path) -> list[dict[str, Any]]: + item_files = sorted(pack_root.glob("assets/*/items/*.json")) + records: list[dict[str, Any]] = [] + + for item_file in item_files: + try: + data = load_json(item_file) + except json.JSONDecodeError: + continue + + selects = iter_custom_name_selects(data) + if not selects: + continue + + for select_node in selects: + fallback_ref = resolve_model_ref(select_node.get("fallback")) + if fallback_ref is None: + continue + + item_name = item_name_from_fallback(fallback_ref) + if item_name is None: + continue + + cases: list[dict[str, Any]] = [] + for case in select_node.get("cases", []): + if not isinstance(case, dict): + continue + + case_model_ref = resolve_model_ref(case.get("model")) + if case_model_ref is None: + continue + + case_render_path = render_path_for_model(case_model_ref) + cases.append( + { + "when": str(case.get("when", "")), + "model": case_model_ref, + "render_path": case_render_path.as_posix() if case_render_path else None, + } + ) + + cases.sort(key=lambda case: case["when"]) + + base_render_path = render_path_for_model(fallback_ref) + records.append( + { + "item": item_name, + "fallback_model": fallback_ref, + "source_file": item_file.relative_to(pack_root).as_posix(), + "render_path": base_render_path.as_posix() if base_render_path else None, + "cases": cases, + } + ) + + records.sort(key=lambda record: (record["item"], record["source_file"])) + return records + + +def copy_existing_renders(pack_root: Path, output_dir: Path) -> None: + source_renders = pack_root / "renders" + if not source_renders.exists(): + return + + for source_file in source_renders.rglob("*.png"): + relative_path = source_file.relative_to(source_renders) + destination = output_dir / "renders" / relative_path + destination.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(source_file, destination) + + +def build_markdown(records: list[dict[str, Any]]) -> str: + total_cases = sum(len(record["cases"]) for record in records) + lines: list[str] = [] + + lines.append("# Renameable Item Catalog") + lines.append("") + lines.append("Generated from the resource pack item model JSON.") + lines.append("") + lines.append("## Summary") + lines.append("") + lines.append(f"- Base items: {len(records)}") + lines.append(f"- Rename variants: {total_cases}") + lines.append("- Render mode: pluggable") + lines.append("") + lines.append("Sections are sorted by the item they are generated from.") + + for record in records: + lines.append(f"## {record['item']}") + lines.append("") + lines.append(f"- Generated from: `{record['source_file']}`") + lines.append(f"- Fallback model: `{record['fallback_model']}`") + if record["render_path"]: + lines.append(f"- Base render: `{record['render_path']}`") + lines.append(f" - Preview: \"{record['item']}\"") + else: + lines.append("- Base render: not present yet") + + lines.append("") + lines.append("### Rename variants") + lines.append("") + + if not record["cases"]: + lines.append("- None found") + lines.append("") + continue + + for case in record["cases"]: + if case["render_path"]: + render_line = f"`{case['render_path']}`" + lines.append(f"- `{case['when']}` -> `{case['model']}`") + lines.append(f" - Preview: \"{case['when']}\"") + continue + else: + render_line = "not present yet" + + lines.append(f"- `{case['when']}` -> `{case['model']}` ({render_line})") + + lines.append("") + + lines.append("---") + lines.append("") + lines.append("This file is generated. Add your renderer output under the matching `renders/` paths to populate image previews later.") + + return "\n".join(lines) + + +def build_readme(records: list[dict[str, Any]]) -> str: + total_cases = sum(len(record["cases"]) for record in records) + lines: list[str] = [] + + lines.append("# Renameable Item Catalog") + lines.append("") + lines.append("Generated from the resource pack item model JSON.") + lines.append("") + lines.append("## Summary") + lines.append("") + lines.append(f"- Base items: {len(records)}") + lines.append(f"- Rename variants: {total_cases}") + lines.append("- Full catalog: [build/renameable-items.md](build/renameable-items.md)") + lines.append("") + lines.append("## Item Index") + lines.append("") + + for record in records: + lines.append(f"- [{record['item']}](build/renameable-items.md#{record['item']})") + + lines.append("") + lines.append("The linked catalog contains the generated item sections and rename variants.") + + return "\n".join(lines) + + +def build_html(records: list[dict[str, Any]]) -> str: + total_cases = sum(len(record["cases"]) for record in records) + cards: list[str] = [] + + for record in records: + preview_items: list[str] = [] + for case in record["cases"]: + render_path = case["render_path"] + if render_path: + preview = f'{html.escape(case[' + else: + preview = '
render pending
' + + preview_items.append( + "
" + f"
{preview}
" + f"
{html.escape(case['when'])}
" + f"
{html.escape(case['model'])}
" + "
" + ) + + render_path = record["render_path"] + if render_path: + hero = f'{html.escape(record[' + else: + hero = '
no base render
' + + cards.append( + "
" + f"
{hero}
" + "
" + f"

{html.escape(record['item'])}

" + f"

{html.escape(record['source_file'])}

" + f"

Fallback model: {html.escape(record['fallback_model'])}

" + f"
{''.join(preview_items)}
" + "
" + "
" + ) + + template = f""" + + + + + Minecraft Renameable Items + + + +
+
+

Minecraft resource pack browser

+

Renameable item catalog

+

This readme is generated from the pack model JSON. It lists every item that changes by custom name, and it is ready to consume rendered PNGs once a renderer job writes them into the output tree.

+
+
Base items{len(records)}
+
Rename variants{total_cases}
+
Render modepluggable
+
+
+
+ {''.join(cards)} +
+ +
+ +""" + + return template + + +def main() -> int: + parser = argparse.ArgumentParser(description="Build the renameable-item readme from a Minecraft resource pack.") + parser.add_argument("--pack-root", default="resourcepack", help="Path to the resource pack root") + parser.add_argument("--output-dir", default="site/dist", help="Directory for generated site files") + parser.add_argument("--readme-path", default="README.md", help="Path to the generated README file") + parser.add_argument("--copy-renders", action="store_true", help="Copy pre-rendered PNGs from /renders into the output") + args = parser.parse_args() + + pack_root = Path(args.pack_root).resolve() + output_dir = Path(args.output_dir).resolve() + output_dir.mkdir(parents=True, exist_ok=True) + + records = collect_renameable_items(pack_root) + + manifest_path = output_dir / "renameable-items.json" + manifest_path.write_text(json.dumps(records, indent=2), encoding="utf-8") + + readme_path = Path(args.readme_path).resolve() + readme_path.write_text(build_readme(records), encoding="utf-8") + + catalog_path = output_dir / "renameable-items.md" + catalog_path.write_text(build_markdown(records), encoding="utf-8") + + if args.copy_renders: + copy_existing_renders(pack_root, output_dir) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/build/scripts/publish_resourcepack_release.py b/build/scripts/publish_resourcepack_release.py new file mode 100644 index 0000000..4be26c2 --- /dev/null +++ b/build/scripts/publish_resourcepack_release.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +import os +import urllib.error +import urllib.parse +import urllib.request +import zipfile +from pathlib import Path + + +def zip_resourcepack(resourcepack_root: Path, archive_path: Path) -> None: + archive_path.parent.mkdir(parents=True, exist_ok=True) + + with zipfile.ZipFile(archive_path, mode="w", compression=zipfile.ZIP_DEFLATED) as archive: + for source_file in sorted(resourcepack_root.rglob("*")): + if source_file.is_dir(): + continue + + relative_path = source_file.relative_to(resourcepack_root).as_posix() + archive.write(source_file, relative_path) + + +def request_json(request: urllib.request.Request) -> dict[str, object]: + with urllib.request.urlopen(request) as response: + return json.load(response) + + +def create_release(api_base: str, repository: str, token: str, tag: str, name: str, body: str) -> dict[str, object]: + payload = json.dumps( + { + "tag_name": tag, + "name": name, + "body": body, + "draft": False, + "prerelease": False, + } + ).encode("utf-8") + + request = urllib.request.Request( + f"{api_base}/repos/{repository}/releases", + data=payload, + method="POST", + headers={ + "Authorization": f"token {token}", + "Content-Type": "application/json", + "Accept": "application/json", + }, + ) + return request_json(request) + + +def upload_asset(api_base: str, repository: str, token: str, release_id: int, archive_path: Path, asset_name: str) -> dict[str, object]: + with archive_path.open("rb") as handle: + payload = handle.read() + + query = urllib.parse.urlencode({"name": asset_name}) + request = urllib.request.Request( + f"{api_base}/repos/{repository}/releases/{release_id}/assets?{query}", + data=payload, + method="POST", + headers={ + "Authorization": f"token {token}", + "Content-Type": "application/zip", + "Accept": "application/json", + }, + ) + return request_json(request) + + +def main() -> int: + parser = argparse.ArgumentParser(description="Package the resource pack and publish it as a Gitea release asset.") + parser.add_argument("--resourcepack-root", default="resourcepack", help="Path to the resource pack root") + parser.add_argument("--archive-path", default="build/resourcepack.zip", help="Path to the generated zip archive") + parser.add_argument("--tag", required=True, help="Release tag to publish") + parser.add_argument("--name", default=None, help="Release name to publish") + parser.add_argument("--body", default=None, help="Release notes/body text") + args = parser.parse_args() + + token = os.environ.get("RELEASE_TOKEN") or os.environ.get("GITEA_TOKEN") or os.environ.get("GITHUB_TOKEN") + server_url = os.environ.get("GITEA_SERVER_URL") or os.environ.get("GITHUB_SERVER_URL") + repository = os.environ.get("GITEA_REPOSITORY") or os.environ.get("GITHUB_REPOSITORY") + + if not token: + raise SystemExit("RELEASE_TOKEN is required") + if not server_url: + raise SystemExit("GITEA_SERVER_URL or GITHUB_SERVER_URL is required") + if not repository: + raise SystemExit("GITEA_REPOSITORY or GITHUB_REPOSITORY is required") + + api_base = server_url.rstrip("/") + "/api/v1" + resourcepack_root = Path(args.resourcepack_root).resolve() + archive_path = Path(args.archive_path).resolve() + release_name = args.name or args.tag + release_body = args.body or f"Automated resource pack release for {args.tag}." + asset_name = f"resourcepack-{args.tag}.zip" + + zip_resourcepack(resourcepack_root, archive_path) + release = create_release(api_base, repository, token, args.tag, release_name, release_body) + + release_id = release.get("id") + if not isinstance(release_id, int): + raise SystemExit("Release creation did not return a numeric release id") + + upload_asset(api_base, repository, token, release_id, archive_path, asset_name) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/build/scripts/render_client_items.py b/build/scripts/render_client_items.py new file mode 100644 index 0000000..dfb8256 --- /dev/null +++ b/build/scripts/render_client_items.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import os +import subprocess +import sys +from pathlib import Path + + +def main() -> int: + parser = argparse.ArgumentParser(description="Render renameable item previews with the Minecraft client.") + parser.add_argument("--manifest", default="build/renameable-items.json", help="Path to the generated manifest") + parser.add_argument("--pack-root", default="resourcepack", help="Path to the resource pack root") + parser.add_argument("--output-dir", default="build", help="Directory where renders should be written") + args = parser.parse_args() + + repo_root = Path(__file__).resolve().parents[2] + client_renderer = repo_root / "build" / "client-renderer" + + env = os.environ.copy() + env["RENDER_MANIFEST"] = str((repo_root / args.manifest).resolve()) + env["RENDER_OUTPUT_DIR"] = str((repo_root / args.output_dir).resolve()) + env["RENDER_PACK_ROOT"] = str((repo_root / args.pack_root).resolve()) + + command = ["gradle", "-p", str(client_renderer), "runClient", "--no-daemon"] + + try: + completed = subprocess.run(command, cwd=repo_root, env=env) + except FileNotFoundError: + fallback = [ + sys.executable, + str(Path(__file__).resolve().with_name("render_models.py")), + "--manifest", + str((repo_root / args.manifest).resolve()), + "--pack-root", + str((repo_root / args.pack_root).resolve()), + "--output-dir", + str((repo_root / args.output_dir).resolve()), + ] + completed = subprocess.run(fallback, cwd=repo_root, env=env) + + return completed.returncode + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/build/scripts/render_models.py b/build/scripts/render_models.py new file mode 100644 index 0000000..8e306cf --- /dev/null +++ b/build/scripts/render_models.py @@ -0,0 +1,494 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +import math +import hashlib +import shutil +from functools import lru_cache +from pathlib import Path +from typing import Any + +from PIL import Image, ImageChops, ImageDraw, ImageFilter, ImageOps + + +def load_json(path: Path) -> Any: + with path.open("r", encoding="utf-8") as handle: + return json.load(handle) + + +def normalize_model_ref(model_ref: str) -> str: + if ":" in model_ref: + return model_ref + return f"minecraft:{model_ref}" + + +def model_ref_to_path(pack_root: Path, model_ref: str) -> Path: + namespace, path = normalize_model_ref(model_ref).split(":", 1) + return pack_root / "assets" / namespace / "models" / f"{path}.json" + + +def texture_ref_to_path(pack_root: Path, texture_ref: str) -> Path: + namespace, path = normalize_model_ref(texture_ref).split(":", 1) + return pack_root / "assets" / namespace / "textures" / f"{path}.png" + + +def resolve_texture_value(model: dict[str, Any], texture_ref: str, seen: set[str] | None = None) -> str | None: + if seen is None: + seen = set() + + value = texture_ref + while value.startswith("#"): + slot = value[1:] + if slot in seen: + return None + seen.add(slot) + textures = model.get("textures", {}) + value = textures.get(slot) + if not isinstance(value, str): + return None + + return normalize_model_ref(value) + + +def load_image_or_placeholder(pack_root: Path, texture_ref: str | None, size: tuple[int, int]) -> Image.Image: + if texture_ref is None: + return placeholder_texture("missing", size) + + texture_path = texture_ref_to_path(pack_root, texture_ref) + if texture_path.exists(): + return Image.open(texture_path).convert("RGBA") + + return placeholder_texture(texture_ref, size) + + +def placeholder_texture(key: str, size: tuple[int, int]) -> Image.Image: + width, height = size + digest = hashlib.sha1(key.encode("utf-8")).digest() + base = (digest[0], digest[1], digest[2], 255) + dark = tuple(max(0, channel - 42) for channel in base[:3]) + (255,) + image = Image.new("RGBA", size, base) + draw = ImageDraw.Draw(image) + step = max(2, min(width, height) // 4) + for y in range(0, height, step): + for x in range(0, width, step): + if (x // step + y // step) % 2 == 0: + draw.rectangle((x, y, x + step - 1, y + step - 1), fill=dark) + image = image.resize(size, Image.Resampling.NEAREST) + return image + + +def merge_model(pack_root: Path, model_ref: str, cache: dict[str, dict[str, Any]], stack: set[str] | None = None) -> dict[str, Any] | None: + model_ref = normalize_model_ref(model_ref) + if model_ref in cache: + return cache[model_ref] + + if stack is None: + stack = set() + if model_ref in stack: + return None + stack.add(model_ref) + + model_path = model_ref_to_path(pack_root, model_ref) + if not model_path.exists(): + return None + + data = load_json(model_path) + parent_ref = data.get("parent") + parent_model = None + if isinstance(parent_ref, str): + parent_model = merge_model(pack_root, parent_ref, cache, stack) + + merged: dict[str, Any] = {} + if parent_model: + merged.update(parent_model) + + textures = dict(merged.get("textures", {})) + textures.update(data.get("textures", {})) + merged["textures"] = textures + + if "elements" in data: + merged["elements"] = data["elements"] + elif parent_model and "elements" in parent_model: + merged["elements"] = parent_model["elements"] + else: + merged["elements"] = [] + + if "texture_size" in data: + merged["texture_size"] = data["texture_size"] + elif parent_model and "texture_size" in parent_model: + merged["texture_size"] = parent_model["texture_size"] + else: + merged["texture_size"] = [16, 16] + + cache[model_ref] = merged + return merged + + +def rotate_point(point: tuple[float, float, float], rotation: dict[str, Any] | None) -> tuple[float, float, float]: + if not rotation: + return point + + angle = math.radians(float(rotation.get("angle", 0))) + axis = rotation.get("axis") + origin = rotation.get("origin", [0, 0, 0]) + ox, oy, oz = (float(origin[0]), float(origin[1]), float(origin[2])) + x, y, z = point + x -= ox + y -= oy + z -= oz + + sin_a = math.sin(angle) + cos_a = math.cos(angle) + + if axis == "x": + y, z = y * cos_a - z * sin_a, y * sin_a + z * cos_a + elif axis == "y": + x, z = x * cos_a + z * sin_a, -x * sin_a + z * cos_a + elif axis == "z": + x, y = x * cos_a - y * sin_a, x * sin_a + y * cos_a + + return x + ox, y + oy, z + oz + + +def apply_element_rotation(point: tuple[float, float, float], element: dict[str, Any]) -> tuple[float, float, float]: + return rotate_point(point, element.get("rotation")) + + +def apply_display_transform(point: tuple[float, float, float], display: dict[str, Any] | None) -> tuple[float, float, float]: + if not display: + return point + + x, y, z = point + center_x, center_y, center_z = 8.0, 8.0, 8.0 + x -= center_x + y -= center_y + z -= center_z + + scale = display.get("scale", [1, 1, 1]) + x *= float(scale[0]) + y *= float(scale[1]) + z *= float(scale[2]) + + x, y, z = rotate_point((x, y, z), {"angle": float(display.get("rotation", [0, 0, 0])[0]), "axis": "x", "origin": [0, 0, 0]}) + x, y, z = rotate_point((x, y, z), {"angle": float(display.get("rotation", [0, 0, 0])[1]), "axis": "y", "origin": [0, 0, 0]}) + x, y, z = rotate_point((x, y, z), {"angle": float(display.get("rotation", [0, 0, 0])[2]), "axis": "z", "origin": [0, 0, 0]}) + + translation = display.get("translation", [0, 0, 0]) + x += float(translation[0]) / 16.0 + y += float(translation[1]) / 16.0 + z += float(translation[2]) / 16.0 + + return x + center_x, y + center_y, z + center_z + + +def element_corners(element: dict[str, Any]) -> list[tuple[float, float, float]]: + from_x, from_y, from_z = element["from"] + to_x, to_y, to_z = element["to"] + base = [ + (from_x, from_y, from_z), + (to_x, from_y, from_z), + (to_x, to_y, from_z), + (from_x, to_y, from_z), + (from_x, from_y, to_z), + (to_x, from_y, to_z), + (to_x, to_y, to_z), + (from_x, to_y, to_z), + ] + return [apply_element_rotation(point, element) for point in base] + + +def project_point(point: tuple[float, float, float], scale: float, offset_x: float, offset_y: float) -> tuple[float, float, float]: + x, y, z = point + yaw = math.radians(45) + pitch = math.radians(35.26438968) + + x1 = x * math.cos(yaw) + z * math.sin(yaw) + z1 = -x * math.sin(yaw) + z * math.cos(yaw) + y1 = y * math.cos(pitch) - z1 * math.sin(pitch) + z2 = y * math.sin(pitch) + z1 * math.cos(pitch) + return offset_x + x1 * scale, offset_y - y1 * scale, z2 + + +def face_vertices(corners: list[tuple[float, float, float]], face_name: str) -> list[tuple[float, float, float]]: + if face_name == "north": + return [corners[0], corners[1], corners[2], corners[3]] + if face_name == "south": + return [corners[5], corners[4], corners[7], corners[6]] + if face_name == "west": + return [corners[4], corners[0], corners[3], corners[7]] + if face_name == "east": + return [corners[1], corners[5], corners[6], corners[2]] + if face_name == "up": + return [corners[3], corners[2], corners[6], corners[7]] + if face_name == "down": + return [corners[4], corners[5], corners[1], corners[0]] + return [] + + +def sort_face_key(vertices: list[tuple[float, float, float]]) -> float: + return sum(point[2] for point in vertices) / len(vertices) + + +def face_normal(vertices: list[tuple[float, float, float]]) -> tuple[float, float, float]: + p0, p1, p2 = vertices[0], vertices[1], vertices[2] + ux, uy, uz = p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2] + vx, vy, vz = p2[0] - p0[0], p2[1] - p0[1], p2[2] - p0[2] + return ( + uy * vz - uz * vy, + uz * vx - ux * vz, + ux * vy - uy * vx, + ) + + +def normalize_vector(vector: tuple[float, float, float]) -> tuple[float, float, float]: + length = math.sqrt(vector[0] ** 2 + vector[1] ** 2 + vector[2] ** 2) + if length == 0: + return (0.0, 0.0, 0.0) + return (vector[0] / length, vector[1] / length, vector[2] / length) + + +def resolve_face_texture(pack_root: Path, model: dict[str, Any], face: dict[str, Any]) -> Image.Image: + texture_ref = face.get("texture") + if not isinstance(texture_ref, str): + return placeholder_texture("missing-face", (16, 16)) + + resolved = resolve_texture_value(model, texture_ref) + if resolved is None: + return placeholder_texture(texture_ref, (16, 16)) + + texture_path = texture_ref_to_path(pack_root, resolved) + texture_size = model.get("texture_size", [16, 16]) + if texture_path.exists(): + texture_image = Image.open(texture_path).convert("RGBA") + else: + texture_image = placeholder_texture(resolved, (int(texture_size[0]), int(texture_size[1]))) + + u1, v1, u2, v2 = face.get("uv", [0, 0, texture_image.width, texture_image.height]) + source_width, source_height = texture_image.size + texture_size_x, texture_size_y = texture_size + scale_x = source_width / float(texture_size_x or source_width) + scale_y = source_height / float(texture_size_y or source_height) + + left = float(min(u1, u2) * scale_x) + right = float(max(u1, u2) * scale_x) + top = float(min(v1, v2) * scale_y) + bottom = float(max(v1, v2) * scale_y) + + crop_width = max(1, int(math.ceil(abs(right - left)))) + crop_height = max(1, int(math.ceil(abs(bottom - top)))) + crop = texture_image.transform( + (crop_width, crop_height), + Image.Transform.EXTENT, + (left, top, right, bottom), + resample=Image.Resampling.NEAREST, + ) + if u2 < u1: + crop = crop.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + if v2 < v1: + crop = crop.transpose(Image.Transpose.FLIP_TOP_BOTTOM) + + rotation = int(face.get("rotation", 0) or 0) + if rotation: + crop = crop.rotate(rotation, expand=True, resample=Image.Resampling.NEAREST) + + return crop + + +def transform_face(texture: Image.Image, vertices: list[tuple[float, float, float]], canvas: Image.Image) -> tuple[Image.Image, tuple[int, int]] | None: + projected = [point[:2] for point in vertices] + xs = [point[0] for point in projected] + ys = [point[1] for point in projected] + min_x = math.floor(min(xs)) + min_y = math.floor(min(ys)) + max_x = math.ceil(max(xs)) + max_y = math.ceil(max(ys)) + width = max(1, max_x - min_x) + height = max(1, max_y - min_y) + + local = [(x - min_x, y - min_y) for x, y, _ in projected] + p0, p1, _, p3 = local + source_width, source_height = texture.size + edge_a_x = p1[0] - p0[0] + edge_a_y = p1[1] - p0[1] + edge_b_x = p3[0] - p0[0] + edge_b_y = p3[1] - p0[1] + det = edge_a_x * edge_b_y - edge_a_y * edge_b_x + if abs(det) < 1e-5: + return None + + a = source_width * edge_b_y / det + b = -source_width * edge_b_x / det + c = source_width * (edge_b_x * p0[1] - edge_b_y * p0[0]) / det + d = -source_height * edge_a_y / det + e = source_height * edge_a_x / det + f = source_height * (edge_a_y * p0[0] - edge_a_x * p0[1]) / det + + warped = texture.transform((width, height), Image.Transform.AFFINE, (a, b, c, d, e, f), resample=Image.Resampling.BICUBIC) + mask = Image.new("L", (width, height), 0) + ImageDraw.Draw(mask).polygon(local, fill=255) + + return warped.putalpha(mask), (min_x, min_y) + + +def render_model(pack_root: Path, model_ref: str, output_path: Path, cache: dict[str, dict[str, Any]]) -> None: + model = merge_model(pack_root, model_ref, cache) + output_path.parent.mkdir(parents=True, exist_ok=True) + + canvas_size = 256 + canvas = Image.new("RGBA", (canvas_size, canvas_size), (0, 0, 0, 0)) + + if not model or not model.get("elements"): + render_placeholder_icon(canvas, model_ref) + canvas.save(output_path) + return + + transformed_elements: list[tuple[list[tuple[float, float, float]], dict[str, Any], dict[str, Any]]] = [] + all_projected: list[tuple[float, float, float]] = [] + display = model.get("display", {}).get("gui") if isinstance(model.get("display"), dict) else None + + for element in model.get("elements", []): + corners = element_corners(element) + corners = [apply_display_transform(point, display) for point in corners] + for corner in corners: + all_projected.append(corner) + transformed_elements.append((corners, element, model)) + + projected_points = [project_point(point, 1.0, 0.0, 0.0) for point in all_projected] + xs = [point[0] for point in projected_points] + ys = [point[1] for point in projected_points] + width = max(xs) - min(xs) + height = max(ys) - min(ys) + if width <= 0 or height <= 0: + render_placeholder_icon(canvas, model_ref) + canvas.save(output_path) + return + + scale = min((canvas_size - 56) / width, (canvas_size - 56) / height) + bbox_xs: list[float] = [] + bbox_ys: list[float] = [] + for corner in all_projected: + x, y, _ = project_point(corner, scale, 0.0, 0.0) + bbox_xs.append(x) + bbox_ys.append(y) + + min_x = min(bbox_xs) + max_x = max(bbox_xs) + min_y = min(bbox_ys) + max_y = max(bbox_ys) + offset_x = (canvas_size - (max_x - min_x)) / 2 - min_x + offset_y = (canvas_size - (max_y - min_y)) / 2 - min_y + 6 + + shadow_width = int((max_x - min_x) * 0.75) + shadow_height = max(14, int((max_y - min_y) * 0.18)) + shadow = Image.new("RGBA", (canvas_size, canvas_size), (0, 0, 0, 0)) + shadow_box = ( + int((canvas_size - shadow_width) / 2), + int(canvas_size * 0.74), + int((canvas_size + shadow_width) / 2), + int(canvas_size * 0.74) + shadow_height, + ) + ImageDraw.Draw(shadow).ellipse(shadow_box, fill=(0, 0, 0, 80)) + shadow = shadow.filter(ImageFilter.GaussianBlur(8)) + canvas.alpha_composite(shadow) + + faces: list[tuple[float, list[tuple[float, float, float]], Image.Image]] = [] + camera_direction = normalize_vector((-1.0, -1.0, -1.0)) + for corners, element, model_data in transformed_elements: + for face_name, face in element.get("faces", {}).items(): + vertices = face_vertices(corners, face_name) + if not vertices: + continue + normal = face_normal(vertices) + if normal[0] * camera_direction[0] + normal[1] * camera_direction[1] + normal[2] * camera_direction[2] >= 0: + continue + projected = [project_point(point, scale, offset_x, offset_y) for point in vertices] + texture = resolve_face_texture(pack_root, model_data, face) + faces.append((sort_face_key(projected), projected, texture)) + + faces.sort(key=lambda item: item[0]) + for _, projected, texture in faces: + xs = [point[0] for point in projected] + ys = [point[1] for point in projected] + min_x = math.floor(min(xs)) + min_y = math.floor(min(ys)) + max_x = math.ceil(max(xs)) + max_y = math.ceil(max(ys)) + width = max(1, max_x - min_x) + height = max(1, max_y - min_y) + local = [(x - min_x, y - min_y) for x, y, _ in projected] + p0, p1, _, p3 = local + edge_a_x = p1[0] - p0[0] + edge_a_y = p1[1] - p0[1] + edge_b_x = p3[0] - p0[0] + edge_b_y = p3[1] - p0[1] + det = edge_a_x * edge_b_y - edge_a_y * edge_b_x + if abs(det) < 1e-5: + continue + + source_width, source_height = texture.size + a = source_width * edge_b_y / det + b = -source_width * edge_b_x / det + c = source_width * (edge_b_x * p0[1] - edge_b_y * p0[0]) / det + d = -source_height * edge_a_y / det + e = source_height * edge_a_x / det + f = source_height * (edge_a_y * p0[0] - edge_a_x * p0[1]) / det + warped = texture.transform((width, height), Image.Transform.AFFINE, (a, b, c, d, e, f), resample=Image.Resampling.NEAREST) + mask = Image.new("L", (width, height), 0) + ImageDraw.Draw(mask).polygon(local, fill=255) + warped.putalpha(mask) + canvas.alpha_composite(warped, (min_x, min_y)) + + canvas.save(output_path) + + +def render_placeholder_icon(canvas: Image.Image, model_ref: str) -> None: + draw = ImageDraw.Draw(canvas) + base_box = (70, 76, 186, 178) + top_box = (82, 52, 174, 104) + side_box = (174, 64, 198, 174) + draw.rounded_rectangle(base_box, radius=14, fill=(120, 126, 134, 255), outline=(220, 226, 232, 70), width=2) + draw.polygon([(82, 52), (174, 52), (186, 76), (70, 76)], fill=(170, 176, 184, 255)) + draw.polygon([(174, 52), (186, 76), (186, 178), (174, 174)], fill=(94, 100, 108, 255)) + draw.line((92, 98, 162, 150), fill=(255, 255, 255, 90), width=6) + draw.line((92, 150, 162, 98), fill=(255, 255, 255, 90), width=6) + + +def unique_model_refs(records: list[dict[str, Any]]) -> list[str]: + refs: set[str] = set() + for record in records: + for case in record.get("cases", []): + refs.add(case["model"]) + return sorted(refs) + + +def main() -> int: + parser = argparse.ArgumentParser(description="Render 3D-ish PNG previews from resource pack model JSON.") + parser.add_argument("--manifest", default="build/renameable-items.json", help="Path to the generated manifest") + parser.add_argument("--pack-root", default="resourcepack", help="Path to the resource pack root") + parser.add_argument("--output-dir", default="build", help="Directory where renders should be written") + args = parser.parse_args() + + manifest_path = Path(args.manifest).resolve() + pack_root = Path(args.pack_root).resolve() + output_dir = Path(args.output_dir).resolve() + + records = load_json(manifest_path) + refs = unique_model_refs(records) + cache: dict[str, dict[str, Any]] = {} + + renders_root = output_dir / "renders" + if renders_root.exists(): + shutil.rmtree(renders_root) + + for model_ref in refs: + namespace, relative_path = normalize_model_ref(model_ref).split(":", 1) + output_path = output_dir / "renders" / namespace / Path(relative_path).with_suffix(".png") + render_model(pack_root, model_ref, output_path, cache) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/build/scripts/resolve_latest_minecraft_release.py b/build/scripts/resolve_latest_minecraft_release.py new file mode 100644 index 0000000..6b4dcbd --- /dev/null +++ b/build/scripts/resolve_latest_minecraft_release.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +from urllib.request import urlopen + + +VERSION_MANIFEST_URL = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json" + + +def main() -> int: + with urlopen(VERSION_MANIFEST_URL, timeout=30) as response: + manifest = json.load(response) + + latest_release = manifest["latest"]["release"] + latest_snapshot = manifest["latest"]["snapshot"] + + print(latest_release) + print(f"snapshot={latest_snapshot}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file