From 04cb9b36fc698f7d8cda738db9134c516a97eade Mon Sep 17 00:00:00 2001 From: Spaghetti-OberNub <74196682+Spaghetti-OberNub@users.noreply.github.com> Date: Thu, 25 Jun 2026 04:09:35 +0200 Subject: [PATCH 01/10] added a config option for block swapped by reversing hoe --- .../common/items/tools/ItemReversingHoe.java | 33 ++++++++++++++----- .../unstabletools/ReversingHoeConfig.java | 5 +++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index 9cdf4164a..bdda6131e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -30,20 +30,35 @@ public ItemReversingHoe() { public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float clickX, float clickY, float clickZ) { Block block = world.getBlock(x, y, z); - // TODO: config for this - if (block == Blocks.dirt) { - world.setBlock(x, y, z, Blocks.grass); - return true; - } else if (block == Blocks.cobblestone) { - world.setBlock(x, y, z, Blocks.stone); - return true; - } else if (block == ModBlocks.CURSED_EARTH.get() && CursedEarthConfig.enableBlessedEarth) { + String blockName = Block.blockRegistry.getNameForObject(block); + + if (ReversingHoeConfig.blockTransformations != null) { + for (String transformation : ReversingHoeConfig.blockTransformations) { + if (transformation.contains("->")) { + String[] parts = transformation.split("->"); + String source = parts[0].trim(); + String target = parts[1].trim(); + + if (blockName.equals(source)) { + Block targetBlock = Block.getBlockFromName(target); + if (targetBlock != null) { + world.setBlock(x, y, z, targetBlock); + return true; + } + } + } + } + } + + if (block == ModBlocks.CURSED_EARTH.get() && CursedEarthConfig.enableBlessedEarth) { world.setBlock(x, y, z, ModBlocks.BLESSED_EARTH.get()); return true; } else if (block == ModBlocks.BLESSED_EARTH.get() && CursedEarthConfig.enableCursedEarth) { world.setBlock(x, y, z, ModBlocks.CURSED_EARTH.get()); return true; - } else if (block == Blocks.wheat) { + } + + else if (block == Blocks.wheat || block == Blocks.potatoes || block == Blocks.carrots) { int meta = world.getBlockMetadata(x, y, z); if (meta > 0) { world.setBlockMetadataWithNotify(x, y, z, meta - 1, 3); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java index b976ce001..3afcbecda 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java @@ -13,4 +13,9 @@ public class ReversingHoeConfig { @Config.RequiresMcRestart public static boolean unbreakable; + @Config.DefaultStringList({ "minecraft:dirt->minecraft:grass", "minecraft:cobblestone->minecraft:stone" }) + + @Config.RequiresMcRestart + public static String[] blockTransformations; + } From 21d3a046305eb2f8a9141dd85f77ec40f4d39324 Mon Sep 17 00:00:00 2001 From: Spaghetti-OberNub <74196682+Spaghetti-OberNub@users.noreply.github.com> Date: Thu, 25 Jun 2026 06:04:03 +0200 Subject: [PATCH 02/10] added a cache hashmap to reduce config checks --- .../common/items/tools/ItemReversingHoe.java | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index bdda6131e..19f99774c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess.common.items.tools; +import java.util.HashMap; import java.util.List; import net.minecraft.block.Block; @@ -19,35 +20,44 @@ // TODO: Add new features to the reversing hoe public class ItemReversingHoe extends ItemHoe implements ITranslucentItem { + private final HashMap blockConversionCache = new HashMap<>(); + public ItemReversingHoe() { super(ToolMaterial.EMERALD); setTextureName("utilitiesinexcess:reversing_hoe"); setUnlocalizedName("reversing_hoe"); if (ReversingHoeConfig.unbreakable) setMaxDamage(0); + + if (ReversingHoeConfig.blockTransformations != null) { + for (String transformation : ReversingHoeConfig.blockTransformations) { + if (transformation != null && transformation.contains("->")) { + String[] parts = transformation.split("->"); + Block sourceBlock = Block.getBlockFromName(parts[0].trim()); + Block targetBlock = Block.getBlockFromName(parts[1].trim()); + + if (sourceBlock != null && targetBlock != null) { + blockConversionCache.put(sourceBlock, targetBlock); + } + } + } + } } @Override public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float clickX, float clickY, float clickZ) { + if (world.isRemote) return false; + Block block = world.getBlock(x, y, z); - String blockName = Block.blockRegistry.getNameForObject(block); - if (ReversingHoeConfig.blockTransformations != null) { - for (String transformation : ReversingHoeConfig.blockTransformations) { - if (transformation.contains("->")) { - String[] parts = transformation.split("->"); - String source = parts[0].trim(); - String target = parts[1].trim(); - - if (blockName.equals(source)) { - Block targetBlock = Block.getBlockFromName(target); - if (targetBlock != null) { - world.setBlock(x, y, z, targetBlock); - return true; - } - } - } + if (blockConversionCache.containsKey(block)) { + Block targetBlock = blockConversionCache.get(block); + world.setBlock(x, y, z, targetBlock); + + if (!ReversingHoeConfig.unbreakable) { + itemStack.damageItem(1, player); } + return true; } if (block == ModBlocks.CURSED_EARTH.get() && CursedEarthConfig.enableBlessedEarth) { From 448b81af2caeab5c824d7b0e32cec3417ceac96e Mon Sep 17 00:00:00 2001 From: Spaghetti-OberNub <74196682+Spaghetti-OberNub@users.noreply.github.com> Date: Thu, 25 Jun 2026 06:58:33 +0200 Subject: [PATCH 03/10] initializing blockCache during first call of onItemUse --- .../common/items/tools/ItemReversingHoe.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index 19f99774c..fe2559be6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -21,13 +21,16 @@ public class ItemReversingHoe extends ItemHoe implements ITranslucentItem { private final HashMap blockConversionCache = new HashMap<>(); + private boolean cacheInitialized = false; public ItemReversingHoe() { super(ToolMaterial.EMERALD); setTextureName("utilitiesinexcess:reversing_hoe"); setUnlocalizedName("reversing_hoe"); if (ReversingHoeConfig.unbreakable) setMaxDamage(0); + } + public void initializeCache() { if (ReversingHoeConfig.blockTransformations != null) { for (String transformation : ReversingHoeConfig.blockTransformations) { if (transformation != null && transformation.contains("->")) { @@ -41,6 +44,7 @@ public ItemReversingHoe() { } } } + cacheInitialized = true; } @Override @@ -48,6 +52,8 @@ public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, float clickX, float clickY, float clickZ) { if (world.isRemote) return false; + if (!cacheInitialized) initializeCache(); + Block block = world.getBlock(x, y, z); if (blockConversionCache.containsKey(block)) { From 1a4de19bd4e0f2dad32f7d19c63d39e1bb02e015 Mon Sep 17 00:00:00 2001 From: Spaghetti-OberNub <74196682+Spaghetti-OberNub@users.noreply.github.com> Date: Sat, 27 Jun 2026 02:04:08 +0200 Subject: [PATCH 04/10] rewritten reversing hoe caching, as well as added caching to the destruction pickaxe --- .../utilitiesinexcess/CommonProxy.java | 5 ++ .../items/tools/ItemDestructionPickaxe.java | 64 +++++++++-------- .../common/items/tools/ItemReversingHoe.java | 70 +++++++++++++++---- .../DestructionPickaxeConfig.java | 4 +- 4 files changed, 99 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 8ec875bd4..210c61c90 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -5,6 +5,8 @@ import com.fouristhenumber.utilitiesinexcess.client.IMCForNEI; import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.EndOfTimeEvents; import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.UnderWorldEvents; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemReversingHoe; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.exu.PosteaTransforms; @@ -62,6 +64,9 @@ public void postInit(FMLPostInitializationEvent event) { if (OtherConfig.enableWorldConversion && !Mods.ExtraUtilities.isLoaded() && Mods.Postea.isLoaded()) { PosteaTransforms.postInit(); } + + ItemReversingHoe.initializeCache(); + ItemDestructionPickaxe.initializeCache(); } public void serverStarting(FMLServerStartingEvent event) {} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java index b0e712df7..f2273bf06 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java @@ -1,8 +1,8 @@ package com.fouristhenumber.utilitiesinexcess.common.items.tools; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; -import java.util.regex.Pattern; +import java.util.Set; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; @@ -15,8 +15,7 @@ import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; - -import akka.japi.Pair; +import com.gtnewhorizon.gtnhlib.util.data.BlockMeta; public class ItemDestructionPickaxe extends ItemPickaxe implements ITranslucentItem { @@ -27,25 +26,32 @@ public ItemDestructionPickaxe() { if (DestructionPickaxeConfig.unbreakable) setMaxDamage(0); } - private final static HashMap compiledPatterns = new HashMap<>(); - private final static HashMap, Boolean> resultLookup = new HashMap<>(); - - public static boolean blockMatches(String name, String pattern) { - // Prob can be made cleaner - if (!compiledPatterns.containsKey(name)) { - String replaceWildcard = pattern.replace(".", "\\.") - .replace("*", ".*?") - .replace("(", "\\(") - .replace(")", "\\)"); - compiledPatterns.put(pattern, Pattern.compile(replaceWildcard)); - } - Pattern p = compiledPatterns.get(pattern); - if (!resultLookup.containsKey(new Pair<>(pattern, name))) { - boolean res = p.matcher(name) - .matches(); - resultLookup.put(new Pair<>(pattern, name), res); + public static final Set affectedBlockCache = new HashSet<>(); + + public static void initializeCache() { + if (DestructionPickaxeConfig.includeEffective != null) { + for (String affectedBlockString : DestructionPickaxeConfig.includeEffective) { + int meta; + String affectedBlockName; + + if (affectedBlockString.contains("*")) { + String[] nameAndMeta = affectedBlockString.split("\\*"); + affectedBlockName = nameAndMeta[0]; + String sourceMetaString = nameAndMeta[1].toUpperCase(); + + meta = Integer.parseInt(sourceMetaString, 16); + } else { + affectedBlockName = affectedBlockString; + meta = -1; + } + + Block block = Block.getBlockFromName(affectedBlockName); + + if (block != null) { + affectedBlockCache.add(new BlockMeta(block, meta)); + } + } } - return resultLookup.get(new Pair<>(pattern, name)); } @Override @@ -60,14 +66,14 @@ public boolean onBlockDestroyed(ItemStack stack, World worldIn, Block blockIn, i @Override public float getDigSpeed(ItemStack stack, Block block, int meta) { - var i = DestructionPickaxeConfig.includeEffective; - var w = DestructionPickaxeConfig.excludeEffective; - var name = block.delegate.name(); - for (String s : w) if (blockMatches(name, s)) - return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier; - for (String s : i) if (blockMatches(name, s)) + BlockMeta exactMatch = new BlockMeta(block, meta); + BlockMeta wildcardMatch = new BlockMeta(block, -1); + + if (affectedBlockCache.contains(exactMatch) || affectedBlockCache.contains(wildcardMatch)) { return efficiencyOnProperMaterial * DestructionPickaxeConfig.effectiveSpeedModifier; - return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier; + } else { + return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier; + } } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index fe2559be6..9adf00d52 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -16,12 +16,12 @@ import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; +import com.gtnewhorizon.gtnhlib.util.data.BlockMeta; // TODO: Add new features to the reversing hoe public class ItemReversingHoe extends ItemHoe implements ITranslucentItem { - private final HashMap blockConversionCache = new HashMap<>(); - private boolean cacheInitialized = false; + public static final HashMap blockConversionCache = new HashMap<>(); public ItemReversingHoe() { super(ToolMaterial.EMERALD); @@ -30,21 +30,54 @@ public ItemReversingHoe() { if (ReversingHoeConfig.unbreakable) setMaxDamage(0); } - public void initializeCache() { + public static void initializeCache() { if (ReversingHoeConfig.blockTransformations != null) { for (String transformation : ReversingHoeConfig.blockTransformations) { if (transformation != null && transformation.contains("->")) { String[] parts = transformation.split("->"); - Block sourceBlock = Block.getBlockFromName(parts[0].trim()); - Block targetBlock = Block.getBlockFromName(parts[1].trim()); + + String sourceBlockString = parts[0].trim(); + String targetBlockString = parts[1].trim(); + + String sourceName; + int sourceMeta; + + String targetName; + int targetMeta; + + if (sourceBlockString.contains("*")) { + String[] nameAndMeta = sourceBlockString.split("\\*"); + sourceName = nameAndMeta[0]; + String sourceMetaString = nameAndMeta[1].toUpperCase(); + + sourceMeta = Integer.parseInt(sourceMetaString, 16); + } else { + sourceName = sourceBlockString; + sourceMeta = -1; + } + + if (targetBlockString.contains("*")) { + String[] nameAndMeta = targetBlockString.split("\\*"); + targetName = nameAndMeta[0]; + String targetMetaString = nameAndMeta[1].toUpperCase(); + + targetMeta = Integer.parseInt(targetMetaString, 16); + + } else { + targetName = targetBlockString; + targetMeta = 0; + } + + Block sourceBlock = Block.getBlockFromName(sourceName); + Block targetBlock = Block.getBlockFromName(targetName); if (sourceBlock != null && targetBlock != null) { - blockConversionCache.put(sourceBlock, targetBlock); + blockConversionCache + .put(new BlockMeta(sourceBlock, sourceMeta), new BlockMeta(targetBlock, targetMeta)); } } } } - cacheInitialized = true; } @Override @@ -52,17 +85,30 @@ public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, float clickX, float clickY, float clickZ) { if (world.isRemote) return false; - if (!cacheInitialized) initializeCache(); - Block block = world.getBlock(x, y, z); + int metaInWorld = world.getBlockMetadata(x, y, z); - if (blockConversionCache.containsKey(block)) { - Block targetBlock = blockConversionCache.get(block); - world.setBlock(x, y, z, targetBlock); + BlockMeta exactKey = new BlockMeta(block, metaInWorld); + BlockMeta wildcardKey = new BlockMeta(block, -1); + + BlockMeta targetData = null; + + if (blockConversionCache.containsKey(exactKey)) { + targetData = blockConversionCache.get(exactKey); + } else if (blockConversionCache.containsKey(wildcardKey)) { + targetData = blockConversionCache.get(wildcardKey); + } + + if (targetData != null) { + Block targetBlock = targetData.getBlock(); + int targetMeta = targetData.getBlockMeta(); + + world.setBlock(x, y, z, targetBlock, targetMeta, 3); if (!ReversingHoeConfig.unbreakable) { itemStack.damageItem(1, player); } + return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java index e645443c4..469a2c8fb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java @@ -14,10 +14,8 @@ public class DestructionPickaxeConfig { public static boolean unbreakable; @Config.DefaultBoolean(false) public static boolean voidMinedBlock; - @Config.DefaultStringList({ "minecraft:*stone", "minecraft:netherrack", "minecraft:*hardened_clay" }) + @Config.DefaultStringList({ "minecraft:stone", "minecraft:netherrack", "minecraft:hardened_clay" }) public static String[] includeEffective; - @Config.DefaultStringList({}) - public static String[] excludeEffective; @Config.DefaultFloat(5) @Config.RangeFloat(min = 0, max = 100) public static float effectiveSpeedModifier; From e12e0ce8eb74f3078abe3309fb6014a006e95c8a Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Sat, 27 Jun 2026 01:08:27 -0400 Subject: [PATCH 05/10] Refactor: add warnings, use : separator, don't use hex --- .../items/tools/ItemDestructionPickaxe.java | 38 ++++++----- .../common/items/tools/ItemReversingHoe.java | 63 +++++++++---------- 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java index f2273bf06..8651c969b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java @@ -13,10 +13,13 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; import com.gtnewhorizon.gtnhlib.util.data.BlockMeta; +import cpw.mods.fml.common.registry.GameRegistry; + public class ItemDestructionPickaxe extends ItemPickaxe implements ITranslucentItem { public ItemDestructionPickaxe() { @@ -30,25 +33,26 @@ public ItemDestructionPickaxe() { public static void initializeCache() { if (DestructionPickaxeConfig.includeEffective != null) { - for (String affectedBlockString : DestructionPickaxeConfig.includeEffective) { - int meta; - String affectedBlockName; - - if (affectedBlockString.contains("*")) { - String[] nameAndMeta = affectedBlockString.split("\\*"); - affectedBlockName = nameAndMeta[0]; - String sourceMetaString = nameAndMeta[1].toUpperCase(); - - meta = Integer.parseInt(sourceMetaString, 16); - } else { - affectedBlockName = affectedBlockString; - meta = -1; - } + for (String blockString : DestructionPickaxeConfig.includeEffective) { + if (blockString == null) continue; + try { + String[] split = blockString.trim() + .split(":"); + String domain = split[0]; + String name = split[1]; + int meta = split.length == 3 ? Integer.parseInt(split[2]) : -1; + + Block block = GameRegistry.findBlock(domain, name); + + if (block == null) { + UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Could not find {}, skipped", blockString); + continue; + } - Block block = Block.getBlockFromName(affectedBlockName); - - if (block != null) { affectedBlockCache.add(new BlockMeta(block, meta)); + + } catch (Exception e) { + UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Skipped malformed config: {}", blockString); } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index 9adf00d52..290c51be7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -13,11 +13,14 @@ import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; import com.gtnewhorizon.gtnhlib.util.data.BlockMeta; +import cpw.mods.fml.common.registry.GameRegistry; + // TODO: Add new features to the reversing hoe public class ItemReversingHoe extends ItemHoe implements ITranslucentItem { @@ -33,48 +36,40 @@ public ItemReversingHoe() { public static void initializeCache() { if (ReversingHoeConfig.blockTransformations != null) { for (String transformation : ReversingHoeConfig.blockTransformations) { - if (transformation != null && transformation.contains("->")) { + if (transformation == null) continue; + if (!transformation.contains("->")) { + UtilitiesInExcess.LOG + .warn("Reversing Hoe Config: {} does not contain '->', skipped", transformation); + continue; + } + try { String[] parts = transformation.split("->"); - String sourceBlockString = parts[0].trim(); - String targetBlockString = parts[1].trim(); - - String sourceName; - int sourceMeta; - - String targetName; - int targetMeta; + String[] sourceSplit = parts[0].trim() + .split(":"); + String sourceDomain = sourceSplit[0]; + String sourceName = sourceSplit[1]; + int sourceMeta = sourceSplit.length == 3 ? Integer.parseInt(sourceSplit[2]) : -1; - if (sourceBlockString.contains("*")) { - String[] nameAndMeta = sourceBlockString.split("\\*"); - sourceName = nameAndMeta[0]; - String sourceMetaString = nameAndMeta[1].toUpperCase(); + String[] targetSplit = parts[1].trim() + .split(":"); + String targetDomain = targetSplit[0]; + String targetName = targetSplit[1]; + int targetMeta = targetSplit.length == 3 ? Integer.parseInt(targetSplit[2]) : 0; - sourceMeta = Integer.parseInt(sourceMetaString, 16); - } else { - sourceName = sourceBlockString; - sourceMeta = -1; - } - - if (targetBlockString.contains("*")) { - String[] nameAndMeta = targetBlockString.split("\\*"); - targetName = nameAndMeta[0]; - String targetMetaString = nameAndMeta[1].toUpperCase(); + Block sourceBlock = GameRegistry.findBlock(sourceDomain, sourceName); + Block targetBlock = GameRegistry.findBlock(targetDomain, targetName); - targetMeta = Integer.parseInt(targetMetaString, 16); - - } else { - targetName = targetBlockString; - targetMeta = 0; + if (sourceBlock == null || targetBlock == null) { + UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Could not find {}, skipped", transformation); + continue; } - Block sourceBlock = Block.getBlockFromName(sourceName); - Block targetBlock = Block.getBlockFromName(targetName); + blockConversionCache + .put(new BlockMeta(sourceBlock, sourceMeta), new BlockMeta(targetBlock, targetMeta)); - if (sourceBlock != null && targetBlock != null) { - blockConversionCache - .put(new BlockMeta(sourceBlock, sourceMeta), new BlockMeta(targetBlock, targetMeta)); - } + } catch (Exception e) { + UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Skipped malformed config: {}", transformation); } } } From 5ef615dd9d0d49ada0accf1574ef749101c39844 Mon Sep 17 00:00:00 2001 From: Spaghetti-OberNub <74196682+Spaghetti-OberNub@users.noreply.github.com> Date: Sat, 27 Jun 2026 07:13:43 +0200 Subject: [PATCH 06/10] Update log messages for Destruction Pickaxe config --- .../common/items/tools/ItemDestructionPickaxe.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java index 8651c969b..2fac1a110 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java @@ -45,14 +45,14 @@ public static void initializeCache() { Block block = GameRegistry.findBlock(domain, name); if (block == null) { - UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Could not find {}, skipped", blockString); + UtilitiesInExcess.LOG.warn("Destruction Pickaxe Config: Could not find {}, skipped", blockString); continue; } affectedBlockCache.add(new BlockMeta(block, meta)); } catch (Exception e) { - UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Skipped malformed config: {}", blockString); + UtilitiesInExcess.LOG.warn("Destruction Pickaxe Config: Skipped malformed config: {}", blockString); } } } From 02d0b0a4caf8ef6b798be25146d599294b36fe71 Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Sat, 27 Jun 2026 01:14:55 -0400 Subject: [PATCH 07/10] Update default pickaxe config --- .../common/items/tools/ItemDestructionPickaxe.java | 3 ++- .../config/items/unstabletools/DestructionPickaxeConfig.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java index 2fac1a110..51c335e20 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java @@ -45,7 +45,8 @@ public static void initializeCache() { Block block = GameRegistry.findBlock(domain, name); if (block == null) { - UtilitiesInExcess.LOG.warn("Destruction Pickaxe Config: Could not find {}, skipped", blockString); + UtilitiesInExcess.LOG + .warn("Destruction Pickaxe Config: Could not find {}, skipped", blockString); continue; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java index 469a2c8fb..20a9fd932 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java @@ -14,7 +14,8 @@ public class DestructionPickaxeConfig { public static boolean unbreakable; @Config.DefaultBoolean(false) public static boolean voidMinedBlock; - @Config.DefaultStringList({ "minecraft:stone", "minecraft:netherrack", "minecraft:hardened_clay" }) + @Config.DefaultStringList({ "minecraft:stone", "minecraft:cobblestone", "minecraft:sandstone", + "minecraft:netherrack", "minecraft:hardened_clay", "minecraft:stained_hardened_clay" }) public static String[] includeEffective; @Config.DefaultFloat(5) @Config.RangeFloat(min = 0, max = 100) From f0415afffb0e712a91ca3719c5d0e561a0765199 Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Sat, 27 Jun 2026 01:19:22 -0400 Subject: [PATCH 08/10] Add docs --- .../items/unstabletools/DestructionPickaxeConfig.java | 6 ++++++ .../config/items/unstabletools/ReversingHoeConfig.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java index 20a9fd932..d7927c6e4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java @@ -9,17 +9,23 @@ public class DestructionPickaxeConfig { @Config.DefaultBoolean(true) @Config.RequiresMcRestart public static boolean enable; + @Config.DefaultBoolean(true) @Config.RequiresMcRestart public static boolean unbreakable; + @Config.DefaultBoolean(false) public static boolean voidMinedBlock; + + @Config.Comment("Which blocks the pickaxe is effective against. Format as modid:blockid:meta - if meta is not specified, will use any meta.") @Config.DefaultStringList({ "minecraft:stone", "minecraft:cobblestone", "minecraft:sandstone", "minecraft:netherrack", "minecraft:hardened_clay", "minecraft:stained_hardened_clay" }) public static String[] includeEffective; + @Config.DefaultFloat(5) @Config.RangeFloat(min = 0, max = 100) public static float effectiveSpeedModifier; + @Config.DefaultFloat(0.0625f) @Config.RangeFloat(min = 0, max = 100) public static float ineffectiveSpeedModifier; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java index 3afcbecda..77a655275 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java @@ -13,8 +13,8 @@ public class ReversingHoeConfig { @Config.RequiresMcRestart public static boolean unbreakable; + @Config.Comment("Which block transformations the reversing hoe will work on. Format as modid:blockid:meta->modid:blockid:meta - if meta of source block is not specified, will work on any meta. If meta of target block is not specified, will transform into meta 0.") @Config.DefaultStringList({ "minecraft:dirt->minecraft:grass", "minecraft:cobblestone->minecraft:stone" }) - @Config.RequiresMcRestart public static String[] blockTransformations; From 0b76833d4eecb84aa1dd23bda118bfc8b25579f2 Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Sun, 28 Jun 2026 02:33:56 -0400 Subject: [PATCH 09/10] Address review --- .../common/items/tools/ItemReversingHoe.java | 17 +++-------------- .../items/unstabletools/ReversingHoeConfig.java | 4 +++- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index 290c51be7..6b44f6b2c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -12,9 +12,7 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; import com.gtnewhorizon.gtnhlib.util.data.BlockMeta; @@ -78,7 +76,6 @@ public static void initializeCache() { @Override public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float clickX, float clickY, float clickZ) { - if (world.isRemote) return false; Block block = world.getBlock(x, y, z); int metaInWorld = world.getBlockMetadata(x, y, z); @@ -98,27 +95,19 @@ public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, Block targetBlock = targetData.getBlock(); int targetMeta = targetData.getBlockMeta(); - world.setBlock(x, y, z, targetBlock, targetMeta, 3); + if (!world.isRemote) world.setBlock(x, y, z, targetBlock, targetMeta, 3); if (!ReversingHoeConfig.unbreakable) { - itemStack.damageItem(1, player); + if (!world.isRemote) itemStack.damageItem(1, player); } return true; } - if (block == ModBlocks.CURSED_EARTH.get() && CursedEarthConfig.enableBlessedEarth) { - world.setBlock(x, y, z, ModBlocks.BLESSED_EARTH.get()); - return true; - } else if (block == ModBlocks.BLESSED_EARTH.get() && CursedEarthConfig.enableCursedEarth) { - world.setBlock(x, y, z, ModBlocks.CURSED_EARTH.get()); - return true; - } - else if (block == Blocks.wheat || block == Blocks.potatoes || block == Blocks.carrots) { int meta = world.getBlockMetadata(x, y, z); if (meta > 0) { - world.setBlockMetadataWithNotify(x, y, z, meta - 1, 3); + if (!world.isRemote) world.setBlockMetadataWithNotify(x, y, z, meta - 1, 3); return true; } return false; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java index 77a655275..d47d08777 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java @@ -14,7 +14,9 @@ public class ReversingHoeConfig { public static boolean unbreakable; @Config.Comment("Which block transformations the reversing hoe will work on. Format as modid:blockid:meta->modid:blockid:meta - if meta of source block is not specified, will work on any meta. If meta of target block is not specified, will transform into meta 0.") - @Config.DefaultStringList({ "minecraft:dirt->minecraft:grass", "minecraft:cobblestone->minecraft:stone" }) + @Config.DefaultStringList({ "minecraft:dirt->minecraft:grass", "minecraft:cobblestone->minecraft:stone", + "utilitiesinexcess:cursed_earth->utilitiesinexcess:blessed_earth", + "utilitiesinexcess:blessed_earth->utilitiesinexcess:cursed_earth" }) @Config.RequiresMcRestart public static String[] blockTransformations; From 72fe3ae475816ac2a6d9bd14c2cbfce86148714f Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Sun, 28 Jun 2026 06:19:55 -0400 Subject: [PATCH 10/10] Fix --- .../common/items/tools/ItemReversingHoe.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index 6b44f6b2c..9ef0881ac 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -95,10 +95,12 @@ public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, Block targetBlock = targetData.getBlock(); int targetMeta = targetData.getBlockMeta(); - if (!world.isRemote) world.setBlock(x, y, z, targetBlock, targetMeta, 3); + if (!world.isRemote) { + world.setBlock(x, y, z, targetBlock, targetMeta, 3); - if (!ReversingHoeConfig.unbreakable) { - if (!world.isRemote) itemStack.damageItem(1, player); + if (!ReversingHoeConfig.unbreakable) { + itemStack.damageItem(1, player); + } } return true;