From 1fda0864b1cc4ea0fd2ace1f43ad7ca1a41901b0 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 10 Nov 2025 17:12:45 +0800 Subject: [PATCH 1/2] refactor: abstract IItemModelDispatcher --- .../api/items/metaitem/ElectricStats.java | 12 +++++- .../gregtech/api/items/metaitem/MetaItem.java | 42 +++++++++---------- .../metaitem/stats/IItemModelDispatcher.java | 17 ++++++++ .../items/behaviors/IntCircuitBehaviour.java | 8 +++- 4 files changed, 54 insertions(+), 25 deletions(-) create mode 100644 src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java diff --git a/src/main/java/gregtech/api/items/metaitem/ElectricStats.java b/src/main/java/gregtech/api/items/metaitem/ElectricStats.java index bf336ec4676..7eea2d27b0c 100644 --- a/src/main/java/gregtech/api/items/metaitem/ElectricStats.java +++ b/src/main/java/gregtech/api/items/metaitem/ElectricStats.java @@ -32,7 +32,7 @@ import java.util.List; public class ElectricStats implements IItemComponent, IItemCapabilityProvider, IItemMaxStackSizeProvider, - IItemBehaviour, ISubItemHandler { + IItemBehaviour, ISubItemHandler, IItemModelDispatcher { public static final ElectricStats EMPTY = new ElectricStats(0, 0, false, false); @@ -217,4 +217,14 @@ public static ElectricStats createRechargeableBattery(long maxCharge, int tier) public static ElectricStats createBattery(long maxCharge, int tier, boolean rechargeable) { return new ElectricStats(maxCharge, tier, rechargeable, true); } + + @Override + public int getModelIndex(ItemStack itemStack, int maxIndex) { + IElectricItem electricItem = itemStack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); + if (electricItem != null) { + return (int) Math.min(((electricItem.getCharge() / (electricItem.getMaxCharge() * 1.0)) * maxIndex), + maxIndex); + } + return 0; + } } diff --git a/src/main/java/gregtech/api/items/metaitem/MetaItem.java b/src/main/java/gregtech/api/items/metaitem/MetaItem.java index 52b94672421..235e97214e9 100644 --- a/src/main/java/gregtech/api/items/metaitem/MetaItem.java +++ b/src/main/java/gregtech/api/items/metaitem/MetaItem.java @@ -12,19 +12,7 @@ import gregtech.api.items.OreDictNames; import gregtech.api.items.gui.ItemUIFactory; import gregtech.api.items.gui.PlayerInventoryHolder; -import gregtech.api.items.metaitem.stats.IEnchantabilityHelper; -import gregtech.api.items.metaitem.stats.IFoodBehavior; -import gregtech.api.items.metaitem.stats.IItemBehaviour; -import gregtech.api.items.metaitem.stats.IItemCapabilityProvider; -import gregtech.api.items.metaitem.stats.IItemColorProvider; -import gregtech.api.items.metaitem.stats.IItemComponent; -import gregtech.api.items.metaitem.stats.IItemContainerItemProvider; -import gregtech.api.items.metaitem.stats.IItemDurabilityManager; -import gregtech.api.items.metaitem.stats.IItemMaxStackSizeProvider; -import gregtech.api.items.metaitem.stats.IItemNameProvider; -import gregtech.api.items.metaitem.stats.IItemUseManager; -import gregtech.api.items.metaitem.stats.ISubItemHandler; -import gregtech.api.recipes.ingredients.IntCircuitIngredient; +import gregtech.api.items.metaitem.stats.*; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.material.Material; import gregtech.api.unification.ore.OrePrefix; @@ -199,18 +187,17 @@ protected String formatModelPath(T metaValueItem) { protected int getModelIndex(ItemStack itemStack) { T metaValueItem = getItem(itemStack); + Objects.requireNonNull(metaValueItem); - // Electric Items - IElectricItem electricItem = itemStack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); - if (electricItem != null) { - return (int) Math.min(((electricItem.getCharge() / (electricItem.getMaxCharge() * 1.0)) * 7), 7); - } + var modelDispatcher = metaValueItem.getItemModelDispatcher(); + if (modelDispatcher == null) return 0; - // Integrated (Config) Circuit - if (metaValueItem != null) { - return IntCircuitIngredient.getCircuitConfiguration(itemStack); - } - return 0; + int maxIndex = metaValueItem.getModelAmount() - 1; + int index = modelDispatcher.getModelIndex(itemStack, maxIndex); + Validate.inclusiveBetween(0, maxIndex, index, + "Model index should be in range from 0 to %d (inclusive), where %d is supplied", maxIndex, index); + + return index; } @SideOnly(Side.CLIENT) @@ -787,6 +774,7 @@ public MetaItem getMetaItem() { private IItemColorProvider colorProvider; private IItemDurabilityManager durabilityManager; private IEnchantabilityHelper enchantabilityHelper; + private IItemModelDispatcher itemModelDispatcher; private EnumRarity rarity; private int burnValue = 0; @@ -927,6 +915,9 @@ protected void addItemComponentsInternal(IItemComponent... stats) { if (itemComponent instanceof IEnchantabilityHelper) { this.enchantabilityHelper = (IEnchantabilityHelper) itemComponent; } + if (itemComponent instanceof IItemModelDispatcher iItemModelDispatcher) { + this.itemModelDispatcher = iItemModelDispatcher; + } this.allStats.add(itemComponent); } } @@ -987,6 +978,11 @@ public IEnchantabilityHelper getEnchantabilityHelper() { return enchantabilityHelper; } + @Nullable + public IItemModelDispatcher getItemModelDispatcher() { + return itemModelDispatcher; + } + public int getBurnValue() { return burnValue; } diff --git a/src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java b/src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java new file mode 100644 index 00000000000..ec6880cbbf9 --- /dev/null +++ b/src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java @@ -0,0 +1,17 @@ +package gregtech.api.items.metaitem.stats; + +import net.minecraft.item.ItemStack; + +@FunctionalInterface +public interface IItemModelDispatcher extends IItemComponent { + + /// Get the model index for the given item stack. + /// The index range will be checked at [gregtech.api.items.metaitem.MetaItem#getModelIndex(ItemStack)] + /// + /// @param itemStack The specific item stack. + /// @param maxIndex The max model index, from [gregtech.api.items.metaitem.MetaItem.MetaValueItem#getModelAmount()]` + /// - 1` + /// @return The model index for the specific stack, should be ranged between `0` (inclusive) and `maxIndex` + /// (inclusive). + int getModelIndex(ItemStack itemStack, int maxIndex); +} diff --git a/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java b/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java index f7523d976d1..0a53acee103 100644 --- a/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java +++ b/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java @@ -3,6 +3,7 @@ import gregtech.api.capability.IGhostSlotConfigurable; import gregtech.api.items.gui.ItemUIFactory; import gregtech.api.items.metaitem.stats.IItemBehaviour; +import gregtech.api.items.metaitem.stats.IItemModelDispatcher; import gregtech.api.items.metaitem.stats.ISubItemHandler; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.mui.GTGuiTextures; @@ -33,7 +34,7 @@ import java.util.ArrayList; import java.util.List; -public class IntCircuitBehaviour implements IItemBehaviour, ItemUIFactory, ISubItemHandler { +public class IntCircuitBehaviour implements IItemBehaviour, ItemUIFactory, ISubItemHandler, IItemModelDispatcher { @Override public void addInformation(ItemStack itemStack, List lines) { @@ -115,4 +116,9 @@ public String getItemSubType(ItemStack itemStack) { public void getSubItems(ItemStack itemStack, CreativeTabs creativeTab, NonNullList subItems) { subItems.add(itemStack.copy()); } + + @Override + public int getModelIndex(ItemStack itemStack, int maxIndex) { + return IntCircuitIngredient.getCircuitConfiguration(itemStack); + } } From 1a662d91573e8a97943af74e5ffe6e75599f5de8 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:16:46 +0800 Subject: [PATCH 2/2] format: use html javadoc --- .../metaitem/stats/IItemModelDispatcher.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java b/src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java index ec6880cbbf9..b20aaa94171 100644 --- a/src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java +++ b/src/main/java/gregtech/api/items/metaitem/stats/IItemModelDispatcher.java @@ -1,17 +1,22 @@ package gregtech.api.items.metaitem.stats; +import gregtech.api.items.metaitem.MetaItem; + import net.minecraft.item.ItemStack; @FunctionalInterface public interface IItemModelDispatcher extends IItemComponent { - /// Get the model index for the given item stack. - /// The index range will be checked at [gregtech.api.items.metaitem.MetaItem#getModelIndex(ItemStack)] - /// - /// @param itemStack The specific item stack. - /// @param maxIndex The max model index, from [gregtech.api.items.metaitem.MetaItem.MetaValueItem#getModelAmount()]` - /// - 1` - /// @return The model index for the specific stack, should be ranged between `0` (inclusive) and `maxIndex` - /// (inclusive). + /** + * Get the model index for the given item stack.
+ * The index range will be checked at + * {@link MetaItem#getModelIndex(ItemStack)}. + * + * @param itemStack The specific item stack. + * @param maxIndex The max model index, from + * {@link MetaItem.MetaValueItem#getModelAmount()} - 1. + * @return The model index for the specific stack, should be ranged between + * {@code 0} (inclusive) and {@code maxIndex} (inclusive). + */ int getModelIndex(ItemStack itemStack, int maxIndex); }