From 84e1d09c87aa2c2b30f0a0ef5245a788c25eee6a Mon Sep 17 00:00:00 2001 From: lothrazar Date: Sun, 28 Jul 2024 17:57:00 -0700 Subject: [PATCH] add lunchbox right click to open so feature parity with craftingsticks; ran codestyle auto-formatter --- .../cyclic/block/crafter/TileCrafter.java | 64 +++++++++---------- .../block/crusher/ContainerCrusher.java | 4 +- .../cyclic/block/crusher/TileCrusher.java | 13 ++-- .../generatorfluid/RecipeGeneratorFluid.java | 9 ++- .../generatorfluid/ScreenGeneratorFluid.java | 1 - .../cyclic/block/melter/TileMelter.java | 4 +- .../block/solidifier/TileSolidifier.java | 10 ++- .../redstone/BlockWirelessTransmit.java | 2 +- .../compat/jei/CrusherRecipeCategory.java | 2 +- .../cyclic/compat/jei/CyclicPluginJEI.java | 8 +-- .../compat/jei/MelterRecipeCategory.java | 2 +- .../cyclic/event/ClientInputEvents.java | 15 ++++- .../cyclic/item/crafting/PacketItemGui.java | 25 +++----- .../cyclic/item/lunchbox/ItemLunchbox.java | 29 ++++++++- .../cyclic/item/lunchbox/ScreenLunchbox.java | 1 - update.json | 4 +- 16 files changed, 113 insertions(+), 80 deletions(-) diff --git a/src/main/java/com/lothrazar/cyclic/block/crafter/TileCrafter.java b/src/main/java/com/lothrazar/cyclic/block/crafter/TileCrafter.java index a791677af..bc3c47526 100644 --- a/src/main/java/com/lothrazar/cyclic/block/crafter/TileCrafter.java +++ b/src/main/java/com/lothrazar/cyclic/block/crafter/TileCrafter.java @@ -155,13 +155,13 @@ public void serverTick() { setPreviewSlot(recipeOutput); //if we have space for the output, then go ahead if (hasFreeSpace(outHandler, recipeOutput)) { - if(!checkInput(inputHandler)) { //Checks input before processing - this.timer = TIMER_FULL; - return; - } - if (--timer > 0) { //Get recipe before processing - return; - } + if (!checkInput(inputHandler)) { //Checks input before processing + this.timer = TIMER_FULL; + return; + } + if (--timer > 0) { //Get recipe before processing + return; + } if (doCraft(lastValidRecipe)) { //reset the timer this.timer = TIMER_FULL; @@ -215,32 +215,32 @@ private boolean hasFreeSpace(IItemHandler inv, ItemStack output) { // This could be done better, but it works so ¯\_(ツ)_/¯ private boolean checkInput(IItemHandler inv) { - IItemHandler gridHandler = this.gridCap.orElse(null); - List inputStacks = new ArrayList(); - List gridStacks = new ArrayList(); - for(int i = 0; i < inv.getSlots(); i++) { - inputStacks.add(inv.getStackInSlot(i).copy()); - } - for(int i = 0; i < gridHandler.getSlots(); i++) { - gridStacks.add(gridHandler.getStackInSlot(i).copy()); - } - for(ItemStack stack : inputStacks) { - List lolbit = new ArrayList(); - boolean match = false; - for(ItemStack grid : gridStacks) { - if(stack.getItem() == grid.getItem()) { - match = true; - lolbit.add(grid); - stack.shrink(1); - } - } - if(match) { - gridStacks.removeAll(lolbit); - } - } - return gridStacks.isEmpty(); + IItemHandler gridHandler = this.gridCap.orElse(null); + List inputStacks = new ArrayList(); + List gridStacks = new ArrayList(); + for (int i = 0; i < inv.getSlots(); i++) { + inputStacks.add(inv.getStackInSlot(i).copy()); + } + for (int i = 0; i < gridHandler.getSlots(); i++) { + gridStacks.add(gridHandler.getStackInSlot(i).copy()); + } + for (ItemStack stack : inputStacks) { + List lolbit = new ArrayList(); + boolean match = false; + for (ItemStack grid : gridStacks) { + if (stack.getItem() == grid.getItem()) { + match = true; + lolbit.add(grid); + stack.shrink(1); + } + } + if (match) { + gridStacks.removeAll(lolbit); + } + } + return gridStacks.isEmpty(); } - + //TODO:? re-write this whole thing using ASSEMBLE? //big change // for (int i = 0; i < 9; i++) { diff --git a/src/main/java/com/lothrazar/cyclic/block/crusher/ContainerCrusher.java b/src/main/java/com/lothrazar/cyclic/block/crusher/ContainerCrusher.java index 1d149bd7a..63a072c75 100644 --- a/src/main/java/com/lothrazar/cyclic/block/crusher/ContainerCrusher.java +++ b/src/main/java/com/lothrazar/cyclic/block/crusher/ContainerCrusher.java @@ -34,7 +34,7 @@ public void setChanged() { public boolean mayPlace(ItemStack stack) { return false; } - + @Override public void setChanged() { tile.setChanged(); @@ -47,7 +47,7 @@ public void setChanged() { public boolean mayPlace(ItemStack stack) { return false; } - + @Override public void setChanged() { tile.setChanged(); diff --git a/src/main/java/com/lothrazar/cyclic/block/crusher/TileCrusher.java b/src/main/java/com/lothrazar/cyclic/block/crusher/TileCrusher.java index 881a4d0e5..7250c4ee4 100644 --- a/src/main/java/com/lothrazar/cyclic/block/crusher/TileCrusher.java +++ b/src/main/java/com/lothrazar/cyclic/block/crusher/TileCrusher.java @@ -112,16 +112,19 @@ public void tick() { return; } if (currentRecipe == null) { - this.findMatchingRecipe(); - return; + this.findMatchingRecipe(); + return; } //Checks if there is space in the output slots before processing var res = currentRecipe.getResultItem(level.registryAccess()).copy(); var max = res.getMaxStackSize(); - if(outputSlots.getStackInSlot(0).getCount() > max - res.getCount()) { return; } + if (outputSlots.getStackInSlot(0).getCount() > max - res.getCount()) { + return; + } max = currentRecipe.randOutput.bonus.getMaxStackSize(); - if(outputSlots.getStackInSlot(1).getCount() > max - currentRecipe.randOutput.bonus.getCount()) { return; } - + if (outputSlots.getStackInSlot(1).getCount() > max - currentRecipe.randOutput.bonus.getCount()) { + return; + } if (this.burnTime <= 0 && this.currentRecipe != null) { this.burnTimeMax = 0; this.burnTime = 0; diff --git a/src/main/java/com/lothrazar/cyclic/block/generatorfluid/RecipeGeneratorFluid.java b/src/main/java/com/lothrazar/cyclic/block/generatorfluid/RecipeGeneratorFluid.java index d3be7fe18..660d63b02 100644 --- a/src/main/java/com/lothrazar/cyclic/block/generatorfluid/RecipeGeneratorFluid.java +++ b/src/main/java/com/lothrazar/cyclic/block/generatorfluid/RecipeGeneratorFluid.java @@ -1,7 +1,6 @@ package com.lothrazar.cyclic.block.generatorfluid; import java.util.List; - import com.google.gson.JsonObject; import com.lothrazar.cyclic.ModCyclic; import com.lothrazar.cyclic.registry.CyclicRecipeType; @@ -67,11 +66,11 @@ public FluidStack getRecipeFluid() { } public List getFluidsFromTag() { - TagKey tag = ForgeRegistries.FLUIDS.tags().createTagKey(new ResourceLocation(this.fluidIng.getTag())); - List list = ForgeRegistries.FLUIDS.tags().getTag(tag).stream().toList(); - return list; + TagKey tag = ForgeRegistries.FLUIDS.tags().createTagKey(new ResourceLocation(this.fluidIng.getTag())); + List list = ForgeRegistries.FLUIDS.tags().getTag(tag).stream().toList(); + return list; } - + @Override public boolean matches(TileGeneratorFluid inv, Level worldIn) { try { diff --git a/src/main/java/com/lothrazar/cyclic/block/generatorfluid/ScreenGeneratorFluid.java b/src/main/java/com/lothrazar/cyclic/block/generatorfluid/ScreenGeneratorFluid.java index 1668c048e..2f10197ed 100644 --- a/src/main/java/com/lothrazar/cyclic/block/generatorfluid/ScreenGeneratorFluid.java +++ b/src/main/java/com/lothrazar/cyclic/block/generatorfluid/ScreenGeneratorFluid.java @@ -58,7 +58,6 @@ public void render(GuiGraphics gg, int mouseX, int mouseY, float partialTicks) { this.renderTooltip(gg, mouseX, mouseY); energy.renderHoveredToolTip(gg, mouseX, mouseY, menu.tile.getEnergy()); progress.renderHoveredToolTip(gg, mouseX, mouseY, menu.tile.getField(TileGeneratorFluid.Fields.TIMER.ordinal())); - btnRedstone.onValueUpdate(menu.tile); var pose = gg.pose(); pose.pushPose(); diff --git a/src/main/java/com/lothrazar/cyclic/block/melter/TileMelter.java b/src/main/java/com/lothrazar/cyclic/block/melter/TileMelter.java index a24368b4a..4588af9aa 100644 --- a/src/main/java/com/lothrazar/cyclic/block/melter/TileMelter.java +++ b/src/main/java/com/lothrazar/cyclic/block/melter/TileMelter.java @@ -68,7 +68,9 @@ public void tick() { return; } //Fixes sync issue entirely - if(level.isClientSide()) return; + if (level.isClientSide()) { + return; + } this.timer--; if (timer < 0) { timer = 0; diff --git a/src/main/java/com/lothrazar/cyclic/block/solidifier/TileSolidifier.java b/src/main/java/com/lothrazar/cyclic/block/solidifier/TileSolidifier.java index fd69128ee..8a358b39e 100644 --- a/src/main/java/com/lothrazar/cyclic/block/solidifier/TileSolidifier.java +++ b/src/main/java/com/lothrazar/cyclic/block/solidifier/TileSolidifier.java @@ -72,11 +72,15 @@ public void tick() { return; } //Fixes sync issue entirely - if(level.isClientSide()) { return; } + if (level.isClientSide()) { + return; + } //Checks if there is space in the output slot var res = currentRecipe.getResultItem(level.registryAccess()); var max = res.getMaxStackSize(); - if(this.outputSlots.getStackInSlot(0).getCount() > max - res.getCount()){ return; } + if (this.outputSlots.getStackInSlot(0).getCount() > max - res.getCount()) { + return; + } final int energyCost = this.currentRecipe.getEnergy().getRfPertick(); final int fluidCost = this.currentRecipe.getRecipeFluid().getAmount(); if ((energy.getEnergyStored() < energyCost && energyCost > 0) @@ -227,7 +231,7 @@ private boolean tryProcessRecipe() { inputSlots.getStackInSlot(1).shrink(1); inputSlots.getStackInSlot(2).shrink(1); // if (!level.isClientSide()) { // only drain serverside to avoid desync issues # not needed anymore with above fix - tank.drain(this.currentRecipe.fluidIngredient.getAmount(), FluidAction.EXECUTE); + tank.drain(this.currentRecipe.fluidIngredient.getAmount(), FluidAction.EXECUTE); // } outputSlots.insertItem(0, currentRecipe.getResultItem(level.registryAccess()), false); return true; diff --git a/src/main/java/com/lothrazar/cyclic/block/wireless/redstone/BlockWirelessTransmit.java b/src/main/java/com/lothrazar/cyclic/block/wireless/redstone/BlockWirelessTransmit.java index 284b61aea..cfe12d250 100644 --- a/src/main/java/com/lothrazar/cyclic/block/wireless/redstone/BlockWirelessTransmit.java +++ b/src/main/java/com/lothrazar/cyclic/block/wireless/redstone/BlockWirelessTransmit.java @@ -45,7 +45,7 @@ public BlockEntityTicker getTicker(Level world, Block protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(POWERED); } - + @Override // was onReplaced public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if (state.getBlock() != newState.getBlock()) { diff --git a/src/main/java/com/lothrazar/cyclic/compat/jei/CrusherRecipeCategory.java b/src/main/java/com/lothrazar/cyclic/compat/jei/CrusherRecipeCategory.java index 22d685848..d347396a1 100644 --- a/src/main/java/com/lothrazar/cyclic/compat/jei/CrusherRecipeCategory.java +++ b/src/main/java/com/lothrazar/cyclic/compat/jei/CrusherRecipeCategory.java @@ -35,7 +35,7 @@ public class CrusherRecipeCategory implements IRecipeCategory { private EnergyBar bar; public CrusherRecipeCategory(IGuiHelper helper) { - font = Minecraft.getInstance().font; + font = Minecraft.getInstance().font; gui = helper.drawableBuilder(new ResourceLocation(ModCyclic.MODID, "textures/jei/crusher.png"), 0, 0, 155, 49).setTextureSize(155, 49).build(); icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(BlockRegistry.CRUSHER.get())); bar = new EnergyBar(font, TileSolidifier.MAX); diff --git a/src/main/java/com/lothrazar/cyclic/compat/jei/CyclicPluginJEI.java b/src/main/java/com/lothrazar/cyclic/compat/jei/CyclicPluginJEI.java index 7d2764eea..94a0dca10 100644 --- a/src/main/java/com/lothrazar/cyclic/compat/jei/CyclicPluginJEI.java +++ b/src/main/java/com/lothrazar/cyclic/compat/jei/CyclicPluginJEI.java @@ -104,11 +104,11 @@ public void registerRecipes(IRecipeRegistration registry) { @Override public void registerGuiHandlers(IGuiHandlerRegistration registry) { registry.addRecipeClickArea(ScreenMelter.class, - 68, 37, - 24, 17, MelterRecipeCategory.TYPE); + 68, 37, + 24, 17, MelterRecipeCategory.TYPE); registry.addRecipeClickArea(ScreenSolidifier.class, - 68, 37, - 24, 17, SolidifierRecipeCategory.TYPE); + 68, 37, + 24, 17, SolidifierRecipeCategory.TYPE); registry.addRecipeClickArea(ScreenGeneratorDrops.class, 38, 6, 100, 10, GenitemRecipeCategory.TYPE); diff --git a/src/main/java/com/lothrazar/cyclic/compat/jei/MelterRecipeCategory.java b/src/main/java/com/lothrazar/cyclic/compat/jei/MelterRecipeCategory.java index 500154937..086d9ecb1 100644 --- a/src/main/java/com/lothrazar/cyclic/compat/jei/MelterRecipeCategory.java +++ b/src/main/java/com/lothrazar/cyclic/compat/jei/MelterRecipeCategory.java @@ -39,7 +39,7 @@ public class MelterRecipeCategory implements IRecipeCategory { private TexturedProgress progress; public MelterRecipeCategory(IGuiHelper helper) { - font = Minecraft.getInstance().font; + font = Minecraft.getInstance().font; gui = helper.drawableBuilder(new ResourceLocation(ModCyclic.MODID, "textures/jei/melter_recipe.png"), 0, 0, 169, 69).setTextureSize(169, 69).build(); icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(BlockRegistry.MELTER.get())); bar = new EnergyBar(font, TileSolidifier.MAX); diff --git a/src/main/java/com/lothrazar/cyclic/event/ClientInputEvents.java b/src/main/java/com/lothrazar/cyclic/event/ClientInputEvents.java index 100fb2661..1ba14de88 100644 --- a/src/main/java/com/lothrazar/cyclic/event/ClientInputEvents.java +++ b/src/main/java/com/lothrazar/cyclic/event/ClientInputEvents.java @@ -86,15 +86,15 @@ public void onMouseButtonReleased(ScreenEvent.MouseButtonReleased.Pre event) { if (stackTarget.getItem() instanceof ItemLunchbox && mc.player != null && mc.player.containerMenu != null) { - // ItemStack maybeFood = mc.player.containerMenu.getCarried(); - // if (maybeFood.isEdible()) { + // inserting food must be done onMouse Released event + // this is important. opening screens is on the other event + // send the slot and info to the server to process with the lunchbox int slotId = gui.getSlotUnderMouse().getContainerSlot(); SoundUtil.playSound(mc.player, SoundEvents.UI_BUTTON_CLICK.get()); PacketRegistry.INSTANCE.sendToServer(new PacketItemGui(slotId, stackTarget.getItem())); event.setCanceled(true); - return; } } } @@ -104,6 +104,7 @@ public void onMouseButtonReleased(ScreenEvent.MouseButtonReleased.Pre event) { @SubscribeEvent(priority = EventPriority.HIGH) // WAS MouseClickedEvent public void onMouseEvent(ScreenEvent.MouseButtonPressed.Pre event) { + Minecraft mc = Minecraft.getInstance(); if (event.getScreen() == null || !(event.getScreen() instanceof AbstractContainerScreen)) { return; } @@ -124,6 +125,14 @@ else if (maybeCharm.getItem() instanceof ItemStorageBag PacketRegistry.INSTANCE.sendToServer(new PacketItemGui(slotHit.index, maybeCharm.getItem())); event.setCanceled(true); } + else if (maybeCharm.getItem() instanceof ItemLunchbox) { + // if you have an EMPTY hand, use this to open the GUI screen of the lunchbox + ItemStack maybeFood = mc.player.containerMenu.getCarried(); + if (maybeFood.isEmpty()) { + PacketRegistry.INSTANCE.sendToServer(new PacketItemGui(slotHit.index, maybeCharm.getItem())); + event.setCanceled(true); + } + } } } catch (Exception e) { //array out of bounds, or we are in a strange third party GUI that doesnt have slots like this diff --git a/src/main/java/com/lothrazar/cyclic/item/crafting/PacketItemGui.java b/src/main/java/com/lothrazar/cyclic/item/crafting/PacketItemGui.java index d6e1f0db4..5840cd51e 100644 --- a/src/main/java/com/lothrazar/cyclic/item/crafting/PacketItemGui.java +++ b/src/main/java/com/lothrazar/cyclic/item/crafting/PacketItemGui.java @@ -3,6 +3,8 @@ import java.util.function.Supplier; import com.lothrazar.cyclic.item.crafting.simple.CraftingStickContainer; import com.lothrazar.cyclic.item.crafting.simple.CraftingStickContainerProvider; +import com.lothrazar.cyclic.item.lunchbox.ContainerProviderLunchbox; +import com.lothrazar.cyclic.item.lunchbox.ItemLunchbox; import com.lothrazar.cyclic.item.storagebag.ContainerStorageBag; import com.lothrazar.cyclic.item.storagebag.StorageBagContainerProvider; import com.lothrazar.cyclic.registry.ItemRegistry; @@ -29,27 +31,18 @@ public PacketItemGui(int slot, Item item) { public static void handle(PacketItemGui message, Supplier ctx) { ctx.get().enqueueWork(() -> { ServerPlayer player = ctx.get().getSender(); - // if (message.item == ItemRegistry.STORAGE_BAG.get() && (player.containerMenu instanceof ContainerStorageBag) == false) { - // NetworkHooks.openScreen(player, new StorageBagContainerProvider(message.slot), buf -> buf.writeInt(message.slot)); - // } if (message.item == ItemRegistry.LUNCHBOX.get()) { //put the food in the lunchbox ItemStack itemFoodMouse = player.containerMenu.getCarried(); - if (itemFoodMouse.isEmpty() || !itemFoodMouse.isEdible()) { - return; //its not food + if (itemFoodMouse.isEmpty()) { + //right click on mouse-empty-holding means open the GUI like the stick + NetworkHooks.openScreen(player, new ContainerProviderLunchbox(), buf -> buf.writeInt(message.slot)); } - ItemStack lunchbox = player.getInventory().getItem(message.slot);//why is it air - IItemHandler boxCap = lunchbox.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); - if (boxCap == null) { - return; + else if (itemFoodMouse.isEdible()) { + ItemStack lunchbox = player.getInventory().getItem(message.slot);//why is it air + ItemLunchbox.insertFoodIntoLunchbox(lunchbox, itemFoodMouse, player); } - //try to put/stack into each slot - int i = 0; - while (i < boxCap.getSlots()) { - itemFoodMouse = boxCap.insertItem(i, itemFoodMouse, false); - i++; - } - player.containerMenu.setCarried(itemFoodMouse); + //else it is not edible so do nothing } // end of lunchbox flow else if (message.item == ItemRegistry.STORAGE_BAG.get() && (player.containerMenu instanceof ContainerStorageBag) == false) { NetworkHooks.openScreen(player, new StorageBagContainerProvider(message.slot), buf -> buf.writeInt(message.slot)); diff --git a/src/main/java/com/lothrazar/cyclic/item/lunchbox/ItemLunchbox.java b/src/main/java/com/lothrazar/cyclic/item/lunchbox/ItemLunchbox.java index 1bf897742..cfbb424db 100644 --- a/src/main/java/com/lothrazar/cyclic/item/lunchbox/ItemLunchbox.java +++ b/src/main/java/com/lothrazar/cyclic/item/lunchbox/ItemLunchbox.java @@ -68,6 +68,7 @@ public UseAnim getUseAnimation(ItemStack st) { return UseAnim.EAT; } + // Show durability if our lunchbox has tagData, meaning it has or had food @Override public boolean isBarVisible(ItemStack stack) { return stack.hasTag() || super.isBarVisible(stack); @@ -119,7 +120,7 @@ public void readShareTag(ItemStack stack, CompoundTag nbt) { @Override public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity entityLiving) { - if (!worldIn.isClientSide && entityLiving instanceof Player player) { + if (!worldIn.isClientSide && entityLiving instanceof Player player) { // && !player.isCrouching() IItemHandler handler = stack.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); if (handler != null) { ItemStack found = ItemStack.EMPTY; @@ -132,6 +133,7 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en } } if (!found.isEmpty()) { + // found is edible and is not on cooldown ChatUtil.addServerChatMessage(player, found.getDisplayName()); // entityLiving.eat(worldIn, found); //moved from. eat() to forwarding the .finishUsingItem call @@ -146,7 +148,6 @@ public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity en @Override public InteractionResultHolder use(Level worldIn, Player player, InteractionHand handIn) { - // ItemStack itemstack = player.getItemInHand(handIn); if (player.isCrouching()) { if (!worldIn.isClientSide) { NetworkHooks.openScreen((ServerPlayer) player, new ContainerProviderLunchbox(), player.blockPosition()); @@ -182,4 +183,28 @@ public static int getColour(ItemStack stack) { } return 0xFFFFFFFF; } + + /** + * for use by Item slot GUI Screen interactions. Mouse is holding an item to be inserted into a closed luncbbox from a different GUI + * + * @param lunchbox + * assumes this is a valid lunchbox with item as instance of this + * @param itemFoodMouse + * a valid food item nonempty and not a lunchbox + * @param player + * instance that is doing the insert + */ + public static void insertFoodIntoLunchbox(ItemStack lunchbox, ItemStack itemFoodMouse, ServerPlayer player) { + IItemHandler boxCap = lunchbox.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + if (boxCap == null) { + return; + } + //try to put/stack into each slot + int i = 0; + while (i < boxCap.getSlots()) { + itemFoodMouse = boxCap.insertItem(i, itemFoodMouse, false); + i++; + } + player.containerMenu.setCarried(itemFoodMouse); + } } diff --git a/src/main/java/com/lothrazar/cyclic/item/lunchbox/ScreenLunchbox.java b/src/main/java/com/lothrazar/cyclic/item/lunchbox/ScreenLunchbox.java index 672b3b23c..5365e1229 100644 --- a/src/main/java/com/lothrazar/cyclic/item/lunchbox/ScreenLunchbox.java +++ b/src/main/java/com/lothrazar/cyclic/item/lunchbox/ScreenLunchbox.java @@ -16,7 +16,6 @@ public ScreenLunchbox(ContainerLunchbox screenContainer, Inventory inv, Componen @Override protected void init() { super.init(); - // CompoundTag nbt = this.menu.bag.getOrCreateTag(); } @Override diff --git a/update.json b/update.json index a6c7d208b..14fd15216 100644 --- a/update.json +++ b/update.json @@ -182,8 +182,8 @@ ,"1.20.7":"Change curio render_toggle. #2356. Wooden Hopper is mineable with axes. Fixed Block Breaker attempting to break liquid source blocks. " ,"1.20.8":"Re-added botania-api Solegnolia support. Growth enchantment now uses the same logic as Sprinkler & Terra Soil (only minecraft:crops or minecraft::saplings can grow, respect IGrowable::canUseBonemeal). New gloom ignored config Gloom enchant (cyclic:curse) to ignore and not use these effects #2217 #2325. Fix Soundproofing block not muting Mekanism sounds #2389 (for example Precision Sawmill and others - you may need four or more soundproofing blocks for the desired effect). New config [cyclic.blocks.soundproofing] radius = 6 to control the area. New config under [cyclic.blocks] wireless_transfer_dimensional = true allowing transfer nodes to connect across dimensions #1913. Balance changes made for Excavate enchant it will no longer trigger if the tool is not 'mineable' effective for example axe on dirt. New feature for Excavate enchant #2116 it will not trigger on anything matching the block data-tag 'cyclic:ignored/excavate'. ", - "1.20.9": " Fix tanks not getting filled from buckets\n\nMerge pull request #2400 from PocketSizedWeeb Fixes Issue #2376 solidifier client-server desync problems with fluid quantities during recipe processing\n\nMerge pull request #2387 from Apollounknowndev Fix worldgen crash and compatibility with other worldgen mods; flower worldgen has moved to new blocktags in woldgen/biome/has_flower/\n ", - "1.20.10": "Copper, Gold and Netherite chains block model now extends the vanilla reference, meaning they are compatible with any 3D chain model resource pack (such as vanillatweaks). Merge pull request #2402 from Apollounknowndev/trunk/1.20\n\nFix lime flower generation. JEI Changes:\n\n Merge pull request #2400: Fixes issue \n\nSolidifier doesn't show liquid requirements #2369\nMade the JEI category for the Melter more closely match the Melter's GUI\nMoved the JEI \"Show Recipe\" area for the machines line up with the progress bar\nMoved the JEI \"Show Recipe\" area for the generators line up with the generator name\nEvery applicable JEI Category got an energy bar added to show max consumed/produced RF\nEvery applicable JEI Category got a progress bar to show how long the machine will run for\nEdited the Melter category texture to add space for energy bar\nPossibly fixed\n\n HashMap memory leak #2383 by caching an instance of Minecraft instead of grabbing it when needed in the Packager's JEI Category\n\nDry Peat:\n\n Fixes issue \n\n Peat bog cannot be saturated with water-logged leaves #2399 by allowing water-logged blocks to hydrate peat\n\nSolidifier/Melter:\n\n Fully fixes desync issue by making all of the processing server sided.\n\nCrushing Macerator:\n\n Fixed \n\nCrushing Macerator continues to operate and void items if full #2343\nFixed\n\n Crushing Macerator allows items to be shift-clicked into output slots #2341\n\nEvaporation Generator:\n\n Removed tank tooltip from before it was rotated\n Fixes \n\n Evaporation Generator 1.19.2 #2322 by implementing a workaround since the fluid portion of FluidTagIngredient was defaulting to empty which was not allowing tagged fluids in the generator\n\nAuto Crafter:\n\n Fixed \n\n auto crafting machine duplicate glitch #2358 by checking input before processing\n Fixed an issue where the preview slot wasn't updating until the machine was processing a craft\n\nWireless Transmitter:\n\n Fixed \n\ngps card inside wireless transmitter disappearing #2403 by adding an onRemove method to the transmitter that drops the gps card" + "1.20.9": "Fix tanks not getting filled from buckets\n\nMerge pull request #2400 from PocketSizedWeeb Fixes Issue #2376 solidifier client-server desync problems with fluid quantities during recipe processing\n\nMerge pull request #2387 from Apollounknowndev Fix worldgen crash and compatibility with other worldgen mods; flower worldgen has moved to new blocktags in woldgen/biome/has_flower/\n ", + "1.20.10": "Lunchbox when inserting items into it in the inventory with right click; you can also open the lunchbox from your open inventory by right clicking with an empty mouse cursor. Copper, Gold and Netherite chains block model now extends the vanilla reference, meaning they are compatible with any 3D chain model resource pack (such as vanillatweaks). Merge pull request #2402 from Apollounknowndev/trunk/1.20\n\nFix lime flower generation. JEI Changes:\n\n Merge pull request #2400: Fixes issue \n\nSolidifier doesn't show liquid requirements #2369\nMade the JEI category for the Melter more closely match the Melter's GUI\nMoved the JEI \"Show Recipe\" area for the machines line up with the progress bar\nMoved the JEI \"Show Recipe\" area for the generators line up with the generator name\nEvery applicable JEI Category got an energy bar added to show max consumed/produced RF\nEvery applicable JEI Category got a progress bar to show how long the machine will run for\nEdited the Melter category texture to add space for energy bar\nPossibly fixed\n\n HashMap memory leak #2383 by caching an instance of Minecraft instead of grabbing it when needed in the Packager's JEI Category\n\nDry Peat:\n\n Fixes issue \n\n Peat bog cannot be saturated with water-logged leaves #2399 by allowing water-logged blocks to hydrate peat\n\nSolidifier/Melter:\n\n Fully fixes desync issue by making all of the processing server sided.\n\nCrushing Macerator:\n\n Fixed \n\nCrushing Macerator continues to operate and void items if full #2343\nFixed\n\n Crushing Macerator allows items to be shift-clicked into output slots #2341\n\nEvaporation Generator:\n\n Removed tank tooltip from before it was rotated\n Fixes \n\n Evaporation Generator 1.19.2 #2322 by implementing a workaround since the fluid portion of FluidTagIngredient was defaulting to empty which was not allowing tagged fluids in the generator\n\nAuto Crafter:\n\n Fixed \n\n auto crafting machine duplicate glitch #2358 by checking input before processing\n Fixed an issue where the preview slot wasn't updating until the machine was processing a craft\n\nWireless Transmitter:\n\n Fixed \n\ngps card inside wireless transmitter disappearing #2403 by adding an onRemove method to the transmitter that drops the gps card" } }