From 90330d6d66767053b85c05efa3fa89cd19c65ee7 Mon Sep 17 00:00:00 2001 From: loenaaaa Date: Wed, 14 Jan 2026 19:39:17 +0800 Subject: [PATCH 1/7] changed to use config + refactor --- .../items/ItemInversionSigilActive.java | 138 ++++++++++++------ .../config/items/InversionConfig.java | 46 +++++- 2 files changed, 137 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index cb0beb02..2c051664 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -1,8 +1,10 @@ package com.fouristhenumber.utilitiesinexcess.common.items; import static com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig.awakenedInversionDurability; +import static com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig.chestSplashPotionsValid; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import net.minecraft.block.Block; @@ -35,6 +37,7 @@ import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent; +import org.apache.logging.log4j.Level; import org.jetbrains.annotations.NotNull; import com.fouristhenumber.utilitiesinexcess.ModItems; @@ -42,11 +45,13 @@ import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.registry.GameRegistry; public class ItemInversionSigilActive extends Item { @@ -54,28 +59,13 @@ public class ItemInversionSigilActive extends Item { private static final int BEACON_SEARCH_RADIUS = 6; private final int[][] LIGHTNING_POSITIONS = { { 0, 0 }, { -5, 0 }, { 5, 0 }, { 0, -5 }, { 0, 5 } }; - private final ItemStack[] CHEST_NORTH_CONTENTS = { new ItemStack(Blocks.stone), new ItemStack(Items.brick), - new ItemStack(Blocks.glass), new ItemStack(Items.cooked_fished), new ItemStack(Blocks.hardened_clay), - new ItemStack(Items.dye, 1, 2), new ItemStack(Items.coal, 1, 1), new ItemStack(Items.cooked_beef), - new ItemStack(Items.iron_ingot), new ItemStack(Items.cooked_chicken), new ItemStack(Items.gold_ingot), - new ItemStack(Items.baked_potato), new ItemStack(Items.cooked_porkchop), new ItemStack(Items.netherbrick) }; + private HashSet CHEST_NORTH_CONTENTS = new HashSet<>(); - private final int[] POTION_IDS = { 8193, 8194, 8195, 8196, 8197, 8198, 8200, 8201, 8202, 8204, 8205, 8206, 8225, - 8226, 8228, 8229, 8232, 8233, 8234, 8236, 8257, 8258, 8259, 8260, 8262, 8264, 8265, 8267, 8268, 8269, 8270 }; + private HashSet CHEST_EAST_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_EAST_CONTENTS = new ItemStack[62]; + private HashSet CHEST_SOUTH_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_SOUTH_CONTENTS = { new ItemStack(Blocks.grass), new ItemStack(Blocks.lapis_ore), - new ItemStack(Blocks.dirt), new ItemStack(Blocks.obsidian), new ItemStack(Blocks.sand), - new ItemStack(Blocks.diamond_ore), new ItemStack(Blocks.gravel), new ItemStack(Blocks.redstone_ore), - new ItemStack(Blocks.gold_ore), new ItemStack(Blocks.clay), new ItemStack(Blocks.iron_ore), - new ItemStack(Blocks.emerald_ore), new ItemStack(Blocks.coal_ore) }; - - private final ItemStack[] CHEST_WEST_CONTENTS = { new ItemStack(Items.record_13), - new ItemStack(Items.record_mellohi), new ItemStack(Items.record_cat), new ItemStack(Items.record_stal), - new ItemStack(Items.record_blocks), new ItemStack(Items.record_strad), new ItemStack(Items.record_chirp), - new ItemStack(Items.record_ward), new ItemStack(Items.record_far), new ItemStack(Items.record_11), - new ItemStack(Items.record_mall), new ItemStack(Items.record_wait) }; + private HashSet CHEST_WEST_CONTENTS = new HashSet<>(); public ItemInversionSigilActive() { super(); @@ -84,10 +74,25 @@ public ItemInversionSigilActive() { setMaxStackSize(1); setContainerItem(this); - for (int i = 0; i < 31; i++) { - CHEST_EAST_CONTENTS[2 * i] = new ItemStack(Items.potionitem, 1, POTION_IDS[i]); - CHEST_EAST_CONTENTS[2 * i + 1] = new ItemStack(Items.potionitem, 1, POTION_IDS[i] + 8192); - } + CHEST_NORTH_CONTENTS = getValidChestContents( + ForgeDirection.NORTH, + InversionConfig.northChestValidItems, + InversionConfig.northChestRequiredItems); + + CHEST_EAST_CONTENTS = getValidChestContents( + ForgeDirection.EAST, + InversionConfig.eastChestValidItems, + InversionConfig.eastChestRequiredItems); + + CHEST_SOUTH_CONTENTS = getValidChestContents( + ForgeDirection.SOUTH, + InversionConfig.southChestValidItems, + InversionConfig.southChestRequiredItems); + + CHEST_WEST_CONTENTS = getValidChestContents( + ForgeDirection.WEST, + InversionConfig.westChestValidItems, + InversionConfig.westChestRequiredItems); ItemInversionSigilActiveEvents eventHandler = new ItemInversionSigilActiveEvents(); MinecraftForge.EVENT_BUS.register(eventHandler); @@ -96,6 +101,52 @@ public ItemInversionSigilActive() { .register(eventHandler); } + private HashSet getValidChestContents(ForgeDirection direction, String[] itemIds, int itemReq) { + int length = itemIds.length; + HashSet validChestContents = new HashSet<>(); + if (itemReq > length) { + FMLLog.log( + Level.WARN, + "There are only %s valid items for the %s ritual, but there are %s required items! The ritual will be impossible!", + length, + direction.toString(), + itemReq); + } + for (String itemId : itemIds) { + String[] itemIdSplit = itemId.split(":"); + ItemStack validChestItemStack; + if (itemIdSplit.length == 1) { + validChestItemStack = null; + } else if (itemIdSplit.length == 2) { + validChestItemStack = new ItemStack(GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1])); + } else { + Item validChestItem = GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1]); + int validChestItemMeta = Integer.parseInt(itemIdSplit[2]); + validChestItemStack = new ItemStack(validChestItem, 1, validChestItemMeta); + if (validChestItem == Items.potionitem && chestSplashPotionsValid) { + validChestContents.add(new ItemStack(validChestItem, 1, validChestItemMeta + 8192)); + FMLLog.log( + Level.DEBUG, + "Used splash potion %s as siege requirement from item id %s.", + StatCollector.translateToLocal( + new ItemStack(validChestItem, 1, validChestItemMeta + 8192).getDisplayName()), + itemId); + } + } + if (validChestItemStack == null) { + FMLLog.log(Level.WARN, "Could not parse item id %s for the %s ritual!", itemId, direction.toString()); + } else { + FMLLog.log( + Level.DEBUG, + "Used item %s as siege requirement from item id %s.", + StatCollector.translateToLocal(validChestItemStack.getDisplayName()), + itemId); + } + validChestContents.add(validChestItemStack); + } + return validChestContents; + } + private EntitySiegeProperty getProperties(EntityPlayer player) { return (EntitySiegeProperty) player.getExtendedProperties(EntitySiegeProperty.PROP_KEY); } @@ -209,18 +260,14 @@ private void startSiege(World world, int beaconX, int beaconY, int beaconZ, Enti curentity.setDead(); } } - for (int i = 0; i < LIGHTNING_POSITIONS.length; i++) { + for (int[] lightningPosition : LIGHTNING_POSITIONS) { EntityLightningBolt lightningBolt = new EntityLightningBolt( world, - beaconX + LIGHTNING_POSITIONS[i][0] + 0.5, + beaconX + lightningPosition[0] + 0.5, beaconY + 0.5, - beaconZ + LIGHTNING_POSITIONS[i][1] + 0.5); + beaconZ + lightningPosition[1] + 0.5); world.addWeatherEffect(lightningBolt); - world.setBlock( - beaconX + LIGHTNING_POSITIONS[i][0], - beaconY, - beaconZ + LIGHTNING_POSITIONS[i][1], - Blocks.air); + world.setBlock(beaconX + lightningPosition[0], beaconY, beaconZ + lightningPosition[1], Blocks.air); } } @@ -246,28 +293,25 @@ private void endSiege(boolean won, EntityPlayer player) { } private boolean checkChest(TileEntityChest chest, ItemStack[] itemsToCheck, int requiredAmount) { - int foundItemsAmount = 0; - boolean[] hasItem = new boolean[itemsToCheck.length]; + int confirmedItems = 0; + boolean[] hasItems = new boolean[itemsToCheck.length]; for (int i = 0; i < chest.getSizeInventory(); i++) { ItemStack stack = chest.getStackInSlot(i); for (int j = 0; j < itemsToCheck.length; j++) { - if (stack != null && ItemStack.areItemStacksEqual(stack, itemsToCheck[j])) { - hasItem[j] = true; - break; + if (ItemStack.areItemStackTagsEqual(stack, itemsToCheck[j])) { + hasItems[j] = true; } } } for (int i = 0; i < itemsToCheck.length; i++) { - if (hasItem[i]) { - foundItemsAmount++; - } + confirmedItems++; } - return foundItemsAmount >= requiredAmount; + return confirmedItems >= requiredAmount; } private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int beaconY, int beaconZ, World world) { - ItemStack[] contents; + HashSet contents; int requiredAmount; if (direction == ForgeDirection.NORTH) { @@ -290,8 +334,16 @@ private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int throw new IllegalArgumentException("Invalid direction passed: " + direction); } + ItemStack[] contentsArray = new ItemStack[contents.size()]; + int index = 0; + + for (ItemStack content : contents) { + contentsArray[index] = content; + index++; + } + if (world.getTileEntity(beaconX, beaconY, beaconZ) instanceof TileEntityChest chest) { - return checkChest(chest, contents, requiredAmount); + return checkChest(chest, contentsArray, requiredAmount); } return false; } @@ -452,7 +504,7 @@ public void whenPlayerLeavesEnd(PlayerEvent.PlayerChangedDimensionEvent event) { } @SubscribeEvent(priority = EventPriority.NORMAL) - public void whenPlayerLeavesEnd2(PlayerEvent.PlayerRespawnEvent event) { + public void whenPlayerLeavesEndAlternate(PlayerEvent.PlayerRespawnEvent event) { if (getProperties(event.player).siege) { event.player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.leftEnd")); endSiege(false, event.player); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java index 8ce594cf..fb1b7171 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java @@ -20,24 +20,62 @@ public class InversionConfig { @Config.Comment("Amount of unique items in the list the north chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 14) + @Config.RangeInt(min = 1, max = 10000) public static int northChestRequiredItems; + @Config.Comment("List of valid items the north chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:stone", "minecraft:brick", "minecraft:glass", "minecraft:cooked_fished", + "minecraft:hardened_clay", "minecraft:dye:2", "minecraft:coal:1", "minecraft:cooked_beef", + "minecraft:iron_ingot", "minecraft:cooked_chicken", "minecraft:gold_ingot", "minecraft:baked_potato", + "minecraft:cooked_porkchop", "minecraft:netherbrick" }) + public static String[] northChestValidItems; + @Config.Comment("Amount of unique items in the list the east chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 27) + @Config.RangeInt(min = 1, max = 10000) public static int eastChestRequiredItems; + @Config.Comment("List of valid items the east chest can contain. Must be item ids in the form 'modid:itemname:meta'. Enable splash potions with chestSplashPotionsValid (applies for other chests too).") + @Config.DefaultStringList( + value = { "minecraft:potion:8193", "minecraft:potion:8194", "minecraft:potion:8195", "minecraft:potion:8196", + "minecraft:potion:8197", "minecraft:potion:8198", "minecraft:potion:8200", "minecraft:potion:8201", + "minecraft:potion:8202", "minecraft:potion:8204", "minecraft:potion:8205", "minecraft:potion:8206", + "minecraft:potion:8225", "minecraft:potion:8226", "minecraft:potion:8228", "minecraft:potion:8229", + "minecraft:potion:8232", "minecraft:potion:8233", "minecraft:potion:8234", "minecraft:potion:8236", + "minecraft:potion:8257", "minecraft:potion:8258", "minecraft:potion:8259", "minecraft:potion:8260", + "minecraft:potion:8262", "minecraft:potion:8264", "minecraft:potion:8265", "minecraft:potion:8267", + "minecraft:potion:8268", "minecraft:potion:8269", "minecraft:potion:8270" }) + public static String[] eastChestValidItems; + @Config.Comment("Amount of unique items in the list the south chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 13) + @Config.RangeInt(min = 1, max = 10000) public static int southChestRequiredItems; + @Config.Comment("List of valid items the south chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:grass", "minecraft:lapis_ore", "minecraft:dirt", "minecraft:obsidian", "minecraft:sand", + "minecraft:diamond_ore", "minecraft:gravel", "minecraft:redstone_ore", "minecraft:gold_ore", + "minecraft:clay", "minecraft:iron_ore", "minecraft:emerald_ore", "minecraft:coal_ore" }) + public static String[] southChestValidItems; + @Config.Comment("Amount of unique items in the list the west chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 12) + @Config.RangeInt(min = 1, max = 10000) public static int westChestRequiredItems; + @Config.Comment("List of valid items the west chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:record_13", "minecraft:record_mellohi", "minecraft:record_cat", "minecraft:record_stal", + "minecraft:record_blocks", "minecraft:record_strad", "minecraft:record_chirp", "minecraft:record_ward", + "minecraft:record_far", "minecraft:record_11", "minecraft:record_mall", "minecraft:record_wait" }) + public static String[] westChestValidItems; + + @Config.Comment("Whether or not vanilla splash potions should also be valid if a regular potion of the same type is found.") + @Config.DefaultBoolean(true) + public static boolean chestSplashPotionsValid; + @Config.Comment("Amount of mobs needed to kill to pass the siege of the ritual") @Config.DefaultInt(100) @Config.RangeInt(min = 4) From d6875cf333fed2a35e4f2092efdd835d70777d76 Mon Sep 17 00:00:00 2001 From: loenaaaa Date: Wed, 14 Jan 2026 19:48:59 +0800 Subject: [PATCH 2/7] use right method --- .../common/items/ItemInversionSigilActive.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index 2c051664..03b00083 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -298,7 +298,7 @@ private boolean checkChest(TileEntityChest chest, ItemStack[] itemsToCheck, int for (int i = 0; i < chest.getSizeInventory(); i++) { ItemStack stack = chest.getStackInSlot(i); for (int j = 0; j < itemsToCheck.length; j++) { - if (ItemStack.areItemStackTagsEqual(stack, itemsToCheck[j])) { + if (ItemStack.areItemStacksEqual(stack, itemsToCheck[j])) { hasItems[j] = true; } } From db6fca431a9fc2ec185025604ca9e2a9580471ee Mon Sep 17 00:00:00 2001 From: loenaaaa Date: Thu, 15 Jan 2026 07:33:50 +0800 Subject: [PATCH 3/7] use wrapper class and hashSet --- .../api/ItemStackBaseCompare.java | 35 +++++++++++++++++++ .../items/ItemInversionSigilActive.java | 33 +++++++---------- 2 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java new file mode 100644 index 00000000..a8d8ead0 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.api; + +import java.util.Objects; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Wrapper class of ItemStack that compares with itemStack Item, Count and Damage. + */ + +public class ItemStackBaseCompare { + + public ItemStackBaseCompare(ItemStack itemStack) { + itemStackItem = itemStack.getItem(); + itemStackCount = itemStack.stackSize; + itemStackDamage = itemStack.getItemDamage(); + } + + Item itemStackItem; + int itemStackCount; + int itemStackDamage; + + @Override + public boolean equals(Object o) { + if (!(o instanceof ItemStackBaseCompare that)) return false; + return itemStackCount == that.itemStackCount && itemStackDamage == that.itemStackDamage + && Objects.equals(itemStackItem, that.itemStackItem); + } + + @Override + public int hashCode() { + return Objects.hash(itemStackItem, itemStackCount, itemStackDamage); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index 03b00083..89c58dea 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -41,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.api.ItemStackBaseCompare; import com.fouristhenumber.utilitiesinexcess.common.entities.EntitySiegeProperty; import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; @@ -292,21 +293,21 @@ private void endSiege(boolean won, EntityPlayer player) { } } - private boolean checkChest(TileEntityChest chest, ItemStack[] itemsToCheck, int requiredAmount) { - int confirmedItems = 0; - boolean[] hasItems = new boolean[itemsToCheck.length]; + private boolean checkChest(TileEntityChest chest, HashSet itemsToCheck, int requiredAmount) { + HashSet itemsToCheckCustomCompare = new HashSet<>(); + for (ItemStack itemToCheck : itemsToCheck) { + itemsToCheckCustomCompare.add(new ItemStackBaseCompare(itemToCheck)); + } + HashSet confirmedItems = new HashSet<>(); for (int i = 0; i < chest.getSizeInventory(); i++) { ItemStack stack = chest.getStackInSlot(i); - for (int j = 0; j < itemsToCheck.length; j++) { - if (ItemStack.areItemStacksEqual(stack, itemsToCheck[j])) { - hasItems[j] = true; - } + if (stack == null) continue; + ItemStackBaseCompare stackCustomCompare = new ItemStackBaseCompare(stack); + if (itemsToCheckCustomCompare.contains(stackCustomCompare)) { + confirmedItems.add(stackCustomCompare); } } - for (int i = 0; i < itemsToCheck.length; i++) { - confirmedItems++; - } - return confirmedItems >= requiredAmount; + return confirmedItems.size() >= requiredAmount; } private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int beaconY, int beaconZ, @@ -334,16 +335,8 @@ private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int throw new IllegalArgumentException("Invalid direction passed: " + direction); } - ItemStack[] contentsArray = new ItemStack[contents.size()]; - int index = 0; - - for (ItemStack content : contents) { - contentsArray[index] = content; - index++; - } - if (world.getTileEntity(beaconX, beaconY, beaconZ) instanceof TileEntityChest chest) { - return checkChest(chest, contentsArray, requiredAmount); + return checkChest(chest, contents, requiredAmount); } return false; } From d0d828e2209e544cb57eeb4aeb7437716c0cc80c Mon Sep 17 00:00:00 2001 From: loenaaaa Date: Thu, 15 Jan 2026 07:47:46 +0800 Subject: [PATCH 4/7] Update chest contents instantiation to use ItemStackBaseCompare --- .../items/ItemInversionSigilActive.java | 84 +++++++++++-------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index 89c58dea..b050c4fb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -60,13 +60,13 @@ public class ItemInversionSigilActive extends Item { private static final int BEACON_SEARCH_RADIUS = 6; private final int[][] LIGHTNING_POSITIONS = { { 0, 0 }, { -5, 0 }, { 5, 0 }, { 0, -5 }, { 0, 5 } }; - private HashSet CHEST_NORTH_CONTENTS = new HashSet<>(); + private HashSet CHEST_NORTH_CONTENTS = new HashSet<>(); - private HashSet CHEST_EAST_CONTENTS = new HashSet<>(); + private HashSet CHEST_EAST_CONTENTS = new HashSet<>(); - private HashSet CHEST_SOUTH_CONTENTS = new HashSet<>(); + private HashSet CHEST_SOUTH_CONTENTS = new HashSet<>(); - private HashSet CHEST_WEST_CONTENTS = new HashSet<>(); + private HashSet CHEST_WEST_CONTENTS = new HashSet<>(); public ItemInversionSigilActive() { super(); @@ -102,17 +102,9 @@ public ItemInversionSigilActive() { .register(eventHandler); } - private HashSet getValidChestContents(ForgeDirection direction, String[] itemIds, int itemReq) { - int length = itemIds.length; - HashSet validChestContents = new HashSet<>(); - if (itemReq > length) { - FMLLog.log( - Level.WARN, - "There are only %s valid items for the %s ritual, but there are %s required items! The ritual will be impossible!", - length, - direction.toString(), - itemReq); - } + private HashSet getValidChestContents(ForgeDirection direction, String[] itemIds, + int itemReq) { + HashSet validChestContents = new HashSet<>(); for (String itemId : itemIds) { String[] itemIdSplit = itemId.split(":"); ItemStack validChestItemStack; @@ -125,25 +117,51 @@ private HashSet getValidChestContents(ForgeDirection direction, Strin int validChestItemMeta = Integer.parseInt(itemIdSplit[2]); validChestItemStack = new ItemStack(validChestItem, 1, validChestItemMeta); if (validChestItem == Items.potionitem && chestSplashPotionsValid) { - validChestContents.add(new ItemStack(validChestItem, 1, validChestItemMeta + 8192)); - FMLLog.log( - Level.DEBUG, - "Used splash potion %s as siege requirement from item id %s.", - StatCollector.translateToLocal( - new ItemStack(validChestItem, 1, validChestItemMeta + 8192).getDisplayName()), - itemId); + boolean successfulAdd = validChestContents + .add(new ItemStackBaseCompare(new ItemStack(validChestItem, 1, validChestItemMeta + 8192))); + if (successfulAdd) { + FMLLog.log( + Level.DEBUG, + "Used splash potion %s as siege requirement from item id %s.", + StatCollector.translateToLocal( + new ItemStack(validChestItem, 1, validChestItemMeta + 8192).getDisplayName()), + itemId); + } else { + FMLLog.log( + Level.DEBUG, + "Could not add splash potion %s as siege requirement from item id %s since it was a duplicate!", + StatCollector.translateToLocal( + new ItemStack(validChestItem, 1, validChestItemMeta + 8192).getDisplayName()), + itemId); + } } } if (validChestItemStack == null) { FMLLog.log(Level.WARN, "Could not parse item id %s for the %s ritual!", itemId, direction.toString()); } else { - FMLLog.log( - Level.DEBUG, - "Used item %s as siege requirement from item id %s.", - StatCollector.translateToLocal(validChestItemStack.getDisplayName()), - itemId); + boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(validChestItemStack)); + if (successfulAdd) { + FMLLog.log( + Level.DEBUG, + "Used item %s as siege requirement from item id %s.", + StatCollector.translateToLocal(validChestItemStack.getDisplayName()), + itemId); + } else { + FMLLog.log( + Level.DEBUG, + "Could not add item %s as siege requirement from item id %s since it was a duplicate!", + StatCollector.translateToLocal(validChestItemStack.getDisplayName()), + itemId); + } } - validChestContents.add(validChestItemStack); + } + if (itemReq > validChestContents.size()) { + FMLLog.log( + Level.WARN, + "There are only %s valid items for the %s ritual, but there are %s required items! The ritual will be impossible!", + validChestContents.size(), + direction.toString(), + itemReq); } return validChestContents; } @@ -293,17 +311,13 @@ private void endSiege(boolean won, EntityPlayer player) { } } - private boolean checkChest(TileEntityChest chest, HashSet itemsToCheck, int requiredAmount) { - HashSet itemsToCheckCustomCompare = new HashSet<>(); - for (ItemStack itemToCheck : itemsToCheck) { - itemsToCheckCustomCompare.add(new ItemStackBaseCompare(itemToCheck)); - } + private boolean checkChest(TileEntityChest chest, HashSet itemsToCheck, int requiredAmount) { HashSet confirmedItems = new HashSet<>(); for (int i = 0; i < chest.getSizeInventory(); i++) { ItemStack stack = chest.getStackInSlot(i); if (stack == null) continue; ItemStackBaseCompare stackCustomCompare = new ItemStackBaseCompare(stack); - if (itemsToCheckCustomCompare.contains(stackCustomCompare)) { + if (itemsToCheck.contains(stackCustomCompare)) { confirmedItems.add(stackCustomCompare); } } @@ -312,7 +326,7 @@ private boolean checkChest(TileEntityChest chest, HashSet itemsToChec private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int beaconY, int beaconZ, World world) { - HashSet contents; + HashSet contents; int requiredAmount; if (direction == ForgeDirection.NORTH) { From f996e15591949c1c652b50ba6d80e5efd8a3bdd0 Mon Sep 17 00:00:00 2001 From: loenaaaa Date: Sun, 8 Feb 2026 10:32:43 +0800 Subject: [PATCH 5/7] refactoring --- .../api/ItemStackBaseCompare.java | 35 ----------- .../items/ItemInversionSigilActive.java | 58 ++++++++++--------- .../utils/ItemStackBaseCompare.java | 36 ++++++++++++ 3 files changed, 67 insertions(+), 62 deletions(-) delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java deleted file mode 100644 index a8d8ead0..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/api/ItemStackBaseCompare.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.api; - -import java.util.Objects; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -/** - * Wrapper class of ItemStack that compares with itemStack Item, Count and Damage. - */ - -public class ItemStackBaseCompare { - - public ItemStackBaseCompare(ItemStack itemStack) { - itemStackItem = itemStack.getItem(); - itemStackCount = itemStack.stackSize; - itemStackDamage = itemStack.getItemDamage(); - } - - Item itemStackItem; - int itemStackCount; - int itemStackDamage; - - @Override - public boolean equals(Object o) { - if (!(o instanceof ItemStackBaseCompare that)) return false; - return itemStackCount == that.itemStackCount && itemStackDamage == that.itemStackDamage - && Objects.equals(itemStackItem, that.itemStackItem); - } - - @Override - public int hashCode() { - return Objects.hash(itemStackItem, itemStackCount, itemStackDamage); - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index b050c4fb..37b2dcff 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -41,9 +41,9 @@ import org.jetbrains.annotations.NotNull; import com.fouristhenumber.utilitiesinexcess.ModItems; -import com.fouristhenumber.utilitiesinexcess.api.ItemStackBaseCompare; import com.fouristhenumber.utilitiesinexcess.common.entities.EntitySiegeProperty; import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackBaseCompare; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLLog; @@ -102,57 +102,61 @@ public ItemInversionSigilActive() { .register(eventHandler); } + private int parseItemMetaFromString(String string) { + try { + return Integer.parseInt(string); + } catch (NumberFormatException ignored) { + return -1; + } + } + private HashSet getValidChestContents(ForgeDirection direction, String[] itemIds, int itemReq) { HashSet validChestContents = new HashSet<>(); for (String itemId : itemIds) { String[] itemIdSplit = itemId.split(":"); - ItemStack validChestItemStack; - if (itemIdSplit.length == 1) { - validChestItemStack = null; - } else if (itemIdSplit.length == 2) { + ItemStack validChestItemStack = null; + if (itemIdSplit.length == 2) { validChestItemStack = new ItemStack(GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1])); - } else { + } else if (itemIdSplit.length == 3) { Item validChestItem = GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1]); - int validChestItemMeta = Integer.parseInt(itemIdSplit[2]); + int validChestItemMeta = parseItemMetaFromString(itemIdSplit[2]); validChestItemStack = new ItemStack(validChestItem, 1, validChestItemMeta); if (validChestItem == Items.potionitem && chestSplashPotionsValid) { - boolean successfulAdd = validChestContents - .add(new ItemStackBaseCompare(new ItemStack(validChestItem, 1, validChestItemMeta + 8192))); + ItemStack splashPotion = new ItemStack(validChestItem, 1, validChestItemMeta + 8192); + boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(splashPotion)); if (successfulAdd) { FMLLog.log( Level.DEBUG, "Used splash potion %s as siege requirement from item id %s.", - StatCollector.translateToLocal( - new ItemStack(validChestItem, 1, validChestItemMeta + 8192).getDisplayName()), + StatCollector.translateToLocal(splashPotion.getDisplayName()), itemId); } else { FMLLog.log( Level.DEBUG, "Could not add splash potion %s as siege requirement from item id %s since it was a duplicate!", - StatCollector.translateToLocal( - new ItemStack(validChestItem, 1, validChestItemMeta + 8192).getDisplayName()), + StatCollector.translateToLocal(splashPotion.getDisplayName()), itemId); } } } if (validChestItemStack == null) { FMLLog.log(Level.WARN, "Could not parse item id %s for the %s ritual!", itemId, direction.toString()); + continue; + } + boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(validChestItemStack)); + if (successfulAdd) { + FMLLog.log( + Level.DEBUG, + "Used item %s as siege requirement from item id %s.", + StatCollector.translateToLocal(validChestItemStack.getDisplayName()), + itemId); } else { - boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(validChestItemStack)); - if (successfulAdd) { - FMLLog.log( - Level.DEBUG, - "Used item %s as siege requirement from item id %s.", - StatCollector.translateToLocal(validChestItemStack.getDisplayName()), - itemId); - } else { - FMLLog.log( - Level.DEBUG, - "Could not add item %s as siege requirement from item id %s since it was a duplicate!", - StatCollector.translateToLocal(validChestItemStack.getDisplayName()), - itemId); - } + FMLLog.log( + Level.DEBUG, + "Could not add item %s as siege requirement from item id %s since it was a duplicate!", + StatCollector.translateToLocal(validChestItemStack.getDisplayName()), + itemId); } } if (itemReq > validChestContents.size()) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java new file mode 100644 index 00000000..970397b8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java @@ -0,0 +1,36 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Wrapper class of ItemStack that compares with itemStack Item, Count and Damage. + */ + +public class ItemStackBaseCompare { + + public ItemStackBaseCompare(ItemStack itemStack) { + item = itemStack.getItem(); + count = itemStack.stackSize; + damage = itemStack.getItemDamage(); + } + + Item item; + int count; + int damage; + + @Override + public boolean equals(Object o) { + if (!(o instanceof ItemStackBaseCompare that)) return false; + return count == that.count && damage == that.damage && item.equals(that.item); + } + + @Override + public int hashCode() { + int result = 1; + result = 31 * result + (item != null ? item.hashCode() : 0); + result = 31 * result + count; + result = 31 * result + damage; + return result; + } +} From 74c079c56fd963f99682e62e6d1344d17e1ce2e2 Mon Sep 17 00:00:00 2001 From: loenaaaa Date: Mon, 9 Feb 2026 00:17:25 +0800 Subject: [PATCH 6/7] remove redundant stuff --- .../common/items/ItemInversionSigilActive.java | 16 ++++++---------- .../utils/ItemStackBaseCompare.java | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index 37b2dcff..ad839afb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -1,8 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.common.items; -import static com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig.awakenedInversionDurability; -import static com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig.chestSplashPotionsValid; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -115,14 +112,14 @@ private HashSet getValidChestContents(ForgeDirection direc HashSet validChestContents = new HashSet<>(); for (String itemId : itemIds) { String[] itemIdSplit = itemId.split(":"); - ItemStack validChestItemStack = null; + ItemStack validChestItemStack; if (itemIdSplit.length == 2) { validChestItemStack = new ItemStack(GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1])); } else if (itemIdSplit.length == 3) { Item validChestItem = GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1]); int validChestItemMeta = parseItemMetaFromString(itemIdSplit[2]); validChestItemStack = new ItemStack(validChestItem, 1, validChestItemMeta); - if (validChestItem == Items.potionitem && chestSplashPotionsValid) { + if (validChestItem == Items.potionitem && InversionConfig.chestSplashPotionsValid) { ItemStack splashPotion = new ItemStack(validChestItem, 1, validChestItemMeta + 8192); boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(splashPotion)); if (successfulAdd) { @@ -139,8 +136,7 @@ private HashSet getValidChestContents(ForgeDirection direc itemId); } } - } - if (validChestItemStack == null) { + } else { FMLLog.log(Level.WARN, "Could not parse item id %s for the %s ritual!", itemId, direction.toString()); continue; } @@ -613,7 +609,7 @@ public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List tt, boolean p_77624_4_) { NBTTagCompound tag = stack.getTagCompound(); - if (tag != null && awakenedInversionDurability != 0) { + if (tag != null && InversionConfig.awakenedInversionDurability != 0) { tt.add( StatCollector .translateToLocalFormatted("item.inversion_sigil_active.desc", tag.getInteger(DURABILITY_NBT_KEY))); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java index 970397b8..ff965cac 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java @@ -22,7 +22,7 @@ public ItemStackBaseCompare(ItemStack itemStack) { @Override public boolean equals(Object o) { if (!(o instanceof ItemStackBaseCompare that)) return false; - return count == that.count && damage == that.damage && item.equals(that.item); + return count == that.count && damage == that.damage && item == that.item; } @Override From 05294fec874a60ce0480b359b30132d566de74a1 Mon Sep 17 00:00:00 2001 From: loenaaaa Date: Mon, 9 Feb 2026 00:49:56 +0800 Subject: [PATCH 7/7] improve log message --- .../common/items/ItemInversionSigilActive.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index ad839afb..be1d5d12 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -126,18 +126,18 @@ private HashSet getValidChestContents(ForgeDirection direc FMLLog.log( Level.DEBUG, "Used splash potion %s as siege requirement from item id %s.", - StatCollector.translateToLocal(splashPotion.getDisplayName()), + splashPotion.getDisplayName(), itemId); } else { FMLLog.log( Level.DEBUG, "Could not add splash potion %s as siege requirement from item id %s since it was a duplicate!", - StatCollector.translateToLocal(splashPotion.getDisplayName()), + splashPotion.getDisplayName(), itemId); } } } else { - FMLLog.log(Level.WARN, "Could not parse item id %s for the %s ritual!", itemId, direction.toString()); + FMLLog.log(Level.WARN, "Could not parse item id %s for the %s chest!", itemId, direction.toString()); continue; } boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(validChestItemStack)); @@ -145,20 +145,20 @@ private HashSet getValidChestContents(ForgeDirection direc FMLLog.log( Level.DEBUG, "Used item %s as siege requirement from item id %s.", - StatCollector.translateToLocal(validChestItemStack.getDisplayName()), + validChestItemStack.getDisplayName(), itemId); } else { FMLLog.log( Level.DEBUG, "Could not add item %s as siege requirement from item id %s since it was a duplicate!", - StatCollector.translateToLocal(validChestItemStack.getDisplayName()), + validChestItemStack.getDisplayName(), itemId); } } if (itemReq > validChestContents.size()) { FMLLog.log( Level.WARN, - "There are only %s valid items for the %s ritual, but there are %s required items! The ritual will be impossible!", + "There are only %s valid items for the %s chest, but there are %s required items! The ritual will be impossible!", validChestContents.size(), direction.toString(), itemReq);