From f7c937f6288caecf69b568e89575b2b6ff48f949 Mon Sep 17 00:00:00 2001 From: Blake Rain Date: Mon, 4 Dec 2023 14:00:47 +0000 Subject: [PATCH 1/6] Add generation of recipe table --- tools/generate-insolator-recipes.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/generate-insolator-recipes.py b/tools/generate-insolator-recipes.py index f782b97..0054316 100644 --- a/tools/generate-insolator-recipes.py +++ b/tools/generate-insolator-recipes.py @@ -89,3 +89,7 @@ for item in ITEMS: }, "output": { "item": item, "count": 2 } }, indent=2)) + +with open("insolator-recipes.md", "w") as fp: + for item in ITEMS: + fp.write(f"| [{item}] | 500 | 16,000 | 500 | 25 |\n") -- 2.45.2 From 697d727f51b3b9b399e9cbceae46e268f2706c7f Mon Sep 17 00:00:00 2001 From: Blake Rain Date: Mon, 4 Dec 2023 15:09:28 +0000 Subject: [PATCH 2/6] feat: add support for controlling ticks in Insolator recipes --- .../block/entity/InsolatorBlockEntity.java | 92 ++++++++++--------- .../peripheral/InsolatorPeripheral.java | 3 +- .../utamacraft/recipe/InsolatorRecipe.java | 15 ++- .../utamacraft/screen/InsolatorScreen.java | 9 +- .../insolator_minecraft_acacia_leaves.json | 3 +- .../insolator_minecraft_acacia_sapling.json | 3 +- .../recipes/insolator_minecraft_allium.json | 1 + .../recipes/insolator_minecraft_azalea.json | 1 + .../insolator_minecraft_azalea_leaves.json | 3 +- .../insolator_minecraft_azure_bluet.json | 1 + .../recipes/insolator_minecraft_bamboo.json | 1 + .../insolator_minecraft_beetroot_seeds.json | 1 + .../insolator_minecraft_big_dripleaf.json | 1 + .../insolator_minecraft_birch_leaves.json | 3 +- .../insolator_minecraft_birch_sapling.json | 3 +- .../insolator_minecraft_blue_orchid.json | 1 + .../insolator_minecraft_brown_mushroom.json | 1 + .../recipes/insolator_minecraft_cactus.json | 1 + .../insolator_minecraft_chorus_flower.json | 1 + .../insolator_minecraft_cornflower.json | 1 + .../insolator_minecraft_crimson_fungus.json | 1 + .../insolator_minecraft_crimson_roots.json | 1 + .../insolator_minecraft_dandelion.json | 1 + .../insolator_minecraft_dark_oak_leaves.json | 3 +- .../insolator_minecraft_dark_oak_sapling.json | 3 +- .../recipes/insolator_minecraft_fern.json | 1 + .../insolator_minecraft_flowering_azalea.json | 1 + ...tor_minecraft_flowering_azalea_leaves.json | 3 +- .../insolator_minecraft_glow_lichen.json | 1 + .../recipes/insolator_minecraft_grass.json | 1 + .../insolator_minecraft_hanging_roots.json | 1 + .../insolator_minecraft_jungle_leaves.json | 3 +- .../insolator_minecraft_jungle_sapling.json | 3 +- .../recipes/insolator_minecraft_kelp.json | 1 + .../insolator_minecraft_large_fern.json | 1 + .../recipes/insolator_minecraft_lilac.json | 1 + ...nsolator_minecraft_lily_of_the_valley.json | 1 + .../insolator_minecraft_mangrove_leaves.json | 3 +- .../recipes/insolator_minecraft_melon.json | 1 + .../insolator_minecraft_moss_block.json | 1 + .../insolator_minecraft_moss_carpet.json | 1 + .../insolator_minecraft_nether_sprouts.json | 1 + .../insolator_minecraft_nether_wart.json | 1 + .../insolator_minecraft_oak_leaves.json | 3 +- .../insolator_minecraft_oak_sapling.json | 3 +- .../insolator_minecraft_orange_tulip.json | 1 + .../insolator_minecraft_oxeye_daisy.json | 1 + .../recipes/insolator_minecraft_peony.json | 1 + .../insolator_minecraft_pink_tulip.json | 1 + .../recipes/insolator_minecraft_poppy.json | 1 + .../recipes/insolator_minecraft_potato.json | 1 + .../recipes/insolator_minecraft_pumpkin.json | 1 + .../insolator_minecraft_red_mushroom.json | 1 + .../insolator_minecraft_red_tulip.json | 1 + .../insolator_minecraft_rose_bush.json | 1 + .../insolator_minecraft_sea_pickle.json | 1 + .../recipes/insolator_minecraft_seagrass.json | 1 + .../insolator_minecraft_small_dripleaf.json | 1 + .../insolator_minecraft_spore_blossom.json | 1 + .../insolator_minecraft_spruce_leaves.json | 3 +- .../insolator_minecraft_spruce_sapling.json | 3 +- .../insolator_minecraft_sugar_cane.json | 1 + .../insolator_minecraft_sunflower.json | 1 + .../insolator_minecraft_tall_grass.json | 1 + .../insolator_minecraft_twisting_vines.json | 1 + .../recipes/insolator_minecraft_vine.json | 1 + .../insolator_minecraft_warped_fungus.json | 1 + .../insolator_minecraft_warped_roots.json | 1 + .../insolator_minecraft_weeping_vines.json | 1 + .../insolator_minecraft_wheat_seeds.json | 1 + .../insolator_minecraft_white_tulip.json | 1 + .../insolator_minecraft_wither_rose.json | 1 + tools/generate-insolator-recipes.py | 18 +++- 73 files changed, 168 insertions(+), 67 deletions(-) diff --git a/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java b/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java index f4350b4..9536c31 100644 --- a/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java +++ b/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java @@ -37,7 +37,6 @@ import java.util.Optional; public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { public static final int ENERGY_REQUIRED = 32; - public static final int MAX_PROGRESS = 500; private final ItemStackHandler inventory = new ItemStackHandler(3) { @Override @@ -83,6 +82,7 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { private final LazyOptional fluidOptional = LazyOptional.of(() -> fluid); private int progress = 0; + private int ticks = 0; private boolean active = false; public InsolatorBlockEntity(BlockPos pPos, BlockState pBlockState) { @@ -132,6 +132,7 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { nbt.put("fluid", fluid.writeToNBT(new CompoundTag())); nbt.put("energy", energy.serializeNBT()); nbt.putInt("progress", progress); + nbt.putInt("ticks", ticks); nbt.putBoolean("active", active); super.saveAdditional(nbt); } @@ -143,6 +144,7 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { fluid.readFromNBT(nbt.getCompound("fluid")); energy.deserializeNBT(nbt.get("energy")); progress = nbt.getInt("progress"); + ticks = nbt.getInt("ticks"); active = nbt.getBoolean("active"); } @@ -164,21 +166,32 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { return; } - boolean newActive; + boolean newActive = entity.active; - if (entity.canCraft().isPresent() && entity.hasEnoughEnergy()) { - ++entity.progress; - newActive = true; - entity.energy.extractEnergy(ENERGY_REQUIRED, false); - setChanged(level, pos, state); - - if (entity.progress >= MAX_PROGRESS) { - entity.craftItem(); - } - } else { - entity.resetProgress(); + Optional optionalInsolatorRecipe = entity.getRecipe(); + if (optionalInsolatorRecipe.isEmpty()) { newActive = false; - setChanged(level, pos, state); + } else { + InsolatorRecipe insolatorRecipe = optionalInsolatorRecipe.get(); + if (entity.canCraft(insolatorRecipe) && entity.hasEnoughEnergy(insolatorRecipe)) { + if (entity.progress == 0) { + entity.ticks = insolatorRecipe.getTicks(); + } + + ++entity.progress; + newActive = true; + + entity.energy.extractEnergy(ENERGY_REQUIRED, false); + setChanged(level, pos, state); + + if (entity.progress >= insolatorRecipe.getTicks()) { + entity.craftItem(insolatorRecipe); + } + } else { + entity.resetProgress(insolatorRecipe.getTicks()); + newActive = false; + setChanged(level, pos, state); + } } if (newActive != entity.active) { @@ -210,18 +223,14 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { } } - private void resetProgress() { + private void resetProgress(int newTicks) { this.progress = 0; + this.ticks = newTicks; } - private void craftItem() { - Optional recipe = canCraft(); - if (recipe.isEmpty()) { - return; - } - + private void craftItem(InsolatorRecipe recipe) { // Drain the amount of fluid specified in our recipe from the fluid tank - fluid.drain(recipe.get().getFluid().getAmount(), IFluidHandler.FluidAction.EXECUTE); + fluid.drain(recipe.getFluid().getAmount(), IFluidHandler.FluidAction.EXECUTE); // Remove an item from the input slot. inventory.extractItem(1, 1, false); @@ -229,47 +238,38 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { // Insert the recipe output in to the output slot. ItemStack output = inventory.getStackInSlot(2); if (output.isEmpty()) { - inventory.setStackInSlot(2, recipe.get().getResultItem().copy()); + inventory.setStackInSlot(2, recipe.getResultItem().copy()); } else { - output.grow(recipe.get().getResultItem().getCount()); + output.grow(recipe.getResultItem().getCount()); } - resetProgress(); + resetProgress(recipe.getTicks()); } - private boolean hasEnoughEnergy() { - return energy.getEnergyStored() >= ENERGY_REQUIRED * MAX_PROGRESS; + private boolean hasEnoughEnergy(InsolatorRecipe recipe) { + return energy.getEnergyStored() >= ENERGY_REQUIRED * recipe.getTicks(); } - private Optional canCraft() { - Optional recipe = getRecipe(); - if (recipe.isEmpty()) { - return Optional.empty(); - } - + private boolean canCraft(InsolatorRecipe recipe) { // Make sure that the correct fluid is in the tank. - if (!fluid.getFluid().equals(recipe.get().getFluid())) { - return Optional.empty(); + if (!fluid.getFluid().equals(recipe.getFluid())) { + return false; } // Ensure that we have enough fluid - if (fluid.getFluidAmount() < recipe.get().getFluid().getAmount()) { - return Optional.empty(); + if (fluid.getFluidAmount() < recipe.getFluid().getAmount()) { + return false; } ItemStack output = inventory.getStackInSlot(2); // If the output isn't empty, and the item in the output is different to the output of the recipe, we cannot process. - if (!output.isEmpty() && output.getItem() != recipe.get().getResultItem().getItem()) { - return Optional.empty(); + if (!output.isEmpty() && output.getItem() != recipe.getResultItem().getItem()) { + return false; } // Make sure that the output is not saturated. - if (output.getCount() + recipe.get().getResultItem().getCount() > output.getMaxStackSize()) { - return Optional.empty(); - } - - return recipe; + return output.getCount() + recipe.getResultItem().getCount() <= output.getMaxStackSize(); } private Optional getRecipe() { @@ -313,4 +313,8 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { public int getProgress() { return this.progress; } + + public int getTicks() { + return this.ticks; + } } diff --git a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java index 6e85172..b353857 100644 --- a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java +++ b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java @@ -5,6 +5,7 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import net.banutama.utamacraft.block.entity.InsolatorBlockEntity; import net.banutama.utamacraft.integrations.computercraft.utils.WrapResult; +import net.banutama.utamacraft.recipe.InsolatorRecipe; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; @@ -42,7 +43,7 @@ public class InsolatorPeripheral extends BasePeripheral { Map result = new HashMap<>(); result.put("active", insolator.getActive()); result.put("progress", insolator.getProgress()); - result.put("maxProgress", InsolatorBlockEntity.MAX_PROGRESS); + result.put("ticks", insolator.getTicks()); result.put("energy", WrapResult.wrap(insolator.getEnergy())); insolator.getInventoryOptional().ifPresent(inventory -> result.put("inventory", WrapResult.wrap(inventory))); diff --git a/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java b/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java index 6d4a2c7..1dad542 100644 --- a/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java +++ b/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java @@ -20,12 +20,14 @@ public class InsolatorRecipe implements Recipe { private final ItemStack output; private final Ingredient input; private final FluidStack fluid; + private final int ticks; - public InsolatorRecipe(ResourceLocation id, ItemStack output, Ingredient input, FluidStack fluid) { + public InsolatorRecipe(ResourceLocation id, ItemStack output, Ingredient input, FluidStack fluid, int ticks) { this.id = id; this.output = output; this.input = input; this.fluid = fluid; + this.ticks = ticks; } @Override @@ -51,6 +53,10 @@ public class InsolatorRecipe implements Recipe { return fluid; } + public int getTicks() { + return ticks; + } + @Override public @NotNull ItemStack getResultItem() { return output.copy(); @@ -87,7 +93,8 @@ public class InsolatorRecipe implements Recipe { ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(pSerializedRecipe, "output")); Ingredient input = Ingredient.fromJson(pSerializedRecipe.getAsJsonObject("input")); FluidStack fluid = FluidStack.CODEC.decode(JsonOps.INSTANCE, pSerializedRecipe.get("fluid")).result().orElseThrow().getFirst(); - return new InsolatorRecipe(pRecipeId, output, input, fluid); + int ticks = pSerializedRecipe.get("ticks").getAsInt(); + return new InsolatorRecipe(pRecipeId, output, input, fluid, ticks); } @Override @@ -95,7 +102,8 @@ public class InsolatorRecipe implements Recipe { ItemStack output = pBuffer.readItem(); Ingredient input = Ingredient.fromNetwork(pBuffer); FluidStack fluid = pBuffer.readFluidStack(); - return new InsolatorRecipe(pRecipeId, output, input, fluid); + int ticks = pBuffer.readInt(); + return new InsolatorRecipe(pRecipeId, output, input, fluid, ticks); } @Override @@ -103,6 +111,7 @@ public class InsolatorRecipe implements Recipe { pBuffer.writeItemStack(pRecipe.output, false); pRecipe.input.toNetwork(pBuffer); pBuffer.writeFluidStack(pRecipe.fluid); + pBuffer.writeInt(pRecipe.ticks); } } } diff --git a/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java b/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java index 59410d8..022949d 100644 --- a/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java +++ b/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java @@ -2,8 +2,10 @@ package net.banutama.utamacraft.screen; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.logging.LogUtils; import net.banutama.utamacraft.Utamacraft; import net.banutama.utamacraft.block.entity.InsolatorBlockEntity; +import net.banutama.utamacraft.recipe.InsolatorRecipe; import net.banutama.utamacraft.screen.utils.FluidSprite; import net.banutama.utamacraft.screen.utils.MouseUtils; import net.banutama.utamacraft.screen.utils.TiledSprite; @@ -104,8 +106,11 @@ public class InsolatorScreen extends AbstractContainerScreen { private void renderProgressArrow(PoseStack stack, int x, int y) { if (menu.getBlockEntity().getActive()) { - float ratio = (float)menu.getBlockEntity().getProgress() / (float)InsolatorBlockEntity.MAX_PROGRESS; - blit(stack, x + 90, y + 33, 176, 0, 8, (int)(25.0f * ratio)); + int ticks = menu.getBlockEntity().getTicks(); + if (ticks != 0) { + float ratio = (float)menu.getBlockEntity().getProgress() / (float)ticks; + blit(stack, x + 90, y + 33, 176, 0, 8, (int)(25.0f * ratio)); + } } } diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_leaves.json index 3f1d326..ba026ca 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:acacia_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:acacia_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_sapling.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_sapling.json index 39d7f9c..335c0ca 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_sapling.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_acacia_sapling.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:acacia_sapling" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:acacia_sapling", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_allium.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_allium.json index 3532bec..19e689d 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_allium.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_allium.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:allium" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea.json index 6c03dc3..9337538 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:azalea" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea_leaves.json index 425a2c9..0865656 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azalea_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:azalea_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:azalea_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azure_bluet.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azure_bluet.json index 581f71f..0d486ec 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azure_bluet.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_azure_bluet.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:azure_bluet" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_bamboo.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_bamboo.json index 0803477..28b4bec 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_bamboo.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_bamboo.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:bamboo" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_beetroot_seeds.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_beetroot_seeds.json index ed82f12..64d408b 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_beetroot_seeds.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_beetroot_seeds.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:beetroot_seeds" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_big_dripleaf.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_big_dripleaf.json index 9e5cff7..6a4b33a 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_big_dripleaf.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_big_dripleaf.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:big_dripleaf" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_leaves.json index a765835..cf6e3e2 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:birch_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:birch_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_sapling.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_sapling.json index db2e0a3..64e0233 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_sapling.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_birch_sapling.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:birch_sapling" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:birch_sapling", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_blue_orchid.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_blue_orchid.json index 7f99013..c55a92b 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_blue_orchid.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_blue_orchid.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:blue_orchid" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_brown_mushroom.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_brown_mushroom.json index dc8b257..8a0332e 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_brown_mushroom.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_brown_mushroom.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:brown_mushroom" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cactus.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cactus.json index 3cf79a6..4210e5a 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cactus.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cactus.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:cactus" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_chorus_flower.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_chorus_flower.json index d13dd16..b722c0c 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_chorus_flower.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_chorus_flower.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:chorus_flower" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cornflower.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cornflower.json index f4f5ba0..09a13c0 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cornflower.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_cornflower.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:cornflower" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_fungus.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_fungus.json index d724cf3..5fd11e6 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_fungus.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_fungus.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:crimson_fungus" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_roots.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_roots.json index 94548e6..1265672 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_roots.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_crimson_roots.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:crimson_roots" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dandelion.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dandelion.json index 93e24d6..4dd7f4b 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dandelion.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dandelion.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:dandelion" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_leaves.json index e57f76c..f4e0b92 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:dark_oak_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:dark_oak_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_sapling.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_sapling.json index 6b3c538..641f735 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_sapling.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_dark_oak_sapling.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:dark_oak_sapling" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:dark_oak_sapling", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_fern.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_fern.json index 0e94feb..7ba90e4 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_fern.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_fern.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:fern" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea.json index be441e7..73f11de 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:flowering_azalea" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea_leaves.json index e1181b0..8aed212 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_flowering_azalea_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:flowering_azalea_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:flowering_azalea_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_glow_lichen.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_glow_lichen.json index ff50280..c570f8a 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_glow_lichen.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_glow_lichen.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:glow_lichen" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_grass.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_grass.json index 8c9a844..9edc8c6 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_grass.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_grass.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:grass" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_hanging_roots.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_hanging_roots.json index b046f1e..2e7a348 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_hanging_roots.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_hanging_roots.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:hanging_roots" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_leaves.json index 82f30b8..d2c4113 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:jungle_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:jungle_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_sapling.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_sapling.json index cf3af1b..a9a04ce 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_sapling.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_jungle_sapling.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:jungle_sapling" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:jungle_sapling", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_kelp.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_kelp.json index aeb08e9..49c630a 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_kelp.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_kelp.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:kelp" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_large_fern.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_large_fern.json index ddc86a2..0b559e1 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_large_fern.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_large_fern.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:large_fern" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lilac.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lilac.json index bb62e49..7997156 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lilac.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lilac.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:lilac" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lily_of_the_valley.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lily_of_the_valley.json index 88e3567..0be5b2d 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lily_of_the_valley.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_lily_of_the_valley.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:lily_of_the_valley" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_mangrove_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_mangrove_leaves.json index b5eaa4e..83e356f 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_mangrove_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_mangrove_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:mangrove_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:mangrove_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_melon.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_melon.json index 2489afb..717fc84 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_melon.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_melon.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:melon" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_block.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_block.json index ccb18f6..8ce5a62 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_block.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_block.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:moss_block" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_carpet.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_carpet.json index 362a84a..0534ae1 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_carpet.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_moss_carpet.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:moss_carpet" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_sprouts.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_sprouts.json index 0b59aaa..c181b97 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_sprouts.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_sprouts.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:nether_sprouts" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_wart.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_wart.json index 05beedd..fa28f48 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_wart.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_nether_wart.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:nether_wart" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_leaves.json index 6d58338..68d8375 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:oak_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:oak_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_sapling.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_sapling.json index ef34ede..9fdf34a 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_sapling.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oak_sapling.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:oak_sapling" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:oak_sapling", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_orange_tulip.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_orange_tulip.json index 31ba277..54c1579 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_orange_tulip.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_orange_tulip.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:orange_tulip" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oxeye_daisy.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oxeye_daisy.json index a7f0248..9801466 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oxeye_daisy.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_oxeye_daisy.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:oxeye_daisy" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_peony.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_peony.json index b94a4fc..ed20879 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_peony.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_peony.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:peony" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pink_tulip.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pink_tulip.json index e3a109a..55031eb 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pink_tulip.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pink_tulip.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:pink_tulip" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_poppy.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_poppy.json index 400001f..cb5ca1b 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_poppy.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_poppy.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:poppy" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_potato.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_potato.json index 8a054b7..808494a 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_potato.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_potato.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:potato" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pumpkin.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pumpkin.json index 84953d3..c5d1184 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pumpkin.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_pumpkin.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:pumpkin" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_mushroom.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_mushroom.json index 9a9d870..92d865d 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_mushroom.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_mushroom.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:red_mushroom" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_tulip.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_tulip.json index 137f2b9..8b611ec 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_tulip.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_red_tulip.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:red_tulip" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_rose_bush.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_rose_bush.json index 6ca490b..6c29dc5 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_rose_bush.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_rose_bush.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:rose_bush" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sea_pickle.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sea_pickle.json index 59998f3..1e9c726 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sea_pickle.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sea_pickle.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:sea_pickle" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_seagrass.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_seagrass.json index d1991df..3a67862 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_seagrass.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_seagrass.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:seagrass" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_small_dripleaf.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_small_dripleaf.json index 25e171e..f7b9f73 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_small_dripleaf.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_small_dripleaf.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:small_dripleaf" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spore_blossom.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spore_blossom.json index d9af8f2..751df1c 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spore_blossom.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spore_blossom.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:spore_blossom" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_leaves.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_leaves.json index ded4be1..f89e32f 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_leaves.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_leaves.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:spruce_leaves" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:spruce_leaves", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_sapling.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_sapling.json index d9bc9c9..40d23cd 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_sapling.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_spruce_sapling.json @@ -3,9 +3,10 @@ "input": { "item": "minecraft:spruce_sapling" }, + "ticks": 1000, "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": 1000 }, "output": { "item": "minecraft:spruce_sapling", diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sugar_cane.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sugar_cane.json index 5e3736d..f097b8e 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sugar_cane.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sugar_cane.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:sugar_cane" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sunflower.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sunflower.json index 224fa2d..f120e4c 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sunflower.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_sunflower.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:sunflower" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_tall_grass.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_tall_grass.json index 847795a..b99673a 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_tall_grass.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_tall_grass.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:tall_grass" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_twisting_vines.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_twisting_vines.json index 35c796a..2ccdb2c 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_twisting_vines.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_twisting_vines.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:twisting_vines" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_vine.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_vine.json index ae9917b..a3c2a3e 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_vine.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_vine.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:vine" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_fungus.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_fungus.json index dda4c1b..6c808b3 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_fungus.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_fungus.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:warped_fungus" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_roots.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_roots.json index 1a76a4c..bc8570c 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_roots.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_warped_roots.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:warped_roots" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_weeping_vines.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_weeping_vines.json index 229e663..ef37889 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_weeping_vines.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_weeping_vines.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:weeping_vines" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wheat_seeds.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wheat_seeds.json index af4c6a9..8950aa4 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wheat_seeds.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wheat_seeds.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:wheat_seeds" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_white_tulip.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_white_tulip.json index 984bed2..49a2a14 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_white_tulip.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_white_tulip.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:white_tulip" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wither_rose.json b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wither_rose.json index b2a6515..2488a0d 100644 --- a/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wither_rose.json +++ b/src/main/resources/data/utamacraft/recipes/insolator_minecraft_wither_rose.json @@ -3,6 +3,7 @@ "input": { "item": "minecraft:wither_rose" }, + "ticks": 500, "fluid": { "FluidName": "minecraft:water", "Amount": 500 diff --git a/tools/generate-insolator-recipes.py b/tools/generate-insolator-recipes.py index 0054316..df526f0 100644 --- a/tools/generate-insolator-recipes.py +++ b/tools/generate-insolator-recipes.py @@ -77,19 +77,33 @@ ITEMS = [ # "minecraft:torchflower", TODO: 1.20 ] +def basicTicksFor(item: str) -> int: + if item.endswith("_leaves") or item.endswith("_sapling"): + return 1000 + return 500 + +def basicWaterFor(item: str) -> int: + if item.endswith("_leaves") or item.endswith("_sapling"): + return 1000 + return 500 + for item in ITEMS: namespace, item_name = item.split(":") with open(f"src/main/resources/data/utamacraft/recipes/insolator_{namespace}_{item_name}.json", "w") as fp: fp.write(json.dumps({ "type": "utamacraft:insolator", "input": { "item": item }, + "ticks": basicTicksFor(item), "fluid": { "FluidName": "minecraft:water", - "Amount": 500 + "Amount": basicWaterFor(item) }, "output": { "item": item, "count": 2 } }, indent=2)) with open("insolator-recipes.md", "w") as fp: for item in ITEMS: - fp.write(f"| [{item}] | 500 | 16,000 | 500 | 25 |\n") + ticks = basicTicksFor(item) + energy = 32 * ticks + water = basicWaterFor(item) + fp.write(f"| [{item}] | {water} | {energy} | {ticks} | {ticks / 20} |\n") -- 2.45.2 From a21fe80b1125aaac5db7911eb8c8802a6af16ba9 Mon Sep 17 00:00:00 2001 From: Blake Rain Date: Mon, 4 Dec 2023 15:10:05 +0000 Subject: [PATCH 3/6] chore: remove unused imports --- .../computercraft/peripheral/InsolatorPeripheral.java | 3 --- .../java/net/banutama/utamacraft/screen/InsolatorScreen.java | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java index b353857..cf27178 100644 --- a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java +++ b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/InsolatorPeripheral.java @@ -5,11 +5,8 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import net.banutama.utamacraft.block.entity.InsolatorBlockEntity; import net.banutama.utamacraft.integrations.computercraft.utils.WrapResult; -import net.banutama.utamacraft.recipe.InsolatorRecipe; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.items.ItemStackHandler; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; diff --git a/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java b/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java index 022949d..b4a317a 100644 --- a/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java +++ b/src/main/java/net/banutama/utamacraft/screen/InsolatorScreen.java @@ -2,10 +2,7 @@ package net.banutama.utamacraft.screen; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.logging.LogUtils; import net.banutama.utamacraft.Utamacraft; -import net.banutama.utamacraft.block.entity.InsolatorBlockEntity; -import net.banutama.utamacraft.recipe.InsolatorRecipe; import net.banutama.utamacraft.screen.utils.FluidSprite; import net.banutama.utamacraft.screen.utils.MouseUtils; import net.banutama.utamacraft.screen.utils.TiledSprite; -- 2.45.2 From af13e339532bd3e7453e21f3508d6da280154750 Mon Sep 17 00:00:00 2001 From: Blake Rain Date: Mon, 4 Dec 2023 16:18:29 +0000 Subject: [PATCH 4/6] feat: add JEI integration for Insolator recipes (fixes #20) --- .../net/banutama/utamacraft/Utamacraft.java | 15 +++- .../block/entity/InsolatorBlockEntity.java | 3 +- .../jei/InsolatorRecipeCategory.java | 68 +++++++++++++++++++ .../integrations/jei/ModJeiPlugin.java | 36 ++++++++++ .../utamacraft/recipe/InsolatorRecipe.java | 18 +++-- .../utamacraft/recipe/ModRecipes.java | 11 +++ 6 files changed, 142 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/banutama/utamacraft/integrations/jei/InsolatorRecipeCategory.java create mode 100644 src/main/java/net/banutama/utamacraft/integrations/jei/ModJeiPlugin.java diff --git a/src/main/java/net/banutama/utamacraft/Utamacraft.java b/src/main/java/net/banutama/utamacraft/Utamacraft.java index 0dd20f5..bd818a6 100644 --- a/src/main/java/net/banutama/utamacraft/Utamacraft.java +++ b/src/main/java/net/banutama/utamacraft/Utamacraft.java @@ -2,7 +2,6 @@ package net.banutama.utamacraft; import com.mojang.logging.LogUtils; -import net.banutama.utamacraft.block.custom.InsolatorBlock; import net.banutama.utamacraft.block.custom.ModBlocks; import net.banutama.utamacraft.block.entity.ModBlockEntities; import net.banutama.utamacraft.item.ModItems; @@ -12,7 +11,10 @@ import net.banutama.utamacraft.recipe.ModRecipes; import net.banutama.utamacraft.screen.InsolatorScreen; import net.banutama.utamacraft.screen.ModMenuTypes; import net.banutama.utamacraft.sound.ModSounds; +import net.minecraft.client.RecipeBookCategories; import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RegisterRecipeBookCategoriesEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -33,7 +35,6 @@ public class Utamacraft { public static final String MOD_ID = "utamacraft"; private static final Logger LOGGER = LogUtils.getLogger(); - // Very Important Comment public Utamacraft() { LOGGER.info("Utamacraft initializing"); IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); @@ -69,4 +70,14 @@ public class Utamacraft { () -> SlotTypePreset.NECKLACE.getMessageBuilder().build()); } } + + @Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) + public static class ModClientEvents { + @SubscribeEvent + public static void onRegisterRecipeBookCategories(RegisterRecipeBookCategoriesEvent event) { + event.registerRecipeCategoryFinder(ModRecipes.INSOLATOR_RECIPE_TYPE.get(), recipe -> { + return RecipeBookCategories.UNKNOWN; + }); + } + } } diff --git a/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java b/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java index 9536c31..27297e6 100644 --- a/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java +++ b/src/main/java/net/banutama/utamacraft/block/entity/InsolatorBlockEntity.java @@ -2,6 +2,7 @@ package net.banutama.utamacraft.block.entity; import net.banutama.utamacraft.block.custom.InsolatorBlock; import net.banutama.utamacraft.recipe.InsolatorRecipe; +import net.banutama.utamacraft.recipe.ModRecipes; import net.banutama.utamacraft.screen.InsolatorMenu; import net.banutama.utamacraft.util.ModEnergyStorage; import net.minecraft.core.BlockPos; @@ -283,7 +284,7 @@ public class InsolatorBlockEntity extends BlockEntity implements MenuProvider { } return level.getRecipeManager() - .getRecipeFor(InsolatorRecipe.Type.INSTANCE, inventory, level); + .getRecipeFor(ModRecipes.INSOLATOR_RECIPE_TYPE.get(), inventory, level); } private void sendUpdate() { diff --git a/src/main/java/net/banutama/utamacraft/integrations/jei/InsolatorRecipeCategory.java b/src/main/java/net/banutama/utamacraft/integrations/jei/InsolatorRecipeCategory.java new file mode 100644 index 0000000..9e14883 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/jei/InsolatorRecipeCategory.java @@ -0,0 +1,68 @@ +package net.banutama.utamacraft.integrations.jei; + +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.forge.ForgeTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.banutama.utamacraft.Utamacraft; +import net.banutama.utamacraft.block.custom.ModBlocks; +import net.banutama.utamacraft.recipe.InsolatorRecipe; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import org.checkerframework.checker.units.qual.A; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class InsolatorRecipeCategory implements IRecipeCategory { + public final static ResourceLocation UID = new ResourceLocation(Utamacraft.MOD_ID, "insolator"); + public final static ResourceLocation TEXTURE = + new ResourceLocation(Utamacraft.MOD_ID, "textures/gui/insolator_gui.png"); + public static final RecipeType INSOLATOR_TYPE = + new RecipeType<>(InsolatorRecipeCategory.UID, InsolatorRecipe.class); + + private final IDrawable background; + private final IDrawable icon; + + public InsolatorRecipeCategory(IGuiHelper guiHelper) { + this.background = guiHelper.createDrawable(TEXTURE, 0, 0, 176, 85); + this.icon = guiHelper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(ModBlocks.INSOLATOR.get())); + } + + @Override + public @NotNull RecipeType getRecipeType() { + return INSOLATOR_TYPE; + } + + @Override + public @NotNull Component getTitle() { + return Component.translatable("block.utamacraft.insolator"); + } + + @Override + public @NotNull IDrawable getBackground() { + return this.background; + } + + @Override + public @NotNull IDrawable getIcon() { + return this.icon; + } + + @Override + public void setRecipe(@NotNull IRecipeLayoutBuilder builder, @NotNull InsolatorRecipe recipe, @NotNull IFocusGroup focuses) { + builder.addSlot(RecipeIngredientRole.INPUT, 86, 15) + .addIngredients(recipe.getIngredients().get(0)); + builder.addSlot(RecipeIngredientRole.INPUT, 33, 16) + .addIngredients(ForgeTypes.FLUID_STACK, List.of(recipe.getFluid())) + .setFluidRenderer(64000, false, 9, 60); + builder.addSlot(RecipeIngredientRole.OUTPUT, 86, 60) + .addItemStack(recipe.getResultItem()); + } +} diff --git a/src/main/java/net/banutama/utamacraft/integrations/jei/ModJeiPlugin.java b/src/main/java/net/banutama/utamacraft/integrations/jei/ModJeiPlugin.java new file mode 100644 index 0000000..ad9d2e1 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/jei/ModJeiPlugin.java @@ -0,0 +1,36 @@ +package net.banutama.utamacraft.integrations.jei; + +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import mezz.jei.api.registration.IRecipeRegistration; +import net.banutama.utamacraft.Utamacraft; +import net.banutama.utamacraft.recipe.InsolatorRecipe; +import net.banutama.utamacraft.recipe.ModRecipes; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeManager; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Objects; + +@JeiPlugin +public class ModJeiPlugin implements IModPlugin { + @Override + public @NotNull ResourceLocation getPluginUid() { + return new ResourceLocation(Utamacraft.MOD_ID, "jei_plugin"); + } + + @Override + public void registerCategories(IRecipeCategoryRegistration registration) { + registration.addRecipeCategories(new InsolatorRecipeCategory(registration.getJeiHelpers().getGuiHelper())); + } + + @Override + public void registerRecipes(IRecipeRegistration registration) { + RecipeManager manager = Objects.requireNonNull(Minecraft.getInstance().level).getRecipeManager(); + List recipes = manager.getAllRecipesFor(ModRecipes.INSOLATOR_RECIPE_TYPE.get()); + registration.addRecipes(InsolatorRecipeCategory.INSOLATOR_TYPE, recipes); + } +} diff --git a/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java b/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java index 1dad542..ad69ec6 100644 --- a/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java +++ b/src/main/java/net/banutama/utamacraft/recipe/InsolatorRecipe.java @@ -12,6 +12,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.Level; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.Mod; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -74,16 +75,21 @@ public class InsolatorRecipe implements Recipe { @Override public @NotNull RecipeType getType() { - return Type.INSTANCE; + return ModRecipes.INSOLATOR_RECIPE_TYPE.get(); } - public static class Type implements RecipeType { - public static final Type INSTANCE = new Type(); - public static final String ID = "insolator"; - private Type() { - } + @Override + public @NotNull NonNullList getIngredients() { + return NonNullList.of(Ingredient.EMPTY, input); } +// public static class Type implements RecipeType { +// public static final Type INSTANCE = new Type(); +// public static final String ID = "insolator"; +// private Type() { +// } +// } + public static class Serializer implements RecipeSerializer { public static final Serializer INSTANCE = new Serializer(); public static final ResourceLocation ID = new ResourceLocation(Utamacraft.MOD_ID, "insolator"); diff --git a/src/main/java/net/banutama/utamacraft/recipe/ModRecipes.java b/src/main/java/net/banutama/utamacraft/recipe/ModRecipes.java index ad04392..20832ee 100644 --- a/src/main/java/net/banutama/utamacraft/recipe/ModRecipes.java +++ b/src/main/java/net/banutama/utamacraft/recipe/ModRecipes.java @@ -2,6 +2,7 @@ package net.banutama.utamacraft.recipe; import net.banutama.utamacraft.Utamacraft; import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; @@ -10,11 +11,21 @@ import net.minecraftforge.registries.RegistryObject; public class ModRecipes { public static final DeferredRegister> SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, Utamacraft.MOD_ID); + public static final DeferredRegister> TYPES = + DeferredRegister.create(ForgeRegistries.RECIPE_TYPES, Utamacraft.MOD_ID); public static final RegistryObject> INSOLATOR_SERIALIZER = SERIALIZERS.register("insolator", () -> InsolatorRecipe.Serializer.INSTANCE); + public static final RegistryObject> INSOLATOR_RECIPE_TYPE = + TYPES.register("insolator_recipe", () -> new RecipeType() { + @Override + public String toString() { + return "insolator_recipe"; + } + }); public static void register(IEventBus bus) { SERIALIZERS.register(bus); + TYPES.register(bus); } } -- 2.45.2 From a167eecf3c0ec91727341252058147a1af385afa Mon Sep 17 00:00:00 2001 From: Blake Rain Date: Mon, 4 Dec 2023 17:10:49 +0000 Subject: [PATCH 5/6] fix: add loot table for tinted ethereal glass (fixes #29) --- .../loot_tables/blocks/tinted_ethereal_glass.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/resources/data/utamacraft/loot_tables/blocks/tinted_ethereal_glass.json diff --git a/src/main/resources/data/utamacraft/loot_tables/blocks/tinted_ethereal_glass.json b/src/main/resources/data/utamacraft/loot_tables/blocks/tinted_ethereal_glass.json new file mode 100644 index 0000000..eb370aa --- /dev/null +++ b/src/main/resources/data/utamacraft/loot_tables/blocks/tinted_ethereal_glass.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "utamacraft:tinted_ethereal_glass" + } + ] + } + ] +} -- 2.45.2 From 6c4fa2244845a1f9f89b22929d74a9b7b3cad082 Mon Sep 17 00:00:00 2001 From: Blake Rain Date: Mon, 4 Dec 2023 17:49:35 +0000 Subject: [PATCH 6/6] feat: add ore generation for tungsten (closes #28) --- assets/tungsten_ore.afdesign | Bin 0 -> 82184 bytes .../net/banutama/utamacraft/Utamacraft.java | 4 ++ .../utamacraft/block/custom/ModBlocks.java | 14 +++++ .../world/feature/ModConfiguredFeatures.java | 38 ++++++++++++ .../world/feature/ModPlacedFeatures.java | 40 ++++++++++++ .../blockstates/deepslate_tungsten_ore.json | 5 ++ .../utamacraft/blockstates/tungsten_ore.json | 5 ++ .../assets/utamacraft/lang/en_us.json | 2 + .../models/block/deepslate_tungsten_ore.json | 6 ++ .../utamacraft/models/block/tungsten_ore.json | 6 ++ .../models/item/deepslate_tungsten_ore.json | 3 + .../utamacraft/models/item/tungsten_ore.json | 3 + .../textures/block/deepslate_tungsten_ore.png | Bin 0 -> 2516 bytes .../textures/block/tungsten_ore.png | Bin 0 -> 2472 bytes .../tags/blocks/mineable/pickaxe.json | 8 +++ .../tags/blocks/needs_iron_tool.json | 6 ++ .../biome_modifier/add_tungsten_ore.json | 6 ++ .../blocks/deepslate_tungsten_ore.json | 58 ++++++++++++++++++ .../loot_tables/blocks/tungsten_block.json | 14 +++++ .../loot_tables/blocks/tungsten_ore.json | 58 ++++++++++++++++++ 20 files changed, 276 insertions(+) create mode 100644 assets/tungsten_ore.afdesign create mode 100644 src/main/java/net/banutama/utamacraft/world/feature/ModConfiguredFeatures.java create mode 100644 src/main/java/net/banutama/utamacraft/world/feature/ModPlacedFeatures.java create mode 100644 src/main/resources/assets/utamacraft/blockstates/deepslate_tungsten_ore.json create mode 100644 src/main/resources/assets/utamacraft/blockstates/tungsten_ore.json create mode 100644 src/main/resources/assets/utamacraft/models/block/deepslate_tungsten_ore.json create mode 100644 src/main/resources/assets/utamacraft/models/block/tungsten_ore.json create mode 100644 src/main/resources/assets/utamacraft/models/item/deepslate_tungsten_ore.json create mode 100644 src/main/resources/assets/utamacraft/models/item/tungsten_ore.json create mode 100644 src/main/resources/assets/utamacraft/textures/block/deepslate_tungsten_ore.png create mode 100644 src/main/resources/assets/utamacraft/textures/block/tungsten_ore.png create mode 100644 src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json create mode 100644 src/main/resources/data/minecraft/tags/blocks/needs_iron_tool.json create mode 100644 src/main/resources/data/utamacraft/forge/biome_modifier/add_tungsten_ore.json create mode 100644 src/main/resources/data/utamacraft/loot_tables/blocks/deepslate_tungsten_ore.json create mode 100644 src/main/resources/data/utamacraft/loot_tables/blocks/tungsten_block.json create mode 100644 src/main/resources/data/utamacraft/loot_tables/blocks/tungsten_ore.json diff --git a/assets/tungsten_ore.afdesign b/assets/tungsten_ore.afdesign new file mode 100644 index 0000000000000000000000000000000000000000..6b03b71ab0849dc0b8c32c77788598cc27036952 GIT binary patch literal 82184 zcmdRVXIvD`^XKfc*UWTRO?|t!x~96OhM57-I!gEe1bE`>W5}-cSgrt`Y?kXKF4PZ@ai#)h ztas_1KqUNTSkXA{DRdkztEci-n3I?)n0E~=)GP=jw(lJN0kM4=dl{~_hT~4@3!(VJ zu4E(0My;|A-OX?QQ*;de?y5|7;I)clcit_d~#)Bkg(oc`fP1zDqZ!A(120fMsWc*DK zpL#^@l9ykbn<&K$9y&p@CSowE%DN~`;YtY(c2X0#t%Z0U3Bm|T{vs#G>#GP2Gbz3! z-p>S1*LUsgAF{a5dtFgGC6uP3`+^<~KX?3o;t5F_we6Gq;AMiMUHTkRu1nXOaZ{Y6>yRd;baE4r&#;UF(ID*K%S{dH8fcQqPwr-KRc zR_4eYXQTGKqefXO^NTvHGv)Z2-|nXNc%|;S@JPL83W8&j>yL&Y_~cZqzy8Lt7_aP- zph|(1IA7{ zxdDAh(3ZX#=w#{DFV(Fa-JHOKqf?vJv#L`%N1W=L;pwlBKfO9ugkNW_1r~i(99;eU zYNS9k<5tPWOj?6Zi-CKVX@_Ex3{<@17I^jyRE0Tc$I%57qBxr36r2}PJR8Qf+OH1s zQcdr@)C8pcv{?x<*oFdMzcJT4=T2bdUzd+nYiDezI8zqk&^cCoWLj`>%2AL>hOxZMJJASz~B&7J!N`IX=wgPOC&TusccYLA~~6XWz=Pf*U5f+$w172^EdZv zzRTP@>7#K&xHgZlj*QY*&jPatrPGVQY&dgmP)yHgOme)#caK?9Tp9Xvbj4jUKJY8h z$Uavvp#o9hJdo9V4SU#p@0=W2pwISpDP{?0yz+HM*_~geraFl3m)*27ew$u34%A6; zaXJGpRW65dqLi7^V4ZYN%vu}jQLls$B|?Y-{AB-j~GD=U?4(H7Bbc=@% zi}G#mqzyg&AvGQzfTH8Di0?c6on2jVvo0CPc9@;Ds_^EmiVi2Fn z_ofMY!#cCRU6fu5KfBxLM^;@|M@|)(!i`?|)o`zXHC+$kimU+F4p33Q4Kx#a5{tMO ztXlhN_r?Pod9tjE1a&K?UD1p9eec+Z0);6Z-^KVSP~uzi${xzt&Q*>^&&&LAdjGtb z3rlYt5o=x|S=1)lmK2Llmu53Xv72#e1Z^@KH};^7-N+9;&1)S{&suI)4a)6vyz7&e zNS{ckoN_*!^JfE9YBO(4-5TXd=2iOcPh{Y1Hn&5WUZO~2+qL0!x@*nn55HNR(~72B zL>^tevT+#W84q5YE6wn5;zfie^ou z`Ogebf>cd=K*o-O091C18^JeWi`(Fy&QLaLPLdRI>Pn7A%? z!(a5%v1aKwIog0PTkwhOc)9AqClAsTnT0U1xy)V7ycrLn!d(T=b^m$Kh^PEj^Hh+| ztVR|brZFf*#pCj1zo$3F>|OaGL82MgZXUayp|dF>Rm|wszIbSOjQw_Fd;!aEMtmCDMll zWXE`7Nm@Tvsy~e4gu}tgXZt?d{d|PdQ1}3eN`5DG1`z%mvsX2oMqX2iRGm=)4hWaz zN8rS>vq|V8aTTGg__#3x`{$(HAXJmxzL$ptt@M2SrWlWJtNB!SB@^x6+N zQa~w;83LBIPJ?7dG+L<~H(M+Zkx=IFx=-xl@{ilX_9%iD`4?HJ;um#`&?=1DjQfWG z$1D%v9l&c+7MKUdNzY{1#!2JUqRq+?Hq{dwStD5aK=%urj9$2EW8+9Ewc8_MM=k~f z4#oAGPNTLW5~*lKs`!L8i3m37bTp9*moDl0^A{>#i{%D)yr$`O*b6W{b@@HKR56P5 z*t_8KVh&MbSQ;D@ZmQ{gP@H5{d=aW~TQyNk=Q@Mn3CN z$YnwiLvG=HlH_2J8!)FY*C-qIT^-hh`>{tY)xcm5tq$L_eLzxn&)y(u)~eBf#ms~wgYN!TMh4AL?ziBZtr z?^<+4tM??x+fH0Y@!bM${{oiAIK})M%_*HrUim1gpAuzS8>`Q=?GmCLH~ zE`7!e{Fg;%9fH^|S5J)bChkq`#zn3=;m9`6s!z)_=XW3`{81YgUokA_Vb~azU%Nj$ zDAx=2Dx^1Zkr5Prd8mPUWvn@eNY)l8KI;c`>ONeRem2$JfKfW;${fw8Ha-+|XS1%` zm8s;WPAdK~ha5~}GHZTZt3P0-K8{unDLLH@qrga)IAW5^T}!b}HI;OgT**uo^J;IlT6;>h_z zhnVN-kr%RYJSBp&zNYCW$iid9cY5eva?P+~y*UTMpn~*?@7EE8#ps_V!*>y^PK{DQ@LIDbzKZXB$U=ex`Q*K-k)AGYPi#I6Nm;M# zv*FsNkR`!60{J+CxCce?`D1-+o2mttj2;V0JdEw`#UWx>kFT#kikS-X zU42pM9F$veQ(xRD!ptJ+vpgH-h^;B6Lv&OSxp1ab+-FzEbayl%qxxkv6Zf}U4OSAE z>zKHuyTGdTlBO7i(<-^D$`b}P8BTGL=Pn4dI=VtIrITE4S68yr_sux+DIDG?QxiPn zPh#x{9Hxr~W>R;II7<*k*G1KKafo^KGIi0a%NJd!-vP#>M(^{##`~iUX7ey)7u_ER zX2fP|dKjABokLN`=la)&l^UJ?hLEhgD}U~fa1Wq1hy$kytm=GQhegBC;BTtK4+KEt-cF;f4k1Bt58XE0#Ac=p2ry*{LWm9$$y zzfA@HmRx1VgLQ6fX4h*OxbjD)ZA1qX#T;MY7IG6_O@jj+22(k8GF(?2NqIwTOp2)2 z9PjCK(yNRV-~TWYx8wmAMwf9Ty<$PDNc+p8;nrXvZZHZ_vE6!gUtnbN2 z(zX5nSQJ!DA)=X%s&sGYZ%bJ;vyaSF(07;+6%1>tWMfomy_$33wOQJir~C%@oR1Vg zm=As$Tgs|^i&m8=L6mA!S|8Y~Hrj54%*oc?FFC0icFN{MzrOQo{f_0k;X~s(F`uB& zAwG?)(rM!BT|>bcw7aau#@ynE!@l$@%zTN>LHd3VJ(rDf8xu5hTpN_R&R^(H-WB)q zc1&3hGl&j!fp+C6Hpr=UtnP|D!a@%dtmN#MnXcjc>0 zS}yu~TC$oIG36e$mSe8MGy&#sU#cA7CkYPn5vEcT$eAaKY1(|f>{>Tlqz>v$S67zv zyfiX7PKbVNqNV~%M)6%3D4{9d3F|*EvO1-%{VsXXxK#AOZOx;D&$0;i`g+~2IQyiE zEq&_HIDM!j2t__s5g!;@A=6y(;_(z$D7~L^^x6q`>T(hk;y|LbDg2^P`6Ze*`&edd zzI7^9_uDVE@Oec(x!8b{UDfH2WEb*g0=RjHd4Fxv1g-IKM1 zt&T@%gYcNDE!t=Vt@y=!_Wd2$O@=8eE6evsE)YeY9`M0L0khx0xgxHA=t%e`2ZR}v zj-R1-JKm9QOn&E zQdrN6xjlNqZ>Tns=(>Zdg8{lA3T@tZJfboA=u)iGmu9WDni-c-PP7+}5VSv&+of;F z>Iu5pOo9)+^s&q6e2KhOi_%y5e5Uw9DjilGZMu<&i8W>x>oSGXB~iajIMb!xT=^?$ z)OB+Inf)qz`Gh#tUU$Pd`=!VB`;Q{?9{qx|Y}<{+55`gLMaO)WAFo4VX~*j8o5?vE z#8Z^4=&m26ASXKtAA~)8bjc2}Cz2fi6TwKKC-0X#89v<59r4TxOrz|0OoltKv2dw) zB)$kkHChe-2fPPgB$QUxK`P@7yUfW857H<)3k#(ZsY7z5Zs#Qm7u2iKj3P|zVe-rM z9ZpAQ#mF{`6=oIZgw>sd~bNjT}06iht8fsjXfMp zVh89TfRkZ9WzLiC*O_iZn&3!#X*CX;4PJbupOwYlJ?-awE}?0J$Y~4qj6Sek9E$@w zEq#Nx5n6l(Q@AYMk?W<36L2;*VT$`TNBe^?jzFm@LrSH)4*e+huHw+pEKOW3x6ZTE z>)Ppqg>S@PECQJvoE^%ARdy7MNG=Nllw*`|*ht`K5zHqEX+;(jFG6ZGEy)i+Y4)tW z$0u)av|Vi!o;HnIRXv+m!s~pt5ch8dqjy zd<|M+@t}z5ZjIXOoAp*!{8>}_Wiffo#R;+F5`}vjNtB{`idPzLtlH3P(y|u=Y-+}S zv3wba0(yJY04XVUKi;)sUHo-0*k}pOaDqm5(GW3aC8|BXzSEanZz+vluSOGC(8&64 z{>D}PcGYihAVAV!q=feGS(YN|AWH*7FROx4{vFK~X_|Jw7 zyHTFwVuoTl_QbmnXKnq`?6GL|`>JDC=oV*X?7w>>(E)WyG-zu(YmHHzRrcBxkmGFk8Hu$=}RYy_+4u>Rs(hEgJk@PD!A^IcRz%_vuEm#!#nAGa*I$YaLzBcZ%-*_aI%>51rW z;u1k!cfWB|i~f3fPcrNFBTwa5dv|a0f+d%WQQK_V#H*^Vq0e4xCwG-(iMblSAg)TK zj2}5?CKHsmk84P(jTV#O)E(?_Eg59+)5ckyjO z4j9_gCm%|L2BoQIjvLWy{DN-8$zBjhv#3dJ)<A-r7R@EE$Mkzw?G$1Q zf60F37OBsJSY(^ckSWY;#UG}^5{j3nVW4(?tNkdHAxXlW2VuiDYsSb~KPh2aE0EMg zRki7GB(fgq5g(1gY7>RAGSnEVR9qO&u)S+`79aaFcwokrMno{N=XIbc(P#P`N<6bn z;IU~O8KSmW#Qkkxqhi4_pA|tq(^QzrsS+L2>kosjhywnkh(HF$D^~S=XYryj*EKy>(v;z;J_-*%XW(- zW+7l%eh7lH(<8F?VBDuwQLMQiDJl}#;m8$@0byHS;2k3CS+yx2VR@a+gYD9Gr)Alp znuK_ZhLptYOj-v*_rhB52M%ojgd^UErAwaLNXYVy@=-iK%unJ+r)ennjzB%z?A}wF zySZ%$*7~PE9+tLwLAeMD!;_qGeZnN8m@6Xwe6gmF*0eQ(3BdBoH{9KA-9Mn#4- zenP>2_;=FZ7_Ww>5e73nN}B5qf>X0yV6(42wn%fJoOcGpws4=49Z3jDBdhw~Q*4d2 z^xqeI)3tVxO`@A3z5k;(N!jOfOzI;>pPJV%Hcv5bw&V$zuz_nn_pzq?p3*1y60W6Egz z__3NDt~6%u2zeM+;CDX1Uco%6c~>zTIomcPD@FB~g;~r)Qjz>5ykt&WY*^QI zD0%o5h%c#QkVcPp?#Uu_%sjVoBK^#X# z;`}fSK~=N5s8BH9wW|+jMDZ|yE)AS{zj;&Yc0S$a(~`663jF@vvqrYTEE#%Hw-KP; zLS6PsWb_liRo3(slhSKExO6+8yGiHMmZ#HJ8n7>No?pBBYAL_kXzvy7b?|ZRr9>Fs zo6<15)bT&uosGT5X*(=X!V$pA4wVgwghH?J7SpA)Q&dNtb-}TFP^H6@6Hy%1r@fXz7PM0vjs6R}>LM z;!QFEL@9>ly7O=lyg+?ui1jCl8#5UT)qr^vpBlz7QEJc|%c(<>*z%0C?6Mb$_e-*4e*1lKNM8#EjWRZIk9Vrk`sz=GT)_4l9IBX@uGerwlT+by0md}~5Mj4qT=KCpRvRmDFc2s_ znk86dMB|LN{A<*m?so_GFr8}v~o^ta5{qkc3O32v>Mz2#`#%gkglwI8f^Yz6_blE)_V z7>@w*Ks82K$tv$JJ64+9@FL6t^(t(dzA)rX%=^Zf+YAsTAM@U5tRq(Jcoh7* z>Ln>~{rf)l0!CcL68zpG{N60wY94O2jN!5sOiYnBjx~9}#AB>YZ)i$y2&XrM2E+5= z;`xZ%4Rhz;R`9?E!VUO1^P`l2eb@1;Y)aoxCl9DXA95+rGW$jFU8q z#s2RGpqOOg$BUWE)!Jq-=8$|_RFX7bY?396NE zC=L=zNOrT7eo~oKO!`r&-`d$`Y&DbOoQnvzkN;V(j^u{i_tzQ(9kv&ZLx}q)NN%6s zkxjYJzd@|wW=V<6A9Hi#ugZ7ZI`}}h6VD-P!p1AVkoPJ{I|Z`uEnq<2HG&$D*k314 znRs~K5tgmX8>%4z;}9@Mb~(o_)iO4~z)%<#Q_mv{lc;ytP` zdKpjN+yAw^f`+==7!yOXxckWKG9vgBjnHx7mrF+1*0~nJ3s^8$;twn_aI5;gULuhk zsi5}ImN$XtQ`XO69^n6bPC$qWOoGt>2)Nw=01djOZi&B+-5dh_ExTbs=$k(PB+LTE zaO!CSf%mt()Muh;mPgj&_X|%6W_%xR=BL1uF*GA(+i2zBvjXkBG#az4cX^7iBmN}C zfcowk#z2nZvd-W-VKDC_F(MIaOdJm!Tsyb#{1_KNQE3(FGDbc}H5iGVM%2|4MO-Ws zHbapiO!e;*mjD4oqevO5!+>)1IxzwC5}tZbnLtD^jL8lFbhQ+Y>oEk5#jt_ZYtsdp zXoV6tLCO#1%*Nl*e$StR3+w1P*jN0D5M%5`0wv7Uz=>CW1QQR50C<%6E5+p(+6a0I zirkxpvulE!K>UY_0fdQ))sCJf7EG)|3x_*InPeC2JFKYqNyashYjdJ9KW6>@IHW`snS=}xgale}9adU#M?8qiB5js$oPaz6F_Z< zXJ^>bRmi5eyeJ7lhD+x!8wde5%er3}4ZW}_7?P#4s3|DmckFJ$14f3D1hj{aXBJ;T zzKwO3-mn^q>G5wX{eQSRZ~(JWF=4M7LNLJcseAJG&Z8e0E!lb5JRoyf84}%moE|}j z7Ri*0AZEwBH$rx)aZh|{4nNV6?d*6LvV0n-)`UBk;bqG2QVa$i%^1)J?108nUlKvs z_nl4@eKHwjUGDy*?hYSqN=H0Z!KAP1+6PAzFfyfij|Jj?!kOF)p$3){By|#ho+UIk z=a`TgOp8<1Ap4kHI9wq{6k1MY@o`yLe~15CP{ZF_HORCDgjxI7_6ZwjEAD1Z+{FKM z!m?g@LqlxFcRi5ozt5@vjfF_W1mPdG01M~&Gv9#Jh1pUE$AwMl5#1zL zTJ7*z3XN~V(V+g|@yO8&8A8Ez;-fF(j#t6lQEE#;jmc1Igk@(K@ly zx>A9xnpeMNhhgb>iF(Z!W5UmTcHDNQ+VdWiZ-K}&m6=|%tJb?e%2SP2@noz4^)Zds zj+cgkybdndn+@XfswjQ=3s?g@O0noWN#C6=H?dbAMSw)(6cRz?psC$!s^$Hy-)?`V zVMK3qaNmheRZmB8X}5e3fhU{ju_d!RQJK>GUo+2x8}k_66@VA$ftg>gbuBuQvF%S; z_5HMT2%BrjF4&F6Zt@+_pc^bmeIzNHa=-T76vnM}cmbI@_X7+0Ca5vK4ATiY5<@-l z$pELN(M;$`8u;#$gOHvB+jMZkjdezZB_Hi*J-FtQZPA|SQof%Y`4gL6NN6{@e}BE4 znF=|JG3;}X8!qZ5ib`52>iz27ni222H^3(y>pOpquG!Ntc00PmUw)Cx`8W7KaO!{Hp;I5W{(?ItM3&yd z9f@v%tz7?xQ~U$Bp5?;-3qJKRLHic&bn7$!@jNHt+i+*%>fvw;_o4y;|M4Zq8yXaA zsINhYM~8RYLrYWj9st~S1_L;^=k6$A^5Uk!_0qKT1puO++Z~k7Pecy@EP$4(l1V_$ zPROshRYc-@&0Qv;odsK4uTzN)>^>Y;+}O^iTX9=j*-8X`NGme^#eGHep(2_XKyf}t zsSFP18N`zUz}ru#HOtPCmGb>pWXb_zS4U@xxl8nU-_I2T&6IJzXlTzIs1M5tU;|gS z8;2eD-a<~=MD#CrI{Ndj*0>eV2Mt1%A>?p0CR{ODL>kt0-nkOjtcgT1N7pl;Na6nh z?Pcl$C~7h)UkHmW=m99-|J0YoKvC?s1`vAi>Mu~UEfLSMFeyNQ$^umPJ}(`d8=U=* z{%_MT$Tl69iHEQOmY>9!q1s>+xfQZ>g&A~qqrqQ8gi7Z(o^fs~>R`cuAE0H#b8Voh zUNLxY`)@68FgypI%Sw6jhu9Dl;N|6c?wDVS9C?SvLH;uW_vtVWC?;7B`wJ=DZxL;a zd0E-|( z&Hhk?vH&*w{dxaocA9?h81mh)O&(7 znc!%yf2+>~Tzwo9A69HZqcOQb$)W1|Ne2ZzE8J+q6qMPe!G*)Q?BTQ*(nR z&;{v(Sj5hKvMFZf8$Kj_+%>g$atK)X2_9D^w=fMb?zVdPxQ$p({26+qi4=$#A;TQx zd&`MwBIo>+45V+caK;$OF7p8Q@jkcuulM_hv9kknYG5DQHi6TgO@{kz*x%bqJ&pla z87p~NCynn*n%YleCZFNcjt)7lP|eQ^R5LFBF4w_utz`NzvyIynhvVfY51g(AZ(DLN zwO}u>cLn4jiQsvrLjyB1RnsfO*bQ2Gi;3bEje$Uum|#++j(h)n6>awW)n5nC1_ylK zNaF>(+5!BMuvz+p?W)!-J7L)Hk;x*^)!u$RO+^6pmk0b?j~WGz4O;<^ETBy~e%h)Z zUxdvQSu9{J2i&9kLa#;tYi7w}?>#i@-AujT(5FwZ23Zdumbfi1VeC(xOVDQZN1UBY zj6i)igddETgsQ_`Tf;m>z?ngSdROJT9<)_Fu&QJ1}Z3M#?gM+XIar zm_=z^20lZ5t@WgKM|WWE*C4Ramc&5jL(HH!{UicJHA?W}{1f@|HHTfd4B_FiLQO?L zTu_Js-e^Ccpwk+WrZAROMS1yR1sKx#bE#pbYT)CL2NRIADD({z={XeqDjwdvo^$^G z0CF}_O?lQ_&m^)$xRcRp%CdL;Tp_O}kZ!KwGPf=ysp)B>X81;HJ5urb**d1wAH`G| zAst1I_T*J%7Y7;avI!>9tA{mq+1P*`;n@gD#7E%Ikm!;!r0GlY_L8<2jNEAXqL%)O zcfi+;YWZV{B@jwkZGBiBAAT0UH=$#G&)Cg5&T zd8~!RMP-Zi?3Cj)i{1wsJ_d}0I#k*2f%3fttIS6j4>)3~I4}(2D0ig2{tUcqn8+?f!!>U~r&&SL~YLI+1y~AvjVYi$Q5A)0&4DVEY z06K_;BA|>yAC=-kU0PtN4cOvOMAK93_Rj+n#Bj+yLD`8a+40}gA#q+vl?mUs)F$nO zSJG|iPD+Qsvfq;(`A=ji-Mb^e1;WK{GTb(0TGKA#=xZ;7(d(g~r(q$Lyg0(kUv!Kg zV4h{++8IQ5%ZFyfv3c9&UWKP;HT_RM*>bfJmm$% zHU9!D8}p3PCQN{7dE}RTa-LRypezokp)VL{mq`p7T+HN~dcVKEba!|rPR2p6rcX@vY@7ROs{YlkNq4y?p2-yOIvL(hMit8dH#FI zO8P0P__T+OYWa6qXcEMWYROvlP}kzX46c}v1aILq&{@L0`Naf?g;u9U)^3H;fQ-Z> zd6Q2S^@`;qHHME_BFvWPY~Vgq82K6herZ3zZ7J2F6APbh`~f^sLyT{@wE^O-0yQnFDx(G1A;{Ycz_|ioZK*D?Wii$la5#2~#{?g)I)m%%S zDC#CMxBhwt%;he3I5@;l{)sf)&+GyOc{fSHxcf^4D62)jD(DEm1Ln0&JJx9171Kb~ zc<&4oX)^RX_-dgcRb>5h`_^W9;K=9GI61sdIn^{LlYHTj3K-NbCnAW8&Np~q8yKN` zQCGWw0aQnmxc<5uGU~SnTrl>mxD~*EgU&oNr>HtKG!B4KIeiz3**YSRdHjXCX+^3p z_{*T{G5)P)8LaZUsoaCX!k*ntMeC5q;P$yME!KBt@dub`j)qk)_yQpXke`k=(15c7q_7h^jV$iC@Ga)^UKFPuOUPV0AJz1)I z(BmNFQf2?6K^n$z`G68UDuZ~wVn#X(K%iQ7>-V_Nh4`b$I zoaf}5N#IYWne@gVY;!D>n74!a7u^Sw(s~^WKpm=Bh?{HR{H|GXDS=A7qtjba(xBwWHH$mJW_{->BLhhK?>XWfx|Us^86#aJ4x4%u{5eJ*Fv0~1MlNKKqCcm;YdNfT*UkSVQz ziI}Sh*t2hoDw^t`9vipqJ)A`MP55$nVMHAyHxg-f{OX zRG!aD{u%gcOVnUUNC!<1XR=F}Y6o96_z4togjKE*Rd$$X&Rl#1%TaG=0$a38D_bWH zZ+bFnK6tK`-^s8Lj+UO$bKS0uhsNKrM1#h~Ih7+ZShz;f40+061&ssnb1>3-?*Y8( z*Z|yp9-(aI+5T<2WeNl8T>m~>AqcP?dV{%{zP_Xm4tjGjl#thWi4_Pw3g*a{6jtxk zKO{l01Q#u`jl8hhv#H(~e{#b)=b`_bskTn;U{+Y?K9e5QRHUaCr4aEMTw2Jna&K4?Zs zYFZy?8G>&gkSXT*``HtvuTQpPNeuRhfnSszJ$L{O83_Pp1+zk9Sg)nwx?lj0HTfdo zmCG|ptc5Mm=AiK+j(dx2=hYi6IOGfv$6|v*7p(WUvxL?|bht(?uzeaKHA3zR#|t;mwj4YjP~szmvfES=5D>yctuzSlA_7KBBM^kgAWSA&WN zU+uAhzbFzg&|+D%@Hgc&0PL_r)Im%&Md*&y$is{jG>lWfWT7 z5;vTGU2hdNc|DO-B=$+HbWx3aG_CBXq@X~kDt{$DTpx(kAWwOs#nYD0jnnXUOvTWg zR~vF3&&+E-k!OB>Zy)>22aF^HzSBrmZ*WBR>{K&hqw2qWWWbi=rC9srZ_32&DJQcD z%2eAB9BJg9d!E~7I67;#>6mT2NDOpz3#>b9v&k}T)A=1n9;NS)wTWyM-)PPhSz z(PfdqBOuX%GjG>lEo>R+=9R&O@NF(>Xy8+$3#4z;%}L=8-q^?+{^DoaU5 z=x^KkaJ9oh)Pc)lwU0Hhn*EWMa8rIpfI?T}qQ#1%YXH=Oxzo@pNt$O0Rk+tDiY1Gy zwA)+}#_agK@v-R$0ERu*lFWcn@CWJgL>e!9uBMDAvU@O$;HR0A!pYA@0uTy|8%Y7k zDaBkI1c@+iR=Nfb^2xq-oG5rn7mMpXf-CUQZ9+PKkva5*m(cS>VDkKe6se#8)5$sb zb%Vi#&pg#OS`V4$3~4prT5CEQblk$c9NC!Q#0dCc`#?q>L^>)1Rb6Jo`s~<>WCpE@+aeQrrFAX1L4IV7AmwB_(0d@z0#M`6Z`^j*E9hx0!L8&?abAQ*^L1^tMf4g0Q$ zCtKF3nC7JkPeVQYB8M+RO@8y?+k_7Q8E5nQ=$1uu-`~g0a3oe2a5#bVXySC9>#iET ztx*O0sMG|2gs_q??>4PlwS~+r?)z&1{O}I*7yi(P2fRF5AySS{SU#rD49Rhi&w8!? znrP75XQaBWP3x9iA(o&;slXhVX2(&eJ*o%b&wvI$9LME zY0=uut530;7b$Oy;Xo5DzA=cn*^TsSTpWqfT4;e=-Ez_mRxL97IG54S6)17@|D3c@ zA3X=Lpb?L^@N>>Tzl9{nCM|RG6Hn^j^C#lF z2b#_Jy?4Rhs*y|3z4GW<%97I$HRu$`Pf9EB(D{=i(bA-Gu|xV{$!vdbJ$P8thEf~s zMPrQ?BQV5hgIq{4C|?No99$_ow{Z{X2Qbyy+CIgMJlOV&qA;8ZGk9HML7V-I;3gk< z&@yo+rVbezE*P@-#|ekhNb3F7+=Vba@6c-w^J3=?@>`#pVX`EPt!($2Wrw`o?-aOY z;FTxn^OiRK_gNh`k9Np~#~b}-pFLwgw*ngxey_SJT{79 z-`6b`Ksq;blaa8Z-7E(*zm9gP^IK)~ZCL2xV_`BNOpN88S1&s! zFwko-VaUXZX*dz6FjMhqa(lWl(IpSq^nqg z`*fHvu3a{O<}CXzx@hwlfp*V(`HkH0BI5U?xDy8OgcVfh(}JD5Nn7(N--gqR8NZL>AN+cz}x zXBOj+E^4~@^P_z4gKs|Le;{b*Db9AV(0-DMe-?+$qNL#(ik%M+ozn$7EgLk0*!)7Z zV$#=_mptgh6o4Gpkav{({m`!|;5AT;;lja<7f;J+fIoPt3PUoyzEhpZtv$_;Jj|kv z_P|8y$hb941IS7gUA{|%y%;>NVApeO2Kr&cXw=}s|1Dv08`M+yuzoUsN%ZV-FSUDn zJne^@slzBrGe3}q$!Y?-Ng5C3Fyx7Q2HFC(a0uN4`C~97ZN-$6L2q@6mOWV^$4sPS ziz#6ptsh~{hl7sD4A_=M=rCG_$l8#hHg?z3RWoXTEb|kd?Wq+C_69xNz>#*R4N0C510Vsv|?VgiE!U zikM=NPEasxFqp8U`NK*Eh>{k8+iUbixVfMqQxkue**JBq+=2Bv;aa4@;Bf$Xrsz}#dXs!}g3 zwl8|&O4x#$`bGL?_PBXk5#$D}kwU#Gk1*Mg76()KAyx|bSM_bRE)UwiI@uL1c$~X5 zM*#s!p^+4uY@koa7!FLyy)syf3gM#}uzOO=+=y#!eDfS^bZyPl8z~a`0&Wbu4tySY zUw^Y_+_OndXtxE7okc0^tNR_|q5unqVxqAD^kx6ocJClS0d&wo>=*fGDRUJr)0Ut& z#N$?W6tfqLAgt!+SayXoq=3FwY$&`{1R(YAeUrXdk7&COses3;zdqZm$pfDhyMM|c z{2-u8JJ39`!M+|+p{9WK)7?KWmEfzqM4kXT$2U!M(( zxv!`kl$%K@aa@ zrc%ZmP(BJ*Ty)r2pmvbPAD=TaurS=Sp;> zY^aWLUq9G)f#;#}iP?brAy+R*UbVgu%lnzJmZW5s49|Jn=lgvTeI^T7s&^`SJOr+q z>0XM*Q4JJ&bTVSJQ+SS?`gFkcst${fQa-&UdwA#B15b^HMFQAU#)fxmi@?n*YzD>N zGL?H@wos+JNyYC4Ui|Kuf#L3mGhW4#{$>R74Bn&9A#ipiDLB#qPV9rBx?sX#$OI@$ zyjJ1i0P?RLmFq+?QEJCsJz23()|-of_Ht53m2fIR@emiFP$~E#>{R@f8!O?z(R8MP zP_^$LKeO0(%94Ex*-AvhOr?-So83@IlASDrIhM9ZB1B0u^E?q{8OgrQD56w$BkRaA z_I1WO%YS|^{x8pYbDuf)x#zyF>-+g$x6}fU4}94(23`^7y_IbXi*7-O^G^T0C|7Ly=f8-&^v7(tl$|(f7;b`J-d7&V3iZCvo{i zIk#MEA`@>GkS_7w(RmP@H}gy8u+Va$2#M#MiBi6oqUf+f^BlzSwV<5tZa9e`27V5_w`c4xGZQKY!^}$0cWVX4 z(>AZ=c03_HGh>|rv~?k-O2a3WTv+BR4xXci-?@qsqu#D*kCyBN+02wQd7$N{;0Kkv z*BP)5v8gSajoWk#Wvg{VkTDgP&@hPGKh8bY*aREN-v*nEf(yE}S3mnbT~>k`#y>nf zkY(m*0I~MofcPvZDw;q^)NnNsk_L&#B1G=HEk{sni{|9FwJ#D?IMtT&=q+4kRmGQT2hQ~3MFEpm1RA0_?^nU2 zNtAqriv$@OH|uNshXvLh0}>AD81<|^Y>pj?FWZD#|AlP7prIz7C5TY!LuYuA6W1-) z6IJEb_fo>kzxp#30nQaxAyLqI%6(F~fC%tPGp21SHv|B&a?e94pP_45uebc>>%_e0 zCiH&}mmt<|y^!YlgCwEA`)UpbBvHs^0N6c#FZae!~*>r_x0z;fR(sC+m8mk*WP96kb^lzB|=)$H~tQ zeox$?G`nJ^fWy&f7XSz;4AbVLguQ&o-KELJ4h1lex4`TYaPKQj zLS%m4p{Ii!);+9Uan8&Kvg2Q9ws{`;*~@-wU1^H$4l3e7gm7&K&|aypWPg^p4GkGO ze|Y+lWzWw12rbIC@`h_qha{3u@#W1!Q1=}1qtHW)tWFdlSCcd)oT-%fY=HbSCMSWQ z0?$daUBo$cG%V1YB=TF}n}+2s%);kY!2pGL#5oI`8DiyI-I@&+^Fsc>aPLCdugqYg zon5~*T!vL7YcX&B`O-H2Tqk%!0PI9^@8&y-CB9P!tUisEXmfI8?)mR8%ch$?1ss#9 zbz9o+Y#+^Zn)A+Ol4xEX&qR#W!#ZKmWM z3$~6Pla{kp_z;!wBL{IDk2}>I+dn9k%{``lcA_Me;EJV>^#9@8#|qhHiYe93dxd<9 z$x#(>SL9(BUfFVmW|RZ3hoL^=8K|U(Tk6C6f7*G0L3hvRpwx(?d%q7(MmAwE~TMA7zhi!fE&MaWT?F6v5qgTnJl9E;qXGPdBVn1={_o7@Z70@vOhCS?h4SmHU{2t2CFY&uR} zx$~O*4aa3jI$IdX_2XhcNN#ILWUk}c{ubht+-}9)Eo!nt$e?X^#VemE=DWYObH^c{ z8S|HVsUtP62im-eE3A=?b!cO*8f|q$Zw=7UE|dD8$5&@Qgs{shuWQZ&e7X=1x7Iw= zes-9(AKF-CQ9X&Bo5Ef@i*7o7B0bO$mS_m%d&vXP>zMV`D?S)e2|#LmMM5 zOUz@gP>%WFXTnMPumqgw~CX{PZzCq zNrc(ZSa($LFMqH1kfOqJ<0m@`>N4~=FHu|KKU!}4>YgS%gv|vsG%%)5jH!cLW88QR z|2Zp2tk+;r<6kz#1=IWz385TAstLdMxiTqDt04O)^d*yL}#gdYJI`_KqT?@PM+1gW!2l^_I{k_rxvoyG7%w9s@oBd(a z?#V&@jhP|+$*tg4gu!&=^Ql>z&f06=_BEy}p8*crmo<*oZrt@Xgr4nkAUADy#Y?VJ z6WM1-L>|iLJ)5HHOKvKpPkZh)+$=$sUz*wk|C)MFvn8q*%?qzrg69c=}CvnC-?N13};v41ac-;VKL z8&M5A61&8ve0!!01Lob}@!nG!@h*#y9-S!vuNgm_PrYgqRqrA)K>Gt2!fdzJivQ5= zr=|TsmBd=Ol6!+Y4-N(5l87zEoB+-ezba|P?bC%zb=xw-r$b;x^e>Jv?|i2>)W)

KQ}T{D{oF3v-31dU2H+GzBzNTbzDt`s=^s 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 Dgr(R~ literal 0 HcmV?d00001 diff --git a/src/main/java/net/banutama/utamacraft/Utamacraft.java b/src/main/java/net/banutama/utamacraft/Utamacraft.java index bd818a6..f403c0c 100644 --- a/src/main/java/net/banutama/utamacraft/Utamacraft.java +++ b/src/main/java/net/banutama/utamacraft/Utamacraft.java @@ -11,6 +11,8 @@ import net.banutama.utamacraft.recipe.ModRecipes; import net.banutama.utamacraft.screen.InsolatorScreen; import net.banutama.utamacraft.screen.ModMenuTypes; import net.banutama.utamacraft.sound.ModSounds; +import net.banutama.utamacraft.world.feature.ModConfiguredFeatures; +import net.banutama.utamacraft.world.feature.ModPlacedFeatures; import net.minecraft.client.RecipeBookCategories; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraftforge.api.distmarker.Dist; @@ -46,6 +48,8 @@ public class Utamacraft { ModMenuTypes.register(bus); ModSounds.register(bus); ModRecipes.register(bus); + ModConfiguredFeatures.register(bus); + ModPlacedFeatures.register(bus); bus.addListener(this::commonSetup); MinecraftForge.EVENT_BUS.register(this); diff --git a/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java b/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java index 3b4975f..26a5b71 100644 --- a/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java +++ b/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java @@ -8,9 +8,11 @@ import net.banutama.utamacraft.block.custom.TintedEtherealGlassBlock; import net.banutama.utamacraft.block.custom.InsolatorBlock; import net.banutama.utamacraft.item.ModCreativeModeTab; import net.banutama.utamacraft.item.ModItems; +import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DropExperienceBlock; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.Material; import net.minecraftforge.eventbus.api.IEventBus; @@ -27,6 +29,18 @@ public class ModBlocks { registerBlock("ethereal_glass", EtherealGlassBlock::new); public static final RegistryObject TINTED_ETHEREAL_GLASS = registerBlock("tinted_ethereal_glass", TintedEtherealGlassBlock::new); + public static final RegistryObject TUNGSTEN_ORE = + registerBlock("tungsten_ore", + () -> new DropExperienceBlock(BlockBehaviour.Properties.of(Material.STONE) + .strength(6.0f) + .requiresCorrectToolForDrops(), + UniformInt.of(3, 7))); + public static final RegistryObject DEEPSLATE_TUNGSTEN_ORE = + registerBlock("deepslate_tungsten_ore", + () -> new DropExperienceBlock(BlockBehaviour.Properties.of(Material.STONE) + .strength(6.0f) + .requiresCorrectToolForDrops(), + UniformInt.of(3, 7))); public static final RegistryObject TUNGSTEN_BLOCK = registerBlock("tungsten_block", () -> new Block(BlockBehaviour.Properties.of(Material.METAL) diff --git a/src/main/java/net/banutama/utamacraft/world/feature/ModConfiguredFeatures.java b/src/main/java/net/banutama/utamacraft/world/feature/ModConfiguredFeatures.java new file mode 100644 index 0000000..9dc0b4f --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/world/feature/ModConfiguredFeatures.java @@ -0,0 +1,38 @@ +package net.banutama.utamacraft.world.feature; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import net.banutama.utamacraft.Utamacraft; +import net.banutama.utamacraft.block.custom.ModBlocks; +import net.minecraft.core.Registry; +import net.minecraft.data.worldgen.features.OreFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; + +import java.util.List; + +public class ModConfiguredFeatures { + public static final DeferredRegister> CONFIGURED_FEATURES = + DeferredRegister.create(Registry.CONFIGURED_FEATURE_REGISTRY, Utamacraft.MOD_ID); + + public static final Supplier> OVERWORLD_TUNGSTEN_ORES = + Suppliers.memoize(() -> { + return List.of( + OreConfiguration.target(OreFeatures.STONE_ORE_REPLACEABLES, ModBlocks.TUNGSTEN_ORE.get().defaultBlockState()), + OreConfiguration.target(OreFeatures.DEEPSLATE_ORE_REPLACEABLES, ModBlocks.DEEPSLATE_TUNGSTEN_ORE.get().defaultBlockState()) + ); + }); + + public static final RegistryObject> TUNGSTEN_ORE = + CONFIGURED_FEATURES.register("tungsten_ore", () -> { + return new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(OVERWORLD_TUNGSTEN_ORES.get(), 7)); + }); + + public static void register(IEventBus bus) { + CONFIGURED_FEATURES.register(bus); + } +} diff --git a/src/main/java/net/banutama/utamacraft/world/feature/ModPlacedFeatures.java b/src/main/java/net/banutama/utamacraft/world/feature/ModPlacedFeatures.java new file mode 100644 index 0000000..a7a4126 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/world/feature/ModPlacedFeatures.java @@ -0,0 +1,40 @@ +package net.banutama.utamacraft.world.feature; + + +import net.banutama.utamacraft.Utamacraft; +import net.minecraft.core.Registry; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.placement.*; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; + +import java.util.List; + +public class ModPlacedFeatures { + public static final DeferredRegister PLACED_FEATURES = + DeferredRegister.create(Registry.PLACED_FEATURE_REGISTRY, Utamacraft.MOD_ID); + + public static final RegistryObject TUNGSTEN_ORE_PLACED = + PLACED_FEATURES.register("tungsten_ore_placed", () -> new PlacedFeature( + ModConfiguredFeatures.TUNGSTEN_ORE.getHolder().get(), + commonOrePlacement(7, + HeightRangePlacement.triangle( + VerticalAnchor.aboveBottom(-80), + VerticalAnchor.aboveBottom(80) + ) + ) + )); + + public static void register(IEventBus bus) { + PLACED_FEATURES.register(bus); + } + + private static List commonOrePlacement(int veinsPerChunk, PlacementModifier modifier) { + return orePlacement(CountPlacement.of(veinsPerChunk), modifier); + } + + private static List orePlacement(PlacementModifier a, PlacementModifier b) { + return List.of(a, InSquarePlacement.spread(), b, BiomeFilter.biome()); + } +} diff --git a/src/main/resources/assets/utamacraft/blockstates/deepslate_tungsten_ore.json b/src/main/resources/assets/utamacraft/blockstates/deepslate_tungsten_ore.json new file mode 100644 index 0000000..e038ac5 --- /dev/null +++ b/src/main/resources/assets/utamacraft/blockstates/deepslate_tungsten_ore.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "utamacraft:block/deepslate_tungsten_ore" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/utamacraft/blockstates/tungsten_ore.json b/src/main/resources/assets/utamacraft/blockstates/tungsten_ore.json new file mode 100644 index 0000000..c29c4af --- /dev/null +++ b/src/main/resources/assets/utamacraft/blockstates/tungsten_ore.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "utamacraft:block/tungsten_ore" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/utamacraft/lang/en_us.json b/src/main/resources/assets/utamacraft/lang/en_us.json index 46020ce..850f391 100644 --- a/src/main/resources/assets/utamacraft/lang/en_us.json +++ b/src/main/resources/assets/utamacraft/lang/en_us.json @@ -1,8 +1,10 @@ { + "block.utamacraft.deepslate_tungsten_ore": "Deepslate Tungsten Ore", "block.utamacraft.ethereal_glass": "Ethereal Glass", "block.utamacraft.insolator": "Insolator", "block.utamacraft.tinted_ethereal_glass": "Tinted Ethereal Glass", "block.utamacraft.tungsten_block": "Tungsten Block", + "block.utamacraft.tungsten_ore": "Tungsten Ore", "block_entity.utamacraft.insolator": "Insolator", "item.utamacraft.bulb": "Bulb", "item.utamacraft.fiber_glass": "Fiberglass", diff --git a/src/main/resources/assets/utamacraft/models/block/deepslate_tungsten_ore.json b/src/main/resources/assets/utamacraft/models/block/deepslate_tungsten_ore.json new file mode 100644 index 0000000..50bd100 --- /dev/null +++ b/src/main/resources/assets/utamacraft/models/block/deepslate_tungsten_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "utamacraft:block/deepslate_tungsten_ore" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/utamacraft/models/block/tungsten_ore.json b/src/main/resources/assets/utamacraft/models/block/tungsten_ore.json new file mode 100644 index 0000000..9bc7b3e --- /dev/null +++ b/src/main/resources/assets/utamacraft/models/block/tungsten_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "utamacraft:block/tungsten_ore" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/utamacraft/models/item/deepslate_tungsten_ore.json b/src/main/resources/assets/utamacraft/models/item/deepslate_tungsten_ore.json new file mode 100644 index 0000000..098ec10 --- /dev/null +++ b/src/main/resources/assets/utamacraft/models/item/deepslate_tungsten_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "utamacraft:block/deepslate_tungsten_ore" +} \ No newline at end of file diff --git a/src/main/resources/assets/utamacraft/models/item/tungsten_ore.json b/src/main/resources/assets/utamacraft/models/item/tungsten_ore.json new file mode 100644 index 0000000..13216ef --- /dev/null +++ b/src/main/resources/assets/utamacraft/models/item/tungsten_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "utamacraft:block/tungsten_ore" +} \ No newline at end of file diff --git a/src/main/resources/assets/utamacraft/textures/block/deepslate_tungsten_ore.png b/src/main/resources/assets/utamacraft/textures/block/deepslate_tungsten_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..5c252633d5445326fbf83beca38f065e89951d94 GIT binary patch literal 2516 zcmai03se(l79Q!gB5b!=!GdCK7@_honIu4H<`5JU)Bv#*kcSm?$V`%vBoi_d5>U{h zC>F5b1G^NgTN_^pB39|*0;kx5oKmpVCt9_oM^vh)=qiGB{{#(C)@{!Dlid04{qDX0 zeI%Qsmn?eSX@(O7L9fdeOJl$%%X%Cgz?#4rqS_KV20dONv}ex5zJ2gHo&5k8lPj8)dFDTboe)Jsh4@B~9#VRxc8 z8Z@@}aRowX2rZ#wXrRv@=ZG+qqdAWY%Zf~(XGrBs)UC(_bx<3*+#b+4`WIPiwd3NU zneYs7anFnJKP~9EOg(|b5Hw{pD2VV3kk@S6-2rc?#6VySAq7Va3wVM64qw3G1;+7( zXizX3!1L#Umt9#-;iNKiqH-|G3q<*%WuuCqlW>f|{zTPY7SyUZ5(;SG{~O1sjfB!r z1`ra6Jiz986p~3K(FRIMY5+#ZELy;pg-e8dkxaD3K-R%xhu{j7AsG!}lST$DOv8*wBcg`1P8X`dbSg1y=HP@9Gin$( zlrid5G(+fCfN>8&tP`mrpR?Gc7c?QrI3FRlhD8^XG(#CO$GD9p(#N~C4K|x?YgZIg zSTh#GdINhbfgLxSLEi*cqfsM;O=wwtyP|7ScFQ zlbQgGV_V1GmB`pkUPKmxOo)9X@iD6j*o`~`D-Y~W#J)U%U|+w44z#QREZ3dG*{%>Y zX&nigZ$i^SkWY!Rq|;yezH95emVEbrq+%GKO#J@T$5TBBuQOgn@4xnG@cH5Bfu4s~ zw&9hUY2Lyd&SU2bercBc?V2PPj|b(!0YO_ub#!NMPQQ5H>dsda0{7JJJ>gL+`YyjP zZ_Uvoq7}CTW?eQ<|EAJ6_U&C|PO(3P-q~;XMSl9g(!tA3=W0ITO^Z7_wUbS4x5S_{x{JJ0+KX56!)` z=&MsZ1_mbc?sA_flLq=FKceNyrNs~a~y8BFbr z7@B!i!pIwMIb}TB9orGi8HO+~RgWsW_Zj$+oT6WxL_?6Xi}g%`%F5j#$YG&O8W!hM zA}{$m%_YpWz*&zVhvQ&&h~bR=HbVG;0+io<2O; zHS6Amg4=4bV|Pes8J5#aTZ^vKhd=8kw^BXp8xcoOfB!nqzi(~m?7kTFPQ}BAoA&zd5KI|l{blEt08dMV<#Jn_e;8}| za%R~BH$}VgtqpLXxT5a%z0~wKp)Fe)$~uf#?t;UuC}PmU2d~qgE|N1KJ5x_ ncJKR=l`I!G9_SFX{O(XO`@N0M#vAjkf5v3tOQh8cR_6W}MenCJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utamacraft/textures/block/tungsten_ore.png b/src/main/resources/assets/utamacraft/textures/block/tungsten_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..1d16f8a6f74aaf1f2d21ed87de45935c99be7d72 GIT binary patch literal 2472 zcmai03se(l79MDQh59I{MRC{Z2+M1e$qQ)aB)E_uk2W3%Q4-494w*@q&C_H;LKMmY zY}uo%6=`dEs9Qw~wu-cr?NYVX7TZ!c-DM4S%i~lm?luAqg>_CssseG zK9M1`V}L+U(l~6_>kJmmE<(J#82IivMiJO6LTg2cLYfJSjb;*#W5u!9NFoCknh7-~ zlWcgX40a-8mW{_Unl&g#AP}HzF3ROHfdtc1WT0_7(_mTWq404?NQ=r$ znP|#rfIXaezR^mH5Cq`xBhU0EKe@s3FnVwgs2w+<92Og$DQqe*(nd>x@i8iXc#a~W z@*6Q(%{s6DgbF2fq@Fa;79h`=Wr(y>(=pF-%Y)3Jrz!Pg#68FyagZCS)bG$N`bSag z^|So3&?$xB;vOd9ziL?IMJ5uJkrt!XtRhniL0s#+cL%ItVl#=;qy#Jx!ew)LOb(aH z=F2(pSX=_eW5=?=;}@112})fwS2zJTStr6$AaDdKpJAU>YSWpTW+o@`;6l%3QmBos)s z1yrI4;l%$8R6Yju+Rg?I2n_fLJ^94a^|*%2p$NLb&ozDi0%_3v9PngCXZ5tfCIbcX z$o1Oy>L{i$5t6_~XP8mWfjo@`3kelQQ?!os?tG1wq@#U1-&RL?x(n0c28{@@GYL|S zTXi&&NLvjW3r!kc0_`qDJsqi|9HDDK$>AL%w_Sw zK$^vADm%+m2!B|0;bN1h4MIllV>pD~(%p6?8dJTN;^|L_DG|M(>hpk&QpxDK9c z=!BqvQVJB`oT7uEs6Ey_&R9v-^7HFED?{JT$8ip&xbWrf;4m`$@8MNh^Xn3N?q!Y- z-t6B?9Mi3ch%aH@4!RVhZLF-(DMP|0>JxZz)q-}5^J>Yc=;$`*yd3_a)*~HZt%9z~ zT|2gaa8mHnFz=VW_En!Bi_TuVzm}2x*Tj)`&6lO$Hf_4od&bqWkG(>EanaJ~zLtvf zJI=+vIdc6Y)6NX-&a+3)28dZv+ui>hL(V)`A9Lfaa~t^FK-P&C^ybdNGm6Hl_gX$# z^Gf^&?`7QDy5(~E74?ybk9M}>!T7FaiN6XZD@q)P(J5}(#NQ%fW3Jeqxe@u*^T(@| znib^{vco4AR{r_d7ej*gz7t6h3hU&9_7m#X6YYw=kh0py?@QdJ|6tzk|8UqT{{DVq z*-xo|`tptO@dfPbtVy+Ud{o?x)&KU*w%beUjlXf1A77Q5)V$IbvG=+ou!>V~`qjxh z`Ob{HYX-!$^z=`R!dnNk|B}GG2jStGK~3@12jE9?ktt1SfuNue&kBHQ>q8+ZaCN#Q zNglOFBy(y*l9t~uv<0tJFWUBc#U*&&XTdE|N#XDpt)cSE$&L14#{HBjo>^X5nfa7s z?BH*d{qSNmS$jmdjlcS)V`&!W zknOSnxMtVD}9mP4(jcxm9JePg`WDbtAzVsL8Pr8PRN*t4Ql}Eb&m4A}mX`d=tTk6Wyit4ry-wB>>%Vlbr4@R%` z4)lJ~RMYBmxvg3KDa)SBS{{&A9p2SC^~|Z~ho6YbE04n({t)?1UC-z#@bvZd4G#~0 zMO2f@{Z}Q#u8;RUIMv^L$Q0xrtLeVho9niA^a-7H7lvFemtClixcIwG+6L#4CMQLb stA)zOhfZC0bp=Jf!+xr32YYg