From 9b676a346e55e7e3120df23f9e6c45ef3f573b93 Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <17766417+C0bra5@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:22:18 -0400 Subject: [PATCH 1/7] Allow crop stick placement on non-top block faces --- .../cropsnh/items/blocks/ItemCropSticks.java | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java b/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java index c4f59058..776e5ba5 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java @@ -33,32 +33,52 @@ public boolean canItemEditBlocks() { @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { - // check if we are targeting the top side of a valid soil block - if (side != 1 || !SoilRegistry.instance.isRegistered(world, x, y, z) - || world.getHeight() <= y + 1 - || !world.canPlaceEntityOnSide(CropsNHBlocks.blockCropSticks, x, y + 1, z, false, 0, player, stack)) { + // fix placement side + switch (side) { + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + case 5: + ++x; + break; + } + // check if we are targeting a valid soil block + if (!SoilRegistry.instance.isRegistered(world, x, y - 1, z) || world.getHeight() <= y + || !world.canPlaceEntityOnSide(CropsNHBlocks.blockCropSticks, x, y, z, false, 0, player, stack)) { return false; } // you can shift-right-click to place a cross. boolean isPlacingCross = player.isSneaking() && (player.capabilities.isCreativeMode || stack.stackSize >= 2); - world.setBlock(x, y + 1, z, CropsNHBlocks.blockCropSticks); + world.setBlock(x, y, z, CropsNHBlocks.blockCropSticks); if (!player.capabilities.isCreativeMode) { stack.stackSize -= isPlacingCross ? 2 : 1; } // upgrade it if necessary - if (isPlacingCross && world.getTileEntity(x, y + 1, z) instanceof ICropStickTile crop) { + if (isPlacingCross && world.getTileEntity(x, y, z) instanceof ICropStickTile crop) { crop.setCrossCrop(true); - world.markBlockForUpdate(x, y + 1, z); + world.markBlockForUpdate(x, y, z); } // play placement sound world.playSoundEffect( ((float) x + 0.5F), - ((float) y + 1.5F), + ((float) y + 0.5F), ((float) z + 0.5F), Blocks.planks.stepSound.func_150496_b(), (Blocks.planks.stepSound.getVolume() + 1.0F) / 2.0F, From 446555a5e09ec33987f223a6b28896819fa6de7f Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <17766417+C0bra5@users.noreply.github.com> Date: Wed, 12 Aug 2026 20:36:59 -0400 Subject: [PATCH 2/7] add nullable endpoints to mod utils --- .../com/gtnewhorizon/cropsnh/utility/ModUtils.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/gtnewhorizon/cropsnh/utility/ModUtils.java b/src/main/java/com/gtnewhorizon/cropsnh/utility/ModUtils.java index 4fdac7f8..6d95a87d 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/utility/ModUtils.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/utility/ModUtils.java @@ -7,6 +7,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import org.jetbrains.annotations.Nullable; + import com.gtnewhorizon.gtnhlib.util.data.IMod; import cpw.mods.fml.common.Loader; @@ -17,6 +19,7 @@ public enum ModUtils implements IMod { Angelica(ModIDs.Angelica), Avaritia(ModIDs.Avaritia), Backhand(ModIDs.Backhand), + BetterBuildersWands(ModIDs.BetterBuildersWands), BiomesOPlenty(ModIDs.BiomesOPlenty), BloodMagic(ModIDs.BloodMagic), Botania(ModIDs.Botania), @@ -120,6 +123,10 @@ public Item getItem(String name) { return item; } + public @Nullable Item getItemAllowNull(String name) { + return GameRegistry.findItem(this.ID, name); + } + public Block getBlock(String name) { Block block = GameRegistry.findBlock(this.ID, name); @@ -139,6 +146,10 @@ public Block getBlock(String name) { return block; } + public @Nullable Block getBlockAllowNull(String name) { + return GameRegistry.findBlock(this.ID, name); + } + public ItemStack getStack(String name, int amount, int meta) { return CropsNHUtils.getModItem(this, name, amount, meta); } @@ -148,6 +159,7 @@ public static class ModIDs { public static final String Angelica = "angelica"; public static final String Avaritia = "Avaritia"; public static final String Backhand = "backhand"; + public static final String BetterBuildersWands = "betterbuilderswands"; public static final String BiomesOPlenty = "BiomesOPlenty"; public static final String BloodMagic = "AWWayofTime"; public static final String Botania = "Botania"; From 19f5877eed5b1b315a0f057f6994d75483301ad3 Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <17766417+C0bra5@users.noreply.github.com> Date: Wed, 12 Aug 2026 20:39:49 -0400 Subject: [PATCH 3/7] improve crop stick block placement --- dependencies.gradle | 47 ++++++++--------- .../com/gtnewhorizon/cropsnh/CropsNH.java | 3 ++ .../BetterBuildersWandsCompatHandler.java | 41 +++++++++++++++ ...erBuildersWandsCropStickCustomMapping.java | 37 ++++++++++++++ .../extrautils/ExUWateringCanHandler.java | 8 +++ .../cropsnh/items/blocks/ItemCropSticks.java | 51 +++++++------------ 6 files changed, 130 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java create mode 100644 src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/CropsNHBetterBuildersWandsCropStickCustomMapping.java diff --git a/dependencies.gradle b/dependencies.gradle index d988c4d8..5d6eda26 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,39 +2,40 @@ dependencies { // compile and runtime required dependencies - api("com.github.GTNewHorizons:GT5-Unofficial:5.09.54.75:dev") - api("com.github.GTNewHorizons:GTNHLib:0.11.36:dev") + api("com.github.GTNewHorizons:GT5-Unofficial:5.09.54.83:dev") + api("com.github.GTNewHorizons:GTNHLib:0.11.37:dev") shadowImplementation('com.github.makamys:MCLib:0.3.7.8') { exclude group: "codechicken" } // compile required dependencies - devOnlyNonPublishable("com.github.GTNewHorizons:TinkersConstruct:1.14.96-GTNH:dev") { transitive = false } - devOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.118-GTNH:dev") { transitive = false } + devOnlyNonPublishable("com.github.GTNewHorizons:TinkersConstruct:1.14.97-GTNH:dev") { transitive = false } + devOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.122-GTNH:dev") { transitive = false } devOnlyNonPublishable("com.github.GTNewHorizons:waila:1.19.31:dev") { transitive = false } - devOnlyNonPublishable("com.github.GTNewHorizons:ForestryMC:4.11.32:dev") { transitive = false } + devOnlyNonPublishable("com.github.GTNewHorizons:ForestryMC:4.11.35:dev") { transitive = false } devOnlyNonPublishable("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") { transitive = false } devOnlyNonPublishable('com.github.GTNewHorizons:Backhand:1.8.13:dev') { transitive = false } devOnlyNonPublishable('com.github.GTNewHorizons:FindIt:1.4.4:dev') { transitive = false } + devOnlyNonPublishable('com.github.GTNewHorizons:BetterBuildersWands:0.13.11-GTNH:dev') { transitive = false } // // optional runtime dependencies, you'll want to copy over the full pack configs to your dev env or else it will crash. // // debugging tools - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NewHorizonsCoreMod:2.9.29:dev") + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NewHorizonsCoreMod:2.9.35:dev") // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.4.6:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:worldedit-gtnh:v0.0.9:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderCore:0.5.14:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.118-GTNH:dev") { transitive = false } - // runtimeOnlyNonPublishable('com.github.GTNewHorizons:Opis:1.4.9-mapless:dev') { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:GTNHLib:0.11.36:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.122-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable('com.github.GTNewHorizons:Opis:1.4.12-mapless:dev') { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:GTNHLib:0.11.37:dev") { transitive = false } // // QOL/creature comforts // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-999-GTNH:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:AE2FluidCraft-Rework:1.5.100-gtnh:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:AE2FluidCraft-Rework:1.5.102-gtnh:dev") { transitive = false } // var tasks = project.gradle.startParameter.taskNames // if (tasks.contains("runClient17") || tasks.contains("runClient21") || tasks.contains("runClient25")) { - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:2.1.60:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:2.2.3:dev") { transitive = false } // } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.180:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.186:dev") { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:CoreTweaks:0.3.4.7-GTNH:dev') { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:StorageDrawers:2.2.28-GTNH:dev') { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:MouseTweaks:2.5.2-GTNH:dev') { transitive = false } @@ -47,37 +48,37 @@ dependencies { // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Nutrition:1.0.1:dev") { transitive = false } // // bee comparisons // runtimeOnlyNonPublishable("com.github.GTNewHorizons:BeeBetterAtBees-GTNH:0.4.7-GTNH:dev") { transitive = false } - // runtimeOnlyNonPublishable('com.github.GTNewHorizons:Binnie:2.6.39:dev') { transitive = false } + // runtimeOnlyNonPublishable('com.github.GTNewHorizons:Binnie:2.6.42:dev') { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:neiaddons:1.18.4:dev") { transitive = false } // // for mod specific crops // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Natura:2.8.23:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:twilightforest:2.7.38:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:twilightforest:2.7.39:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ThaumicBases:1.9.19:dev") { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:DummyCore:1.21.0:dev') { transitive = false } // runtimeOnlyNonPublishable("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") { transitive = false } // runtimeOnlyNonPublishable(deobfCurse('witchery-69673:2234410')) { transitive = false } // runtimeOnlyNonPublishable(rfg.deobf("curse.maven:biomes-o-plenty-220318:2499612")) { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Botania:1.13.32-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Botania:1.13.33-GTNH:dev") { transitive = false } // runtimeOnlyNonPublishable("ganymedes01.etfuturum:Et-Futurum-Requiem:2.6.12-GTNH") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:harvestcraft:1.3.13-GTNH:dev") { transitive = false } // // testing recipes // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Tainted-Magic:7.7.8-GTNH:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WitcheryExtras:1.4.16:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WitchingGadgets:1.8.48-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WitchingGadgets:1.8.49-GTNH:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ThaumicTinkerer:2.12.29:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Galaxy-Space-GTNH:1.1.139-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Galaxy-Space-GTNH:1.1.141-GTNH:dev") { transitive = false } // // required in order to have pam - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Chisel:2.17.31-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Chisel:2.17.32-GTNH:dev") { transitive = false } // // mod specific crops and soils - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Galacticraft:3.4.32-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Galacticraft:3.4.33-GTNH:dev") { transitive = false } // // soil debugging - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Random-Things:2.7.8:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Random-Things:2.7.9:dev") { transitive = false } // runtimeOnlyNonPublishable(rfg.deobf("curse.maven:ztones-224369:2223720")) { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:MagicBees:2.10.10-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:MagicBees:2.10.12-GTNH:dev") { transitive = false } // // required in order for ztones to load right due to GT5u // runtimeOnlyNonPublishable("com.github.GTNewHorizons:BuildCraft:7.1.63:dev") { transitive = false } // // skull underblock requirement - // runtimeOnlyNonPublishable('com.github.GTNewHorizons:EnderIO:2.10.36:dev') { transitive = false } + // runtimeOnlyNonPublishable('com.github.GTNewHorizons:EnderIO:2.10.39:dev') { transitive = false } // // watering can interactions // runtimeOnlyNonPublishable(rfg.deobf("curse.maven:extra-utilities-225561:2264383")) { transitive = false } } @@ -87,7 +88,7 @@ project.getConfigurations() final DependencySubstitutions ds = c.getResolutionStrategy() .getDependencySubstitution(); ds.substitute(ds.module("com.github.GTNewHorizons:Baubles")) - .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.2.21-GTNH")) + .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.2.22-GTNH")) .withClassifier("dev") .because("Baubles-Expanded replaces Baubles"); }); diff --git a/src/main/java/com/gtnewhorizon/cropsnh/CropsNH.java b/src/main/java/com/gtnewhorizon/cropsnh/CropsNH.java index b2060d95..80f2bb4c 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/CropsNH.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/CropsNH.java @@ -2,6 +2,7 @@ import com.gtnewhorizon.cropsnh.compatibility.StructureLib.StructureLibCompatHandler; import com.gtnewhorizon.cropsnh.compatibility.TiC.TiCCompatHandler; +import com.gtnewhorizon.cropsnh.compatibility.betterbuilderswands.BetterBuildersWandsCompatHandler; import com.gtnewhorizon.cropsnh.compatibility.extrautils.ExUWateringCanHandler; import com.gtnewhorizon.cropsnh.compatibility.findit.FindItCompatHandler; import com.gtnewhorizon.cropsnh.compatibility.forestry.ForestryCompatHandler; @@ -66,6 +67,7 @@ + "after:" + ModUtils.ModIDs.TwilightForest + "; " + "after:" + ModUtils.ModIDs.StructureLib + "; " + "after:" + ModUtils.ModIDs.PamsHarvestCraft + "; " + + "after:" + ModUtils.ModIDs.BetterBuildersWands + "; " // spotless:on ) public class CropsNH { @@ -130,6 +132,7 @@ public static void postInit(FMLPostInitializationEvent event) { ForestryCompatHandler.onPostInit(); ExUWateringCanHandler.postInit(); FindItCompatHandler.postInit(); + BetterBuildersWandsCompatHandler.postInit(); LogHelper.debug("Post-Initialization Complete"); } diff --git a/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java new file mode 100644 index 00000000..de4454cc --- /dev/null +++ b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java @@ -0,0 +1,41 @@ +package com.gtnewhorizon.cropsnh.compatibility.betterbuilderswands; + +import net.minecraft.item.Item; +import net.minecraftforge.oredict.OreDictionary; + +import com.gtnewhorizon.cropsnh.blocks.BlockCropSticks; +import com.gtnewhorizon.cropsnh.utility.ModUtils; + +import portablejim.bbw.BetterBuildersWandsMod; + +public class BetterBuildersWandsCompatHandler { + + public static void postInit() { + if (!ModUtils.BetterBuildersWands.isModLoaded()) return; + + BetterBuildersWandsMod.instance.mappingManager + .setMapping(new CropsNHBetterBuildersWandsCropStickCustomMapping()); + + // unbreakable wand + BlockCropSticks.BLOCK_INTERACTION_WITH + .add(ModUtils.BetterBuildersWands.getItem("wandUnbreakable"), OreDictionary.WILDCARD_VALUE); + + // diamond wand, can be disabled + Item item = ModUtils.BetterBuildersWands.getItemAllowNull("wandDiamond"); + if (item != null) { + BlockCropSticks.BLOCK_INTERACTION_WITH.add(item, OreDictionary.WILDCARD_VALUE); + } + + // stone wand, can be disabled + item = ModUtils.BetterBuildersWands.getItemAllowNull("wandStone"); + if (item != null) { + BlockCropSticks.BLOCK_INTERACTION_WITH.add(item, OreDictionary.WILDCARD_VALUE); + } + + // iron wand, can be disabled + item = ModUtils.BetterBuildersWands.getItemAllowNull("wandIron"); + if (item != null) { + BlockCropSticks.BLOCK_INTERACTION_WITH.add(item, OreDictionary.WILDCARD_VALUE); + } + } +} diff --git a/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/CropsNHBetterBuildersWandsCropStickCustomMapping.java b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/CropsNHBetterBuildersWandsCropStickCustomMapping.java new file mode 100644 index 00000000..eceeca03 --- /dev/null +++ b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/CropsNHBetterBuildersWandsCropStickCustomMapping.java @@ -0,0 +1,37 @@ +package com.gtnewhorizon.cropsnh.compatibility.betterbuilderswands; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; + +import com.gtnewhorizon.cropsnh.api.CropsNHItemList; +import com.gtnewhorizon.cropsnh.init.CropsNHBlocks; + +import portablejim.bbw.basics.Point3d; +import portablejim.bbw.core.conversion.ICustomMapping; +import portablejim.bbw.shims.IPlayerShim; +import portablejim.bbw.shims.IWorldShim; + +public class CropsNHBetterBuildersWandsCropStickCustomMapping implements ICustomMapping { + + @Override + public Block getLookBlock() { + return CropsNHBlocks.blockCropSticks; + } + + @Override + public int getMeta() { + return 0; + } + + @Override + public ItemStack getItems(IWorldShim world, IPlayerShim player, Point3d point) { + return CropsNHItemList.cropSticks.get( + player.getPlayer() + .isSneaking() ? 2 : 1); + } + + @Override + public boolean shouldCopyTileNBT() { + return false; + } +} diff --git a/src/main/java/com/gtnewhorizon/cropsnh/compatibility/extrautils/ExUWateringCanHandler.java b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/extrautils/ExUWateringCanHandler.java index 1a027a4e..337c060d 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/compatibility/extrautils/ExUWateringCanHandler.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/extrautils/ExUWateringCanHandler.java @@ -9,6 +9,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.event.entity.player.PlayerUseItemEvent; +import net.minecraftforge.oredict.OreDictionary; import com.gtnewhorizon.cropsnh.api.ICropStickTile; import com.gtnewhorizon.cropsnh.blocks.BlockCropSticks; @@ -36,6 +37,13 @@ public static void postInit() { BlockCropSticks.BLOCK_INTERACTION_WITH.add(EXTRA_UTILS_WATERING_CAN, 0); // reinforced BlockCropSticks.BLOCK_INTERACTION_WITH.add(EXTRA_UTILS_WATERING_CAN, 3); + + // building wands + BlockCropSticks.BLOCK_INTERACTION_WITH + .add(ModUtils.ExtraUtilities.getItem("builderswand"), OreDictionary.WILDCARD_VALUE); + BlockCropSticks.BLOCK_INTERACTION_WITH + .add(ModUtils.ExtraUtilities.getItem("creativebuilderswand"), OreDictionary.WILDCARD_VALUE); + } @SubscribeEvent diff --git a/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java b/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java index 776e5ba5..33447367 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java @@ -8,7 +8,6 @@ import com.gtnewhorizon.cropsnh.api.ICropRightClickHandler; import com.gtnewhorizon.cropsnh.api.ICropStickTile; -import com.gtnewhorizon.cropsnh.farming.registries.SoilRegistry; import com.gtnewhorizon.cropsnh.init.CropsNHBlocks; public class ItemCropSticks extends ItemBlockCropsNH implements ICropRightClickHandler { @@ -31,50 +30,27 @@ public boolean canItemEditBlocks() { // this is called when you right-click with this item in hand @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, - float hitX, float hitY, float hitZ) { - // fix placement side - switch (side) { - case 0: - --y; - break; - case 1: - ++y; - break; - case 2: - --z; - break; - case 3: - ++z; - break; - case 4: - --x; - break; - case 5: - ++x; - break; - } - // check if we are targeting a valid soil block - if (!SoilRegistry.instance.isRegistered(world, x, y - 1, z) || world.getHeight() <= y - || !world.canPlaceEntityOnSide(CropsNHBlocks.blockCropSticks, x, y, z, false, 0, player, stack)) { - return false; - } + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ, int metadata) { // you can shift-right-click to place a cross. boolean isPlacingCross = player.isSneaking() && (player.capabilities.isCreativeMode || stack.stackSize >= 2); + // place the stick world.setBlock(x, y, z, CropsNHBlocks.blockCropSticks); - if (!player.capabilities.isCreativeMode) { - stack.stackSize -= isPlacingCross ? 2 : 1; - } - // upgrade it if necessary if (isPlacingCross && world.getTileEntity(x, y, z) instanceof ICropStickTile crop) { crop.setCrossCrop(true); world.markBlockForUpdate(x, y, z); } + // copies vanilla mechanics + if (world.getBlock(x, y, z) == field_150939_a) { + field_150939_a.onBlockPlacedBy(world, x, y, z, player, stack); + field_150939_a.onPostBlockPlaced(world, x, y, z, metadata); + } + // play placement sound world.playSoundEffect( ((float) x + 0.5F), @@ -83,7 +59,14 @@ public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int Blocks.planks.stepSound.func_150496_b(), (Blocks.planks.stepSound.getVolume() + 1.0F) / 2.0F, Blocks.planks.stepSound.getPitch() * 0.8F); - return true; + + // consume items + if (!player.capabilities.isCreativeMode) { + stack.stackSize -= isPlacingCross ? 2 : 1; + } + + // returning false because we're handling block placement sounds and stack consuming + return false; } @Override From 8fbb3e604e24054bc8a9065205db794ac5a1c297 Mon Sep 17 00:00:00 2001 From: boubou19 Date: Sun, 23 Aug 2026 21:53:47 +0200 Subject: [PATCH 4/7] bump deps --- dependencies.gradle | 50 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 5d6eda26..8fd50814 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,40 +2,40 @@ dependencies { // compile and runtime required dependencies - api("com.github.GTNewHorizons:GT5-Unofficial:5.09.54.83:dev") - api("com.github.GTNewHorizons:GTNHLib:0.11.37:dev") + api("com.github.GTNewHorizons:GT5-Unofficial:5.09.54.107:dev") + api("com.github.GTNewHorizons:GTNHLib:0.11.43:dev") shadowImplementation('com.github.makamys:MCLib:0.3.7.8') { exclude group: "codechicken" } // compile required dependencies - devOnlyNonPublishable("com.github.GTNewHorizons:TinkersConstruct:1.14.97-GTNH:dev") { transitive = false } - devOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.122-GTNH:dev") { transitive = false } - devOnlyNonPublishable("com.github.GTNewHorizons:waila:1.19.31:dev") { transitive = false } - devOnlyNonPublishable("com.github.GTNewHorizons:ForestryMC:4.11.35:dev") { transitive = false } + devOnlyNonPublishable("com.github.GTNewHorizons:TinkersConstruct:1.14.103-GTNH:dev") { transitive = false } + devOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.126-GTNH:dev") { transitive = false } + devOnlyNonPublishable("com.github.GTNewHorizons:waila:1.19.34:dev") { transitive = false } + devOnlyNonPublishable("com.github.GTNewHorizons:ForestryMC:4.11.36:dev") { transitive = false } devOnlyNonPublishable("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") { transitive = false } - devOnlyNonPublishable('com.github.GTNewHorizons:Backhand:1.8.13:dev') { transitive = false } - devOnlyNonPublishable('com.github.GTNewHorizons:FindIt:1.4.4:dev') { transitive = false } - devOnlyNonPublishable('com.github.GTNewHorizons:BetterBuildersWands:0.13.11-GTNH:dev') { transitive = false } + devOnlyNonPublishable('com.github.GTNewHorizons:Backhand:1.8.14:dev') { transitive = false } + devOnlyNonPublishable('com.github.GTNewHorizons:FindIt:1.4.6:dev') { transitive = false } + devOnlyNonPublishable('com.github.GTNewHorizons:BetterBuildersWands:0.13.12-GTNH:dev') { transitive = false } // // optional runtime dependencies, you'll want to copy over the full pack configs to your dev env or else it will crash. // // debugging tools - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NewHorizonsCoreMod:2.9.35:dev") - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.4.6:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NewHorizonsCoreMod:2.9.47:dev") + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.4.7:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:worldedit-gtnh:v0.0.9:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderCore:0.5.14:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.122-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.126-GTNH:dev") { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:Opis:1.4.12-mapless:dev') { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:GTNHLib:0.11.37:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:GTNHLib:0.11.43:dev") { transitive = false } // // QOL/creature comforts // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-999-GTNH:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:AE2FluidCraft-Rework:1.5.102-gtnh:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:AE2FluidCraft-Rework:1.5.104-gtnh:dev") { transitive = false } // var tasks = project.gradle.startParameter.taskNames // if (tasks.contains("runClient17") || tasks.contains("runClient21") || tasks.contains("runClient25")) { - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:2.2.3:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:2.2.8:dev") { transitive = false } // } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.186:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.191:dev") { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:CoreTweaks:0.3.4.7-GTNH:dev') { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:StorageDrawers:2.2.28-GTNH:dev') { transitive = false } // runtimeOnlyNonPublishable('com.github.GTNewHorizons:MouseTweaks:2.5.2-GTNH:dev') { transitive = false } @@ -43,13 +43,13 @@ dependencies { // runtimeOnlyNonPublishable("com.github.GTNewHorizons:StructureLib:1.4.42:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:BlockRenderer6343:1.4.21:dev") { transitive = false } // // to check what counts as food - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:AppleCore:3.3.11:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:AppleCore:3.3.12:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:SpiceOfLife:2.2.10-carrot:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Nutrition:1.0.1:dev") { transitive = false } // // bee comparisons // runtimeOnlyNonPublishable("com.github.GTNewHorizons:BeeBetterAtBees-GTNH:0.4.7-GTNH:dev") { transitive = false } - // runtimeOnlyNonPublishable('com.github.GTNewHorizons:Binnie:2.6.42:dev') { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:neiaddons:1.18.4:dev") { transitive = false } + // runtimeOnlyNonPublishable('com.github.GTNewHorizons:Binnie:2.6.46:dev') { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:neiaddons:1.18.5:dev") { transitive = false } // // for mod specific crops // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Natura:2.8.23:dev") { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:twilightforest:2.7.39:dev") { transitive = false } @@ -60,13 +60,13 @@ dependencies { // runtimeOnlyNonPublishable(rfg.deobf("curse.maven:biomes-o-plenty-220318:2499612")) { transitive = false } // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Botania:1.13.33-GTNH:dev") { transitive = false } // runtimeOnlyNonPublishable("ganymedes01.etfuturum:Et-Futurum-Requiem:2.6.12-GTNH") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:harvestcraft:1.3.13-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:harvestcraft:1.3.14-GTNH:dev") { transitive = false } // // testing recipes // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Tainted-Magic:7.7.8-GTNH:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WitcheryExtras:1.4.16:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WitchingGadgets:1.8.49-GTNH:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ThaumicTinkerer:2.12.29:dev") { transitive = false } - // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Galaxy-Space-GTNH:1.1.141-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WitcheryExtras:1.4.17:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:WitchingGadgets:1.8.50-GTNH:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ThaumicTinkerer:2.12.30:dev") { transitive = false } + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Galaxy-Space-GTNH:1.1.142-GTNH:dev") { transitive = false } // // required in order to have pam // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Chisel:2.17.32-GTNH:dev") { transitive = false } // // mod specific crops and soils @@ -78,7 +78,7 @@ dependencies { // // required in order for ztones to load right due to GT5u // runtimeOnlyNonPublishable("com.github.GTNewHorizons:BuildCraft:7.1.63:dev") { transitive = false } // // skull underblock requirement - // runtimeOnlyNonPublishable('com.github.GTNewHorizons:EnderIO:2.10.39:dev') { transitive = false } + // runtimeOnlyNonPublishable('com.github.GTNewHorizons:EnderIO:2.10.40:dev') { transitive = false } // // watering can interactions // runtimeOnlyNonPublishable(rfg.deobf("curse.maven:extra-utilities-225561:2264383")) { transitive = false } } From 69f5095d91663ee61722e6d3dc8fddb0f2a64bda Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <17766417+C0bra5@users.noreply.github.com> Date: Sun, 23 Aug 2026 22:09:55 -0400 Subject: [PATCH 5/7] post dep update build fix --- .../gtnewhorizon/cropsnh/api/CropsNHItemList.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gtnewhorizon/cropsnh/api/CropsNHItemList.java b/src/main/java/com/gtnewhorizon/cropsnh/api/CropsNHItemList.java index d987a6cc..e62edb5d 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/api/CropsNHItemList.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/api/CropsNHItemList.java @@ -1,5 +1,6 @@ package com.gtnewhorizon.cropsnh.api; +import static gregtech.GTLoggers.GT_FML_LOGGER; import static gregtech.api.enums.GTValues.NI; import static gregtech.api.util.GTRecipeBuilder.WILDCARD; @@ -15,7 +16,6 @@ import gregtech.GTMod; import gregtech.api.interfaces.IItemContainer; -import gregtech.api.util.GTLog; import gregtech.api.util.GTModHandler; import gregtech.api.util.GTOreDictUnificator; import gregtech.api.util.GTUtility; @@ -335,7 +335,7 @@ public boolean isStackEqual(Object stack) { @Override public boolean isStackEqual(Object stack, boolean wildcard, boolean ignoreNBT) { if (this.deprecated && !this.warned) { - new Exception(this + " is now deprecated").printStackTrace(GTLog.err); + GT_FML_LOGGER.error(new Exception(this + " is now deprecated")); // warn only once this.warned = true; } @@ -347,8 +347,8 @@ public boolean isStackEqual(Object stack, boolean wildcard, boolean ignoreNBT) { public ItemStack get(long amount, Object... replacements) { sanityCheck(); if (GTUtility.isStackInvalid(this.stack)) { - GTLog.out.println("Object in the ItemList is null at:"); - new NullPointerException().printStackTrace(GTLog.out); + GT_FML_LOGGER.debug("Object in the ItemList is null at:"); + GT_FML_LOGGER.debug(new NullPointerException()); return GTUtility.copyAmount(amount, replacements); } return CropsNHUtils.copyStackWithSize(this.stack, (int) amount); @@ -452,9 +452,9 @@ public IItemContainer setRender(IItemRenderer renderer) { private void sanityCheck() { if (this.hasNotBeenSet) - throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!"); if (this.deprecated && !this.warned) { - new Exception(this + " is now deprecated").printStackTrace(GTLog.err); + GT_FML_LOGGER.error(new Exception(this + " is now deprecated")); // warn only once this.warned = true; } From c1cbb7e95cdfc34bb2a365c25bdefa3e2037a3f0 Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <17766417+C0bra5@users.noreply.github.com> Date: Sun, 30 Aug 2026 04:23:23 -0400 Subject: [PATCH 6/7] BBW wand registration isn't config-dependent --- .../BetterBuildersWandsCompatHandler.java | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java index de4454cc..1f950f81 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/compatibility/betterbuilderswands/BetterBuildersWandsCompatHandler.java @@ -1,6 +1,5 @@ package com.gtnewhorizon.cropsnh.compatibility.betterbuilderswands; -import net.minecraft.item.Item; import net.minecraftforge.oredict.OreDictionary; import com.gtnewhorizon.cropsnh.blocks.BlockCropSticks; @@ -20,22 +19,16 @@ public static void postInit() { BlockCropSticks.BLOCK_INTERACTION_WITH .add(ModUtils.BetterBuildersWands.getItem("wandUnbreakable"), OreDictionary.WILDCARD_VALUE); - // diamond wand, can be disabled - Item item = ModUtils.BetterBuildersWands.getItemAllowNull("wandDiamond"); - if (item != null) { - BlockCropSticks.BLOCK_INTERACTION_WITH.add(item, OreDictionary.WILDCARD_VALUE); - } - - // stone wand, can be disabled - item = ModUtils.BetterBuildersWands.getItemAllowNull("wandStone"); - if (item != null) { - BlockCropSticks.BLOCK_INTERACTION_WITH.add(item, OreDictionary.WILDCARD_VALUE); - } - - // iron wand, can be disabled - item = ModUtils.BetterBuildersWands.getItemAllowNull("wandIron"); - if (item != null) { - BlockCropSticks.BLOCK_INTERACTION_WITH.add(item, OreDictionary.WILDCARD_VALUE); - } + // diamond wand + BlockCropSticks.BLOCK_INTERACTION_WITH + .add(ModUtils.BetterBuildersWands.getItem("wandDiamond"), OreDictionary.WILDCARD_VALUE); + + // stone wand + BlockCropSticks.BLOCK_INTERACTION_WITH + .add(ModUtils.BetterBuildersWands.getItem("wandStone"), OreDictionary.WILDCARD_VALUE); + + // iron wand + BlockCropSticks.BLOCK_INTERACTION_WITH + .add(ModUtils.BetterBuildersWands.getItem("wandIron"), OreDictionary.WILDCARD_VALUE); } } From 9a283e86fb4cad92d8b28d2576be970db4ea1daf Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <17766417+C0bra5@users.noreply.github.com> Date: Sun, 30 Aug 2026 04:35:17 -0400 Subject: [PATCH 7/7] listen to setBlock return value and use function with more parameters --- .../com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java b/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java index 33447367..cafb529e 100644 --- a/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java +++ b/src/main/java/com/gtnewhorizon/cropsnh/items/blocks/ItemCropSticks.java @@ -8,7 +8,6 @@ import com.gtnewhorizon.cropsnh.api.ICropRightClickHandler; import com.gtnewhorizon.cropsnh.api.ICropStickTile; -import com.gtnewhorizon.cropsnh.init.CropsNHBlocks; public class ItemCropSticks extends ItemBlockCropsNH implements ICropRightClickHandler { @@ -37,7 +36,7 @@ public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, i boolean isPlacingCross = player.isSneaking() && (player.capabilities.isCreativeMode || stack.stackSize >= 2); // place the stick - world.setBlock(x, y, z, CropsNHBlocks.blockCropSticks); + if (!world.setBlock(x, y, z, field_150939_a, metadata, 3)) return false; // upgrade it if necessary if (isPlacingCross && world.getTileEntity(x, y, z) instanceof ICropStickTile crop) {