From 5fff77f40e09df87149073f96519eec547d2b7d2 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Wed, 8 Apr 2026 08:40:39 +0900 Subject: [PATCH 01/19] [add] Storage Drawers Integration; add GT material storage upgrade --- buildscript.properties | 1 + dependencies.gradle | 9 ++ .../github/gtexpert/gtmt/api/util/Mods.java | 2 + .../StorageDrawersConfigHolder.java | 25 +++ .../storagedrawers/StorageDrawersModule.java | 91 +++++++++++ .../storagedrawers/StorageDrawersUtil.java | 83 ++++++++++ .../items/ItemGTMaterialUpgradeStorage.java | 106 +++++++++++++ .../items/StorageDrawersItems.java | 13 ++ .../IGTMaterialStorageUpgrade.java | 8 + .../storageupgrades/StorageUpgradeColors.java | 37 +++++ .../storageupgrades/UpgradeMaterialData.java | 34 ++++ .../UpgradesMaterialRegistry.java | 35 +++++ .../gtexpert/gtmt/mixins/ModMixinLoader.java | 1 + .../AccessorTileEntityDrawers.java | 13 ++ .../DrawerUpgradeDataMixin.java | 147 ++++++++++++++++++ .../storagedrawers/SlotUpgradeMixin.java | 44 ++++++ .../storagedrawers/UpgradeDataMixin.java | 60 +++++++ .../github/gtexpert/gtmt/modules/Modules.java | 1 + .../resources/assets/gtmt/lang/en_us.lang | 3 + .../resources/assets/gtmt/lang/ja_jp.lang | 3 + .../gtmt/models/item/upgrade_storage_gt.json | 7 + .../storage_drawers/upgrade_storage_base.png | Bin 0 -> 862 bytes .../upgrade_storage_material.png | Bin 0 -> 318 bytes .../resources/mixins.gtmt.storagedrawers.json | 13 ++ 24 files changed, 736 insertions(+) create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/StorageDrawersItems.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/IGTMaterialStorageUpgrade.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/StorageUpgradeColors.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradeMaterialData.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradesMaterialRegistry.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/AccessorTileEntityDrawers.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/SlotUpgradeMixin.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java create mode 100644 src/main/resources/assets/gtmt/models/item/upgrade_storage_gt.json create mode 100644 src/main/resources/assets/gtmt/textures/items/storage_drawers/upgrade_storage_base.png create mode 100644 src/main/resources/assets/gtmt/textures/items/storage_drawers/upgrade_storage_material.png create mode 100644 src/main/resources/mixins.gtmt.storagedrawers.json diff --git a/buildscript.properties b/buildscript.properties index a9b124b..eaf500a 100644 --- a/buildscript.properties +++ b/buildscript.properties @@ -33,6 +33,7 @@ minecraftVersion = 1.12.2 debug_all = false debug_chisel = false debug_bbw = false +debug_drawers = false # Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you # restart Minecraft in development. Choose this dependent on your mod: diff --git a/dependencies.gradle b/dependencies.gradle index 3b3d248..27c2583 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -60,4 +60,13 @@ dependencies { if (project.debug_all.toBoolean() || project.debug_bbw.toBoolean()) { runtimeOnly rfg.deobf("curse.maven:better-builders-wands-238403:2691084") } + + // Debug Storage Drawers: 1.12-5.5.3 + compileOnly rfg.deobf("curse.maven:chameleon-230497:2450900") // Chameleon-1.12-4.1.3 + compileOnly rfg.deobf("curse.maven:storage-drawers-223852:5981297") + if (project.debug_all.toBoolean() || project.debug_drawers.toBoolean()) { + runtimeOnly rfg.deobf("curse.maven:chameleon-230497:2450900") // Chameleon-1.12-4.1.3 + runtimeOnly rfg.deobf("curse.maven:storage-drawers-223852:5981297") + implementation rfg.deobf("curse.maven:topalldependents-1120632:6138503") + } } diff --git a/src/main/java/com/github/gtexpert/gtmt/api/util/Mods.java b/src/main/java/com/github/gtexpert/gtmt/api/util/Mods.java index bbf06bc..a22c9d1 100644 --- a/src/main/java/com/github/gtexpert/gtmt/api/util/Mods.java +++ b/src/main/java/com/github/gtexpert/gtmt/api/util/Mods.java @@ -68,6 +68,7 @@ public enum Mods { ProjectRedIllumination(Names.PROJECT_RED_ILLUMINATION), Railcraft(Names.RAILCRAFT), RefinedStorage(Names.REFINED_STORAGE), + StorageDrawers(Names.STORAGE_DRAWERS), Thaumcraft(Names.THAUMCRAFT), ThaumicEnergistics(Names.THAUMIC_ENERGISTICS), TheOneProbe(Names.THE_ONE_PROBE), @@ -143,6 +144,7 @@ public static class Names { public static final String PROJECT_RED_ILLUMINATION = "projectred-illumination"; public static final String RAILCRAFT = "railcraft"; public static final String REFINED_STORAGE = "refinedstorage"; + public static final String STORAGE_DRAWERS = "storagedrawers"; public static final String THAUMCRAFT = "thaumcraft"; public static final String THAUMIC_ENERGISTICS = "thaumicenergistics"; public static final String THE_ONE_PROBE = "theoneprobe"; diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java new file mode 100644 index 0000000..530f16f --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java @@ -0,0 +1,25 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers; + +import net.minecraftforge.common.config.Config; + +import com.github.gtexpert.gtmt.api.ModValues; +import com.github.gtexpert.gtmt.modules.Modules; + +@Config.LangKey(ModValues.MODID + ".config.integration.storage_drawers") +@Config(modid = ModValues.MODID, + name = ModValues.MODID + "/integration/" + Modules.MODULE_DRAWERS, + category = "StorageDrawers") +public class StorageDrawersConfigHolder { + + @Config.Comment({ "Remove original storage upgrade recipe", "default: true" }) + public static boolean removeOriginal = true; + + @Config.Comment({ "Specifies the materials that can be used to craft Storage Upgrades.", + "Format: modId:materialName@multiplier$tier", + "\"tier\" represents the required material voltage and can be set from 1 (LV) to 13 (OpV).", + "The \"tier\" field is optional and defaults to 1 (LV) if omitted.", + "If this entry is left empty, variants using the original materials with the same multipliers will be added at tier 1." }) + public static String[] upgradeMaterials = new String[] { + "gregtech:obsidian@2", "gregtech:iron@3", "gregtech:gold@4", "gregtech:diamond@5", "gregtech:emerald@6" + }; +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java new file mode 100644 index 0000000..a15c027 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java @@ -0,0 +1,91 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers; + +import static com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems.upgradeStorageGT; + +import java.util.Collections; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.crafting.IRecipe; +import net.minecraftforge.client.event.ColorHandlerEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.registries.IForgeRegistry; + +import org.jetbrains.annotations.NotNull; + +import com.github.gtexpert.gtmt.api.ModValues; +import com.github.gtexpert.gtmt.api.modules.TModule; +import com.github.gtexpert.gtmt.integration.IntegrationSubmodule; +import com.github.gtexpert.gtmt.integration.storagedrawers.items.ItemGTMaterialUpgradeStorage; +import com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.StorageUpgradeColors; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradeMaterialData; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradesMaterialRegistry; +import com.github.gtexpert.gtmt.modules.Modules; + +@TModule( + moduleID = Modules.MODULE_DRAWERS, + containerID = ModValues.MODID, + name = "GTMoreTool Storage Drawers Integration", + description = "Storage Drawers Module") +public class StorageDrawersModule extends IntegrationSubmodule { + + @NotNull + @Override + public List> getEventBusSubscribers() { + return Collections.singletonList(StorageDrawersModule.class); + } + + @Override + public void preInit(FMLPreInitializationEvent event) { + StorageDrawersItems.init(); + } + + @Override + @SideOnly(Side.CLIENT) + public void init(FMLInitializationEvent event) { + StorageUpgradeColors.init(); + } + + @Override + public void postInit(FMLPostInitializationEvent event) { + StorageDrawersUtil.UPGRADE_MATERIALS = StorageDrawersUtil.parse(StorageDrawersConfigHolder.upgradeMaterials); + for (UpgradeMaterialData data : StorageDrawersUtil.UPGRADE_MATERIALS) { + UpgradesMaterialRegistry.REGISTRY.put(data.getMaterial(), data.getId(), data.getMultiple(), + data.getTier()); + } + } + + @SubscribeEvent + public static void onRegisterItems(RegistryEvent.Register event) { + IForgeRegistry registry = event.getRegistry(); + registry.register(upgradeStorageGT); + } + + @SubscribeEvent + @SideOnly(Side.CLIENT) + public static void onRegisterModels(ModelRegistryEvent event) { + ItemGTMaterialUpgradeStorage.registerModels(); + } + + @SubscribeEvent + @SideOnly(Side.CLIENT) + public static void onRegisterColors(ColorHandlerEvent.Item event) {} + + @Override + public void registerBlocks(RegistryEvent.Register event) {} + + @Override + public void registerRecipesNormal(RegistryEvent.Register event) {} + + @Override + public void registerRecipesLowest(RegistryEvent.Register event) {} +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java new file mode 100644 index 0000000..445c352 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java @@ -0,0 +1,83 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import gregtech.api.GTValues; +import gregtech.api.GregTechAPI; +import gregtech.api.unification.material.Material; + +import com.github.gtexpert.gtmt.api.util.ModLog; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradeMaterialData; + +public class StorageDrawersUtil { + + public static List UPGRADE_MATERIALS = new ArrayList<>(); + + public static List parse(String[] entries) { + Map check = new HashMap<>(); + List result = new ArrayList<>(); + + if (entries.length == 0) { + entries = new String[] { "gregtech:obsidian@2", "gregtech:iron@3", "gregtech:gold@4", "gregtech:diamond@5", + "gregtech:emerald@6" }; + } + + for (String entry : entries) { + String[] split1 = entry.split("@", 2); + if (split1.length != 2) { + ModLog.logger.warn("Missing '@': {}, skipped", entry); + continue; + } + + String materialPart = split1[0]; + String otherPart = split1[1]; + + if (!materialPart.contains(":")) { + ModLog.logger.warn("Invalid material format (missing ':'): {}, skipped", entry); + continue; + } + + Material material = GregTechAPI.materialManager.getMaterial(materialPart); + + if (material == null) { + ModLog.logger.warn("Cannot find '{}'. Skipping entry", materialPart); + continue; + } + + int id = material.getId(); + + String[] percentSplit = otherPart.split("%", 2); + + int multiple = 1; + try { + multiple = Integer.parseInt(percentSplit[0]); + } catch (NumberFormatException e) { + ModLog.logger.warn("Invalid multiple: " + entry, e); + continue; + } + + int tier = 1; + if (percentSplit.length == 2 && !percentSplit[1].isEmpty()) { + try { + tier = Integer.parseInt(percentSplit[1]); + } catch (NumberFormatException e) { + ModLog.logger.warn("Invalid tier: " + entry, e); + continue; + } + } + if (check.containsKey(id)) { + ModLog.logger.warn("Duplicate id: {}", id); + } + UpgradeMaterialData data = new UpgradeMaterialData(material, id, multiple, tier); + check.put(id, data); + result.add(data); + ModLog.logger.info( + "Success to add UpgradeMaterialRegistry, Material: {}, meta: {}, multiplier: x{}, requiredTier: {} ({})", + material, id, multiple, tier, GTValues.VN[tier]); + } + return result; + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java new file mode 100644 index 0000000..732b708 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java @@ -0,0 +1,106 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.items; + +import static com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems.upgradeStorageGT; + +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import net.minecraft.world.World; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.jaquadro.minecraft.storagedrawers.item.ItemUpgrade; + +import gregtech.api.unification.material.Material; + +import com.github.gtexpert.gtmt.integration.storagedrawers.StorageDrawersUtil; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.IGTMaterialStorageUpgrade; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradeMaterialData; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradesMaterialRegistry; + +public class ItemGTMaterialUpgradeStorage extends ItemUpgrade implements IGTMaterialStorageUpgrade { + + private final UpgradesMaterialRegistry registry; + + public ItemGTMaterialUpgradeStorage(String registryName, String unlocalizedName, + UpgradesMaterialRegistry registry) { + super(registryName, unlocalizedName); + + this.registry = registry; + setMaxDamage(0); + setHasSubtypes(true); + setAllowMultiple(true); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + public UpgradeMaterialData getUpgradeMaterialData(ItemStack stack) { + return UpgradesMaterialRegistry.REGISTRY.getById(stack.getMetadata()); + } + + public Material getMaterial(ItemStack stack) { + return getUpgradeMaterialData(stack).getMaterial(); + } + + @Override + public int getStorageMultiplier(ItemStack stack) { + return getUpgradeMaterialData(stack).getMultiple(); + } + + @SideOnly(Side.CLIENT) + public static void registerModels() { + ModelLoader.setCustomMeshDefinition(upgradeStorageGT, stack -> getModelLocation()); + ModelLoader.registerItemVariants(upgradeStorageGT, getModelLocation()); + } + + @SideOnly(Side.CLIENT) + public static ModelResourceLocation getModelLocation() { + return new ModelResourceLocation(upgradeStorageGT.getRegistryName(), "inventory"); + } + + @Override + @SideOnly(Side.CLIENT) + public @NotNull String getItemStackDisplayName(@NotNull ItemStack stack) { + UpgradeMaterialData data = getUpgradeMaterialData(stack); + if (data == null) { + return super.getItemStackDisplayName(stack); + } + + String materialName = getMaterial(stack).getUnlocalizedName(); + return I18n.format("gtmt.item.upgrade_storage.name", I18n.format(materialName)); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(@Nonnull ItemStack stack, @Nullable World world, List list, + ITooltipFlag advanced) { + UpgradeMaterialData data = getUpgradeMaterialData(stack); + if (data != null) { + int multi = data.getMultiple(); + list.add(I18n.format("storagedrawers.upgrade.description", multi)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(@NotNull CreativeTabs creativeTabs, @NotNull NonNullList list) { + if (isInCreativeTab(creativeTabs)) { + for (UpgradeMaterialData data : StorageDrawersUtil.UPGRADE_MATERIALS) + list.add(new ItemStack(this, 1, data.getId())); + } + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/StorageDrawersItems.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/StorageDrawersItems.java new file mode 100644 index 0000000..4548eb7 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/StorageDrawersItems.java @@ -0,0 +1,13 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.items; + +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradesMaterialRegistry; + +public class StorageDrawersItems { + + public static ItemGTMaterialUpgradeStorage upgradeStorageGT; + + public static void init() { + upgradeStorageGT = new ItemGTMaterialUpgradeStorage("upgrade_storage_gt", "upgrade_storage_gt", + UpgradesMaterialRegistry.REGISTRY); + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/IGTMaterialStorageUpgrade.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/IGTMaterialStorageUpgrade.java new file mode 100644 index 0000000..4cc57b1 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/IGTMaterialStorageUpgrade.java @@ -0,0 +1,8 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades; + +import net.minecraft.item.ItemStack; + +public interface IGTMaterialStorageUpgrade { + + int getStorageMultiplier(ItemStack stack); +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/StorageUpgradeColors.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/StorageUpgradeColors.java new file mode 100644 index 0000000..7c5019c --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/StorageUpgradeColors.java @@ -0,0 +1,37 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades; + +import net.minecraft.client.Minecraft; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import gregtech.api.unification.material.Material; + +import com.github.gtexpert.gtmt.integration.storagedrawers.items.ItemGTMaterialUpgradeStorage; +import com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems; + +@SideOnly(Side.CLIENT) +public class StorageUpgradeColors { + + public static void init() { + Minecraft.getMinecraft().getItemColors().registerItemColorHandler( + (stack, tintIndex) -> { + if (!(stack.getItem() instanceof ItemGTMaterialUpgradeStorage item)) { + return 0xFFFFFFFF; + } + + if (tintIndex % 2 == 0) { + return 0xFFFFFFFF; + } + + UpgradeMaterialData data = item.getUpgradeMaterialData(stack); + + if (data == null) { + return 0xFFFFFFFF; + } + Material material = item.getMaterial(stack); + + return material.getMaterialRGB(); + }, + StorageDrawersItems.upgradeStorageGT); + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradeMaterialData.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradeMaterialData.java new file mode 100644 index 0000000..ce14b2a --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradeMaterialData.java @@ -0,0 +1,34 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades; + +import gregtech.api.unification.material.Material; + +public class UpgradeMaterialData { + + private final Material material; + private final int id; + private final int multiple; + private final int tier; + + public UpgradeMaterialData(Material material, int id, int multiple, int tier) { + this.material = material; + this.id = id; + this.multiple = multiple; + this.tier = tier; + } + + public Material getMaterial() { + return material; + } + + public int getId() { + return id; + } + + public int getMultiple() { + return multiple; + } + + public int getTier() { + return tier; + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradesMaterialRegistry.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradesMaterialRegistry.java new file mode 100644 index 0000000..b442f96 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/storageupgrades/UpgradesMaterialRegistry.java @@ -0,0 +1,35 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades; + +import java.util.Collection; +import java.util.Map; +import java.util.TreeMap; + +import gregtech.api.unification.material.Material; + +public class UpgradesMaterialRegistry { + + private final Map map = new TreeMap<>(); + public static final UpgradesMaterialRegistry REGISTRY = new UpgradesMaterialRegistry(); + + private UpgradesMaterialRegistry() {} + + public void put(Material material, int id, int multiple, int tier) { + map.put(id, new UpgradeMaterialData(material, id, multiple, tier)); + } + + public void remove(int id) { + map.remove(id); + } + + public UpgradeMaterialData getById(int id) { + return map.get(id); + } + + public boolean isEmpty() { + return map.isEmpty(); + } + + public Collection values() { + return map.values(); + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/ModMixinLoader.java b/src/main/java/com/github/gtexpert/gtmt/mixins/ModMixinLoader.java index 3b0350b..bdd37e4 100644 --- a/src/main/java/com/github/gtexpert/gtmt/mixins/ModMixinLoader.java +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/ModMixinLoader.java @@ -21,6 +21,7 @@ public class ModMixinLoader implements ILateMixinLoader { public static final Map modMixinsConfig = new ImmutableMap.Builder() .put(Mods.Names.BETTER_BUILDERS_WANDS, true) .put(Mods.Names.CHISEL, true) + .put(Mods.Names.STORAGE_DRAWERS, true) .build(); @SuppressWarnings("SimplifyStreamApiCallChains") diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/AccessorTileEntityDrawers.java b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/AccessorTileEntityDrawers.java new file mode 100644 index 0000000..e400936 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/AccessorTileEntityDrawers.java @@ -0,0 +1,13 @@ +package com.github.gtexpert.gtmt.mixins.storagedrawers; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers; + +@Mixin(value = TileEntityDrawers.class, remap = false) +public interface AccessorTileEntityDrawers { + + @Invoker("getEffectiveDrawerCapacity") + int gtmt$invokeGetEffectiveDrawerCapacity(); +} diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java new file mode 100644 index 0000000..c724db6 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java @@ -0,0 +1,147 @@ +package com.github.gtexpert.gtmt.mixins.storagedrawers; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; + +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; +import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers; +import com.jaquadro.minecraft.storagedrawers.block.tile.tiledata.UpgradeData; +import com.jaquadro.minecraft.storagedrawers.core.ModItems; + +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.IGTMaterialStorageUpgrade; + +@Mixin(targets = "com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers$DrawerUpgradeData", remap = false) +public abstract class DrawerUpgradeDataMixin extends UpgradeData { + + protected DrawerUpgradeDataMixin() { + super(0); // 実際には使われない + } + + @Shadow(aliases = "this$0") + private TileEntityDrawers gtmt$outer; + + @Shadow + public abstract boolean canAddUpgrade(@Nonnull ItemStack upgrade); + + @Unique + private boolean gtmt$stackCapacityCheck(int stackCapacity) { + for (int i = 0; i < gtmt$outer.getDrawerCount(); i++) { + IDrawer drawer = gtmt$outer.getDrawer(i); + if (!drawer.isEnabled() || drawer.isEmpty()) { + continue; + } + + int addedItemCapacity = stackCapacity * drawer.getStoredItemStackSize(); + if (drawer.getMaxCapacity() - addedItemCapacity < drawer.getStoredItemCount()) { + return false; + } + } + + return true; + } + + /** + * 独自 Storage Upgrade の「追加倍率」を返す。 + * 本体 upgradeStorage はここでは触らず、0 を返して vanilla に任せる。 + */ + @Unique + private int gtmt$getCustomAddedStorageMultiplier(ItemStack stack) { + if (stack == null || stack.isEmpty()) { + return 0; + } + + if (stack.getItem() instanceof IGTMaterialStorageUpgrade) { + return ((IGTMaterialStorageUpgrade) stack.getItem()).getStorageMultiplier(stack); + } + + return 0; + } + + /** + * 独自 Storage Upgrade の取り外し判定だけを差し替える。 + * vanilla item はそのまま元処理へ流す。 + */ + @Inject(method = "canRemoveUpgrade", at = @At("HEAD"), cancellable = true) + private void gtmt$canRemoveUpgrade(int slot, CallbackInfoReturnable cir) { + ItemStack upgrade = this.getUpgrade(slot); + if (upgrade == null || upgrade.isEmpty()) { + return; + } + + int customMultiplier = gtmt$getCustomAddedStorageMultiplier(upgrade); + + if (customMultiplier <= 0) { + return; + } + + int effectiveMultipier = this.getStorageMultiplier(); + int removedMultiplier = customMultiplier; + + if (effectiveMultipier == customMultiplier) { + removedMultiplier--; + } + + int removedStackCapacity = removedMultiplier * gtmt$outer.getEffectiveDrawerCapacity(); + + cir.setReturnValue(gtmt$stackCapacityCheck(removedStackCapacity)); + } + + /** + * 独自 Storage Upgrade の swap 判定だけを差し替える。 + * vanilla 同士の swap は元処理に任せる。 + */ + @Inject(method = "canSwapUpgrade", at = @At("HEAD"), cancellable = true) + private void gtmt$canSwapUpgrade(int slot, @NotNull ItemStack add, CallbackInfoReturnable cir) { + ItemStack current = this.getUpgrade(slot); + if (current == null || current.isEmpty()) { + return; + } + + int currentCustomMulti = gtmt$getCustomAddedStorageMultiplier(current); + int addCustomMulti = gtmt$getCustomAddedStorageMultiplier(add); + + if (currentCustomMulti <= 0 && addCustomMulti <= 0) { + return; + } + + if (!this.canRemoveUpgrade(slot) || !this.canAddUpgrade(add)) { + cir.setReturnValue(false); + return; + } + + if (current.getItem() == ModItems.upgradeOneStack) { + cir.setReturnValue(true); + return; + } + + if (addCustomMulti > 0) { + cir.setReturnValue(true); + return; + } + + if (currentCustomMulti > 0) { + int currentMultiplier = this.getStorageMultiplier(); + int newMultiplier = currentMultiplier - currentCustomMulti; + + if (newMultiplier <= 0) { + newMultiplier = 1; + } + + int baseCapacity = ((AccessorTileEntityDrawers) gtmt$outer) + .gtmt$invokeGetEffectiveDrawerCapacity(); + + int newCapacity = newMultiplier * baseCapacity; + + cir.setReturnValue(gtmt$stackCapacityCheck(newCapacity)); + } + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/SlotUpgradeMixin.java b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/SlotUpgradeMixin.java new file mode 100644 index 0000000..6ee7508 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/SlotUpgradeMixin.java @@ -0,0 +1,44 @@ +package com.github.gtexpert.gtmt.mixins.storagedrawers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.jaquadro.minecraft.storagedrawers.inventory.InventoryUpgrade; +import com.jaquadro.minecraft.storagedrawers.inventory.SlotUpgrade; + +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.IGTMaterialStorageUpgrade; + +@Mixin(value = SlotUpgrade.class, remap = false) +public abstract class SlotUpgradeMixin extends Slot { + + public SlotUpgradeMixin(IInventory inventoryIn, int index, int xPosition, int yPosition) { + super(inventoryIn, index, xPosition, yPosition); + } + + @Unique + private boolean gtmt$isCustomStorageUpgrade(ItemStack stack) { + return stack != null && !stack.isEmpty() && stack.getItem() instanceof IGTMaterialStorageUpgrade; + } + + @Inject(method = "canTakeStack", at = @At("HEAD"), cancellable = true) + private void gtmt$canTakeStack(EntityPlayer player, CallbackInfoReturnable cir) { + if (!(inventory instanceof InventoryUpgrade inventoryUpgrade)) { + return; + } + + ItemStack stack = this.getStack(); + if (!gtmt$isCustomStorageUpgrade(stack)) { + return; + } + + cir.setReturnValue(inventoryUpgrade.canRemoveStorageUpgrade(this.getSlotIndex())); + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java new file mode 100644 index 0000000..b55151c --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java @@ -0,0 +1,60 @@ +package com.github.gtexpert.gtmt.mixins.storagedrawers; + +import net.minecraft.item.ItemStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.jaquadro.minecraft.storagedrawers.StorageDrawers; +import com.jaquadro.minecraft.storagedrawers.block.tile.tiledata.UpgradeData; +import com.jaquadro.minecraft.storagedrawers.config.ConfigManager; +import com.jaquadro.minecraft.storagedrawers.core.ModItems; +import com.jaquadro.minecraft.storagedrawers.item.EnumUpgradeStorage; + +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.IGTMaterialStorageUpgrade; + +@Mixin(value = UpgradeData.class, remap = false) +public abstract class UpgradeDataMixin { + + @Shadow + private ItemStack[] upgrades; + @Shadow + private int storageMultiplier; + + @Inject(method = "syncStorageMultiplier", + at = @At("HEAD"), + cancellable = true) + private void gtmt$addCustomStorageMultiplier(CallbackInfo ci) { + ConfigManager config = StorageDrawers.config; + int multiplier = 0; + + for (ItemStack stack : upgrades) { + if (stack == null || stack.isEmpty()) { + continue; + } + + if (stack.getItem() == ModItems.upgradeStorage) { + int level = EnumUpgradeStorage.byMetadata(stack.getMetadata()).getLevel(); + multiplier += config.getStorageUpgradeMultiplier(level); + continue; + } + + if (stack.getItem() instanceof IGTMaterialStorageUpgrade gt) { + int level = gt.getStorageMultiplier(stack); + if (level > 0) { + multiplier += level; + } + } + } + + if (multiplier == 0) { + multiplier = config.getStorageUpgradeMultiplier(1); + } + + this.storageMultiplier = multiplier; + ci.cancel(); + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/modules/Modules.java b/src/main/java/com/github/gtexpert/gtmt/modules/Modules.java index 9a02524..17555da 100644 --- a/src/main/java/com/github/gtexpert/gtmt/modules/Modules.java +++ b/src/main/java/com/github/gtexpert/gtmt/modules/Modules.java @@ -34,6 +34,7 @@ public class Modules implements IModuleContainer { public static final String MODULE_AVARITIA = "avaritia_integration"; public static final String MODULE_TC = "tc_integration"; public static final String MODULE_TE = "te_integration"; + public static final String MODULE_DRAWERS = "storage_drawers_integration"; @Override public String getID() { diff --git a/src/main/resources/assets/gtmt/lang/en_us.lang b/src/main/resources/assets/gtmt/lang/en_us.lang index 53f11b9..265fd1b 100644 --- a/src/main/resources/assets/gtmt/lang/en_us.lang +++ b/src/main/resources/assets/gtmt/lang/en_us.lang @@ -4,6 +4,9 @@ gt.tool.class.chisel=Chisel item.gt.tool.wand.name=%s Wand gt.tool.class.wand=Wand +item.upgrade_storage.name=Storage Upgrade +gtmt.item.upgrade_storage.name=Storage Upgrade (%s) + # singleblock # Auto Chisel gtmt.machine.auto_chisel.lv.name=Basic Auto Chisel diff --git a/src/main/resources/assets/gtmt/lang/ja_jp.lang b/src/main/resources/assets/gtmt/lang/ja_jp.lang index bfc0a69..f58a07a 100644 --- a/src/main/resources/assets/gtmt/lang/ja_jp.lang +++ b/src/main/resources/assets/gtmt/lang/ja_jp.lang @@ -4,6 +4,9 @@ gt.tool.class.chisel=チゼル item.gt.tool.wand.name=%sのワンド gt.tool.class.wand=ワンド +item.upgrade_storage.name=容量キット +gtmt.item.upgrade_storage.name=容量キット (%s) + # singleblock # Auto Chisel gtmt.machine.auto_chisel.lv.name=基本型自動彫刻機 diff --git a/src/main/resources/assets/gtmt/models/item/upgrade_storage_gt.json b/src/main/resources/assets/gtmt/models/item/upgrade_storage_gt.json new file mode 100644 index 0000000..92c91d7 --- /dev/null +++ b/src/main/resources/assets/gtmt/models/item/upgrade_storage_gt.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtmt:items/storage_drawers/upgrade_storage_base", + "layer1": "gtmt:items/storage_drawers/upgrade_storage_material" + } +} diff --git a/src/main/resources/assets/gtmt/textures/items/storage_drawers/upgrade_storage_base.png b/src/main/resources/assets/gtmt/textures/items/storage_drawers/upgrade_storage_base.png new file mode 100644 index 0000000000000000000000000000000000000000..cca0d78b9f504322bde44adc93bc0f5b381deb7a GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!piYTvM2T}zYGO%dex5=|W^O7&NNK8qk(q*HX}W@ufuV_lk)f4| zk(IHrg06w7fq}Kd{ZgPl_7YEDSN3}x(u@||m)M=3FfcH-XNE+SMELqxCFkerC8p#j zrRr7W768>UFxc2v6eK2Rr1^l#~=$>Fbx5m+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxD?<%%Ni9w; z$}9i}0?5F`r2NtnTcy&{%oMA%#5B{SloV6lq(tKsT|>i^MBT&`V?*5(W8)NaQ$q`* zG{Yn%sP!e8X$brCilM;(3=n;gjJ~0s0m#W9wv~TTW-8DXAS>+*ZNTyU3!nExmH|U*r`~u()-@bEgHLi zH#a}NclTp`J>S1VhHs0{N;bUS#t@OG_tEUxfxcu(m&+S?+jX_>*kB=m53VEb1({On2+Q=R6 zybV8WeNvdDQeWdIW;2ns(r)dwqX7-CZl64wo9lSl>`S#QQ+%)ptNZfgObJ)TDXa9> zzuT|oeS}&2c8ca=jVTx6q~C7MUKW;lL&dM>kNJnKEvDB~GT%mvMJ9-{?3g@r#6(yg@ndo}gnO#g(uf-6sZ+UJ0hsi&)-%Q~loCIC!6KqLSF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtmt/textures/items/storage_drawers/upgrade_storage_material.png b/src/main/resources/assets/gtmt/textures/items/storage_drawers/upgrade_storage_material.png new file mode 100644 index 0000000000000000000000000000000000000000..41f27498cd38d72fa16a0490e9b0047ca2b45ac1 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e421szhYtMl3**{yrmr|)a2>n z7-DhyZNDK`i-8Dhykdp;`})p?r8B%##5+_v6kE>U&@EdXo%8gI@gDWRlLeUUPk**a zPFwT(m(8QS%eS%}D3s}WTwy;cXwfyUhM9?JPv*>A#_9QLA8S(2Da&k$w%1Aro7I2s z3-)46xNSD4Sbq0z;fQIjwf9$F({fmAx_3{EC1XNbT24jB#Wg_JFnGH9xvX Date: Wed, 8 Apr 2026 08:44:43 +0900 Subject: [PATCH 02/19] [fix] conflict --- buildscript.properties | 1 + dependencies.gradle | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/buildscript.properties b/buildscript.properties index d4b2d28..f80fa5a 100644 --- a/buildscript.properties +++ b/buildscript.properties @@ -34,6 +34,7 @@ debug_all = false debug_chisel = false debug_bbw = false debug_tic = false +debug_drawers = false # Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you # restart Minecraft in development. Choose this dependent on your mod: diff --git a/dependencies.gradle b/dependencies.gradle index 5b3069b..bb542e5 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -68,4 +68,13 @@ dependencies { runtimeOnly rfg.deobf("curse.maven:mantle-74924:2713386") runtimeOnly rfg.deobf("curse.maven:tinkers-antique-1242239:7339332") } + + // Debug Storage Drawers: 1.12-5.5.3 + compileOnly rfg.deobf("curse.maven:chameleon-230497:2450900") // Chameleon-1.12-4.1.3 + compileOnly rfg.deobf("curse.maven:storage-drawers-223852:5981297") + if (project.debug_all.toBoolean() || project.debug_drawers.toBoolean()) { + runtimeOnly rfg.deobf("curse.maven:chameleon-230497:2450900") // Chameleon-1.12-4.1.3 + runtimeOnly rfg.deobf("curse.maven:storage-drawers-223852:5981297") + implementation rfg.deobf("curse.maven:topalldependents-1120632:6138503") + } } From b8fd0d9fcb0b07acc49cefc78cabd399d4ac4515 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Wed, 8 Apr 2026 09:17:21 +0900 Subject: [PATCH 03/19] [add] fallback / [fix] default material's multiplier --- .../StorageDrawersConfigHolder.java | 5 +++-- .../storagedrawers/StorageDrawersUtil.java | 15 ++++++++++++--- .../recipes/StorageUpgradeLoader.java | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java index 530f16f..66673ac 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java @@ -16,10 +16,11 @@ public class StorageDrawersConfigHolder { @Config.Comment({ "Specifies the materials that can be used to craft Storage Upgrades.", "Format: modId:materialName@multiplier$tier", - "\"tier\" represents the required material voltage and can be set from 1 (LV) to 13 (OpV).", + "\"tier\" represents the required material voltage and can be set from 1 (LV) to 8 (UV).", "The \"tier\" field is optional and defaults to 1 (LV) if omitted.", + "Note: the \"multiplier\" value is not affected by StorageDrawers's config.", "If this entry is left empty, variants using the original materials with the same multipliers will be added at tier 1." }) public static String[] upgradeMaterials = new String[] { - "gregtech:obsidian@2", "gregtech:iron@3", "gregtech:gold@4", "gregtech:diamond@5", "gregtech:emerald@6" + "gregtech:obsidian@2", "gregtech:iron@4", "gregtech:gold@8", "gregtech:diamond@16", "gregtech:emerald@32" }; } diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java index 445c352..1b15e3a 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; +import net.minecraft.util.math.MathHelper; + import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.unification.material.Material; @@ -21,8 +23,8 @@ public static List parse(String[] entries) { List result = new ArrayList<>(); if (entries.length == 0) { - entries = new String[] { "gregtech:obsidian@2", "gregtech:iron@3", "gregtech:gold@4", "gregtech:diamond@5", - "gregtech:emerald@6" }; + entries = new String[] { "gregtech:obsidian@2", "gregtech:iron@4", "gregtech:gold@8", "gregtech:diamond@16", + "gregtech:emerald@32" }; } for (String entry : entries) { @@ -60,13 +62,20 @@ public static List parse(String[] entries) { } int tier = 1; + int value; if (percentSplit.length == 2 && !percentSplit[1].isEmpty()) { try { - tier = Integer.parseInt(percentSplit[1]); + value = Integer.parseInt(percentSplit[1]); } catch (NumberFormatException e) { ModLog.logger.warn("Invalid tier: " + entry, e); continue; } + + if (value < 0 || 8 < value) { + tier = MathHelper.clamp(value, 1, 8); + ModLog.logger.warn("Tier is out of range. Fallback to {}", tier); + } else + tier = value; } if (check.containsKey(id)) { ModLog.logger.warn("Duplicate id: {}", id); diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java new file mode 100644 index 0000000..af04e08 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java @@ -0,0 +1,19 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.recipes; + +import gregtech.api.recipes.ModHandler; + +import com.github.gtexpert.gtmt.api.util.Mods; +import com.github.gtexpert.gtmt.integration.storagedrawers.StorageDrawersConfigHolder; + +public class StorageUpgradeLoader { + + public static void init() { + if (StorageDrawersConfigHolder.removeOriginal) { + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_obsidian")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_iron")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_gold")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_diamond")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_emerald")); + } + } +} From 59746c01e059f5bcea8e29c8d8fc449ada1544f3 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Wed, 8 Apr 2026 21:48:07 +0900 Subject: [PATCH 04/19] [add] fallback / [fix] default material's multiplier --- .../StorageDrawersConfigHolder.java | 11 +-- .../storagedrawers/StorageDrawersUtil.java | 72 ++++++++++++++----- 2 files changed, 62 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java index 66673ac..51452a8 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java @@ -16,11 +16,14 @@ public class StorageDrawersConfigHolder { @Config.Comment({ "Specifies the materials that can be used to craft Storage Upgrades.", "Format: modId:materialName@multiplier$tier", - "\"tier\" represents the required material voltage and can be set from 1 (LV) to 8 (UV).", - "The \"tier\" field is optional and defaults to 1 (LV) if omitted.", + "\"tier\" represents the required field generator tier and can be set from 1 (LV) to 8 (UV).", + "The \"tier\" field is optional and defaults to -1 (field generator is not required) if omitted.", "Note: the \"multiplier\" value is not affected by StorageDrawers's config.", - "If this entry is left empty, variants using the original materials with the same multipliers will be added at tier 1." }) + "The range of \"multiplier\" is 1 to (2,147,483,647 / (1x1 Drawer Capacity * 64 * 7)) (default: 149796)", + "Original materials (Obsidian/Iron/Gold/Diamond/Emerald) are automatically added with tier -1.", + "Do not specify them here.", + "The multiplier values for original materials are controlled by the StorageDrawers config.", + "If this entry is left empty, only the original materials will be added." }) public static String[] upgradeMaterials = new String[] { - "gregtech:obsidian@2", "gregtech:iron@4", "gregtech:gold@8", "gregtech:diamond@16", "gregtech:emerald@32" }; } diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java index 1b15e3a..f007cb0 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java @@ -7,6 +7,11 @@ import net.minecraft.util.math.MathHelper; +import com.jaquadro.minecraft.storagedrawers.StorageDrawers; +import com.jaquadro.minecraft.storagedrawers.api.storage.EnumBasicDrawer; +import com.jaquadro.minecraft.storagedrawers.config.ConfigManager; +import com.jaquadro.minecraft.storagedrawers.item.EnumUpgradeStorage; + import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.unification.material.Material; @@ -16,21 +21,32 @@ public class StorageDrawersUtil { + private static final ConfigManager config = StorageDrawers.config; + public static List UPGRADE_MATERIALS = new ArrayList<>(); + private static final int MAX_MULTIPLIER = (Integer.MAX_VALUE / + (config.getBlockBaseStorage(EnumBasicDrawer.FULL1.getUnlocalizedName()) * 64)) / 7; public static List parse(String[] entries) { Map check = new HashMap<>(); List result = new ArrayList<>(); - if (entries.length == 0) { - entries = new String[] { "gregtech:obsidian@2", "gregtech:iron@4", "gregtech:gold@8", "gregtech:diamond@16", - "gregtech:emerald@32" }; - } + ModLog.logger.info("UpgradeMaterialData Registering was started."); + + String[] defaultEntries = new String[] { + "gregtech:obsidian@" + config.getStorageUpgradeMultiplier(EnumUpgradeStorage.OBSIDIAN.getLevel()), + "gregtech:iron@" + config.getStorageUpgradeMultiplier(EnumUpgradeStorage.IRON.getLevel()), + "gregtech:gold@" + config.getStorageUpgradeMultiplier(EnumUpgradeStorage.GOLD.getLevel()), + "gregtech:diamond@" + config.getStorageUpgradeMultiplier(EnumUpgradeStorage.DIAMOND.getLevel()), + "gregtech:emerald@" + config.getStorageUpgradeMultiplier(EnumUpgradeStorage.EMERALD.getLevel()) + }; - for (String entry : entries) { + String[] newEntries = prepend(defaultEntries, entries); + + for (String entry : newEntries) { String[] split1 = entry.split("@", 2); if (split1.length != 2) { - ModLog.logger.warn("Missing '@': {}, skipped", entry); + ModLog.logger.warn("Missing '@': {}, Skipping entry.", entry); continue; } @@ -38,7 +54,7 @@ public static List parse(String[] entries) { String otherPart = split1[1]; if (!materialPart.contains(":")) { - ModLog.logger.warn("Invalid material format (missing ':'): {}, skipped", entry); + ModLog.logger.warn("Invalid material format (missing ':'): {}. Skipping entry.", entry); continue; } @@ -53,21 +69,27 @@ public static List parse(String[] entries) { String[] percentSplit = otherPart.split("%", 2); - int multiple = 1; + int multiplier; try { - multiple = Integer.parseInt(percentSplit[0]); + multiplier = Integer.parseInt(percentSplit[0]); } catch (NumberFormatException e) { - ModLog.logger.warn("Invalid multiple: " + entry, e); + ModLog.logger.warn("Invalid multiplier: {}. Skipping entry.", entry, e); continue; } - int tier = 1; + if (multiplier < 1 || MAX_MULTIPLIER < multiplier) { + int val = multiplier; + multiplier = MathHelper.clamp(val, 1, MAX_MULTIPLIER); + ModLog.logger.warn("Multiplier is out of range. Fallback to {}", multiplier); + } + + int tier = -1; int value; if (percentSplit.length == 2 && !percentSplit[1].isEmpty()) { try { value = Integer.parseInt(percentSplit[1]); } catch (NumberFormatException e) { - ModLog.logger.warn("Invalid tier: " + entry, e); + ModLog.logger.warn("Invalid tier: {}. Skipping entry.", entry, e); continue; } @@ -78,15 +100,31 @@ public static List parse(String[] entries) { tier = value; } if (check.containsKey(id)) { - ModLog.logger.warn("Duplicate id: {}", id); + ModLog.logger.warn("Duplicate id: {}. Skipping entry.", id); } - UpgradeMaterialData data = new UpgradeMaterialData(material, id, multiple, tier); + UpgradeMaterialData data = new UpgradeMaterialData(material, id, multiplier, tier); check.put(id, data); result.add(data); - ModLog.logger.info( - "Success to add UpgradeMaterialRegistry, Material: {}, meta: {}, multiplier: x{}, requiredTier: {} ({})", - material, id, multiple, tier, GTValues.VN[tier]); + if (tier == -1) { + ModLog.logger.info( + "Success to add UpgradeMaterialRegistry, Material: {}, meta: {}, multiplier: x{}", + material, id, multiplier); + } else { + ModLog.logger.info( + "Success to add UpgradeMaterialRegistry, Material: {}, meta: {}, multiplier: x{}, requiredTier: {} ({})", + material, id, multiplier, tier, GTValues.VN[tier]); + + } } + ModLog.logger.info("UpgradeMaterialData Registering was finished."); + return result; + } + + private static String[] prepend(String[] args1, String[] args2) { + String[] result = new String[args2.length + args1.length]; + System.arraycopy(args2, 0, result, 0, args2.length); + System.arraycopy(args1, 0, result, args2.length, args1.length); + return result; } } From fe9cabb020660aac60dfddce70c77b872fd3f627 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Thu, 9 Apr 2026 19:41:00 +0900 Subject: [PATCH 05/19] [add] default material --- .../storagedrawers/StorageDrawersUtil.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java index f007cb0..11f3703 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java @@ -8,13 +8,13 @@ import net.minecraft.util.math.MathHelper; import com.jaquadro.minecraft.storagedrawers.StorageDrawers; -import com.jaquadro.minecraft.storagedrawers.api.storage.EnumBasicDrawer; import com.jaquadro.minecraft.storagedrawers.config.ConfigManager; import com.jaquadro.minecraft.storagedrawers.item.EnumUpgradeStorage; import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.unification.material.Material; +import gregtech.api.unification.material.properties.PropertyKey; import com.github.gtexpert.gtmt.api.util.ModLog; import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradeMaterialData; @@ -24,8 +24,6 @@ public class StorageDrawersUtil { private static final ConfigManager config = StorageDrawers.config; public static List UPGRADE_MATERIALS = new ArrayList<>(); - private static final int MAX_MULTIPLIER = (Integer.MAX_VALUE / - (config.getBlockBaseStorage(EnumBasicDrawer.FULL1.getUnlocalizedName()) * 64)) / 7; public static List parse(String[] entries) { Map check = new HashMap<>(); @@ -41,7 +39,7 @@ public static List parse(String[] entries) { "gregtech:emerald@" + config.getStorageUpgradeMultiplier(EnumUpgradeStorage.EMERALD.getLevel()) }; - String[] newEntries = prepend(defaultEntries, entries); + String[] newEntries = prepend(entries, defaultEntries); for (String entry : newEntries) { String[] split1 = entry.split("@", 2); @@ -65,6 +63,11 @@ public static List parse(String[] entries) { continue; } + if (!material.hasProperty(PropertyKey.DUST)) { + ModLog.logger.warn("Material must have dust property. Skipping entry."); + continue; + } + int id = material.getId(); String[] percentSplit = otherPart.split("%", 2); @@ -77,12 +80,6 @@ public static List parse(String[] entries) { continue; } - if (multiplier < 1 || MAX_MULTIPLIER < multiplier) { - int val = multiplier; - multiplier = MathHelper.clamp(val, 1, MAX_MULTIPLIER); - ModLog.logger.warn("Multiplier is out of range. Fallback to {}", multiplier); - } - int tier = -1; int value; if (percentSplit.length == 2 && !percentSplit[1].isEmpty()) { @@ -101,7 +98,9 @@ public static List parse(String[] entries) { } if (check.containsKey(id)) { ModLog.logger.warn("Duplicate id: {}. Skipping entry.", id); + continue; } + UpgradeMaterialData data = new UpgradeMaterialData(material, id, multiplier, tier); check.put(id, data); result.add(data); From 807707b5098157f18c098ae2a0f1b6ebe8fcecee Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Thu, 9 Apr 2026 19:43:38 +0900 Subject: [PATCH 06/19] Moved the multiplier cap from the upgrade to the drawers. --- .../api/IStorageMultiplier.java | 6 + .../DrawerUpgradeDataMixin.java | 105 +++++++++++------- .../storagedrawers/UpgradeDataMixin.java | 73 ++++++++---- 3 files changed, 123 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/api/IStorageMultiplier.java diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/api/IStorageMultiplier.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/api/IStorageMultiplier.java new file mode 100644 index 0000000..bac1490 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/api/IStorageMultiplier.java @@ -0,0 +1,6 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.api; + +public interface IStorageMultiplier { + + long gtmt$getRawStorageMultiplier(); +} diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java index c724db6..9f410c9 100644 --- a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java @@ -3,6 +3,7 @@ import javax.annotation.Nonnull; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; @@ -12,18 +13,25 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.jaquadro.minecraft.storagedrawers.StorageDrawers; +import com.jaquadro.minecraft.storagedrawers.api.storage.EnumBasicDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers; import com.jaquadro.minecraft.storagedrawers.block.tile.tiledata.UpgradeData; import com.jaquadro.minecraft.storagedrawers.core.ModItems; +import com.github.gtexpert.gtmt.integration.storagedrawers.api.IStorageMultiplier; import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.IGTMaterialStorageUpgrade; @Mixin(targets = "com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers$DrawerUpgradeData", remap = false) public abstract class DrawerUpgradeDataMixin extends UpgradeData { + @Unique + private static final int MAX_MULTIPLIER = Integer.MAX_VALUE / + (StorageDrawers.config.getBlockBaseStorage(EnumBasicDrawer.FULL1.getUnlocalizedName()) * 64); + protected DrawerUpgradeDataMixin() { - super(0); // 実際には使われない + super(0); } @Shadow(aliases = "this$0") @@ -49,12 +57,9 @@ protected DrawerUpgradeDataMixin() { return true; } - /** - * 独自 Storage Upgrade の「追加倍率」を返す。 - * 本体 upgradeStorage はここでは触らず、0 を返して vanilla に任せる。 - */ + @Unique - private int gtmt$getCustomAddedStorageMultiplier(ItemStack stack) { + private int gtmt$getCustomMultiplier(ItemStack stack) { if (stack == null || stack.isEmpty()) { return 0; } @@ -66,39 +71,61 @@ protected DrawerUpgradeDataMixin() { return 0; } - /** - * 独自 Storage Upgrade の取り外し判定だけを差し替える。 - * vanilla item はそのまま元処理へ流す。 - */ + @Unique + private long gtmt$getRawTotalMultiplier() { + return ((IStorageMultiplier) (Object) this).gtmt$getRawStorageMultiplier(); + } + + @Unique + private boolean gtmt$stackCapacityCheckByEffectiveMultiplier(int effectiveMultiplier) { + int stackCapacity = effectiveMultiplier * gtmt$outer.getEffectiveDrawerCapacity(); + + for (int i = 0; i < gtmt$outer.getDrawerCount(); i++) { + IDrawer drawer = gtmt$outer.getDrawer(i); + if (!drawer.isEnabled() || drawer.isEmpty()) { + continue; + } + + int addedItemCapacity = stackCapacity * drawer.getStoredItemStackSize(); + if (drawer.getMaxCapacity() - addedItemCapacity < drawer.getStoredItemCount()) { + return false; + } + } + + return true; + } + @Inject(method = "canRemoveUpgrade", at = @At("HEAD"), cancellable = true) private void gtmt$canRemoveUpgrade(int slot, CallbackInfoReturnable cir) { ItemStack upgrade = this.getUpgrade(slot); + if (upgrade == null || upgrade.isEmpty()) { return; } - int customMultiplier = gtmt$getCustomAddedStorageMultiplier(upgrade); + int currentCustomMultiplier = gtmt$getCustomMultiplier(upgrade); - if (customMultiplier <= 0) { + if (currentCustomMultiplier <= 0) { return; } - int effectiveMultipier = this.getStorageMultiplier(); - int removedMultiplier = customMultiplier; - - if (effectiveMultipier == customMultiplier) { - removedMultiplier--; + long rawBefore = gtmt$getRawTotalMultiplier(); + long rawAfter = rawBefore - (long) currentCustomMultiplier; + if (rawAfter < 1L) { + rawAfter = 1L; } - int removedStackCapacity = removedMultiplier * gtmt$outer.getEffectiveDrawerCapacity(); + int effBefore = (int) MathHelper.clamp(rawBefore, 1, MAX_MULTIPLIER); + int effAfter = (int) MathHelper.clamp(rawAfter, 1, MAX_MULTIPLIER); + + if (effBefore == effAfter) { + cir.setReturnValue(true); + return; + } - cir.setReturnValue(gtmt$stackCapacityCheck(removedStackCapacity)); + cir.setReturnValue(gtmt$stackCapacityCheckByEffectiveMultiplier(effAfter)); } - /** - * 独自 Storage Upgrade の swap 判定だけを差し替える。 - * vanilla 同士の swap は元処理に任せる。 - */ @Inject(method = "canSwapUpgrade", at = @At("HEAD"), cancellable = true) private void gtmt$canSwapUpgrade(int slot, @NotNull ItemStack add, CallbackInfoReturnable cir) { ItemStack current = this.getUpgrade(slot); @@ -106,10 +133,10 @@ protected DrawerUpgradeDataMixin() { return; } - int currentCustomMulti = gtmt$getCustomAddedStorageMultiplier(current); - int addCustomMulti = gtmt$getCustomAddedStorageMultiplier(add); + int currentCustomMultiplier = gtmt$getCustomMultiplier(current); + int addCustomMultiplier = gtmt$getCustomMultiplier(add); - if (currentCustomMulti <= 0 && addCustomMulti <= 0) { + if (currentCustomMultiplier <= 0 && addCustomMultiplier <= 0) { return; } @@ -123,25 +150,25 @@ protected DrawerUpgradeDataMixin() { return; } - if (addCustomMulti > 0) { + if (addCustomMultiplier > 0) { cir.setReturnValue(true); return; } - if (currentCustomMulti > 0) { - int currentMultiplier = this.getStorageMultiplier(); - int newMultiplier = currentMultiplier - currentCustomMulti; - - if (newMultiplier <= 0) { - newMultiplier = 1; - } - - int baseCapacity = ((AccessorTileEntityDrawers) gtmt$outer) - .gtmt$invokeGetEffectiveDrawerCapacity(); + long rawBefore = gtmt$getRawTotalMultiplier(); + long rawAfter = rawBefore - (long) currentCustomMultiplier + (long) addCustomMultiplier; + if (rawAfter < 1L) { + rawAfter = 1L; + } - int newCapacity = newMultiplier * baseCapacity; + int effBefore = (int) MathHelper.clamp(rawBefore, 1, MAX_MULTIPLIER); + int effAfter = (int) MathHelper.clamp(rawAfter, 1, MAX_MULTIPLIER); - cir.setReturnValue(gtmt$stackCapacityCheck(newCapacity)); + if (effBefore == effAfter) { + cir.setReturnValue(true); + return; } + + cir.setReturnValue(gtmt$stackCapacityCheckByEffectiveMultiplier(effAfter)); } } diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java index b55151c..6e0e6ae 100644 --- a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/UpgradeDataMixin.java @@ -1,60 +1,89 @@ package com.github.gtexpert.gtmt.mixins.storagedrawers; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.jaquadro.minecraft.storagedrawers.StorageDrawers; +import com.jaquadro.minecraft.storagedrawers.api.storage.EnumBasicDrawer; import com.jaquadro.minecraft.storagedrawers.block.tile.tiledata.UpgradeData; import com.jaquadro.minecraft.storagedrawers.config.ConfigManager; import com.jaquadro.minecraft.storagedrawers.core.ModItems; import com.jaquadro.minecraft.storagedrawers.item.EnumUpgradeStorage; +import com.github.gtexpert.gtmt.integration.storagedrawers.api.IStorageMultiplier; import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.IGTMaterialStorageUpgrade; @Mixin(value = UpgradeData.class, remap = false) -public abstract class UpgradeDataMixin { +public abstract class UpgradeDataMixin implements IStorageMultiplier { @Shadow private ItemStack[] upgrades; @Shadow private int storageMultiplier; + @Unique + private long gtmt$rawStorageMultiplier = 1; + @Unique + private static final int MAX_MULTIPLIER = Integer.MAX_VALUE / + (StorageDrawers.config.getBlockBaseStorage(EnumBasicDrawer.FULL1.getUnlocalizedName()) * 64); + + @Override + public long gtmt$getRawStorageMultiplier() { + return gtmt$rawStorageMultiplier; + } + + @Unique + private int gtmt$getMultiplierOf(ItemStack stack) { + if (stack == null || stack.isEmpty()) { + return 0; + } + + if (stack.getItem() == ModItems.upgradeStorage) { + int level = EnumUpgradeStorage.byMetadata(stack.getMetadata()).getLevel(); + return StorageDrawers.config.getStorageUpgradeMultiplier(level); + } + + if (stack.getItem() instanceof IGTMaterialStorageUpgrade upgrade) { + return upgrade.getStorageMultiplier(stack); + } + + return 0; + } + + @Unique + private int gtmt$clampEffectiveMultiplier(long raw) { + if (raw <= 1L) { + return 1; + } + if (raw >= MAX_MULTIPLIER) { + return MAX_MULTIPLIER; + } + return (int) raw; + } @Inject(method = "syncStorageMultiplier", at = @At("HEAD"), cancellable = true) - private void gtmt$addCustomStorageMultiplier(CallbackInfo ci) { + private void gtmt$syncStorageMultiplier(CallbackInfo ci) { ConfigManager config = StorageDrawers.config; - int multiplier = 0; + long raw = 0L; for (ItemStack stack : upgrades) { - if (stack == null || stack.isEmpty()) { - continue; - } - - if (stack.getItem() == ModItems.upgradeStorage) { - int level = EnumUpgradeStorage.byMetadata(stack.getMetadata()).getLevel(); - multiplier += config.getStorageUpgradeMultiplier(level); - continue; - } - - if (stack.getItem() instanceof IGTMaterialStorageUpgrade gt) { - int level = gt.getStorageMultiplier(stack); - if (level > 0) { - multiplier += level; - } - } + raw += gtmt$getMultiplierOf(stack); } - if (multiplier == 0) { - multiplier = config.getStorageUpgradeMultiplier(1); + if (raw <= 0) { + raw = config.getStorageUpgradeMultiplier(1); } - this.storageMultiplier = multiplier; + this.gtmt$rawStorageMultiplier = raw; + this.storageMultiplier = (int) MathHelper.clamp(raw, 1, MAX_MULTIPLIER); ci.cancel(); } } From d80e243b91bb9f5afc56bf20cab888b98c46927d Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Thu, 9 Apr 2026 19:44:01 +0900 Subject: [PATCH 07/19] [add] recipe --- .../material/info/GTMTMaterialFlags.java | 60 +++++++++++++++++++ .../storagedrawers/StorageDrawersModule.java | 30 ++++++---- .../recipes/StorageUpgradeLoader.java | 19 ------ .../recipes/UpgradesLoader.java | 49 +++++++++++++++ 4 files changed, 127 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java delete mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java create mode 100644 src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java diff --git a/src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java b/src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java new file mode 100644 index 0000000..5b2eb45 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java @@ -0,0 +1,60 @@ +package com.github.gtexpert.gtmt.api.unification.material.info; + +import java.util.HashSet; +import java.util.Set; + +import gregtech.api.GregTechAPI; +import gregtech.api.unification.material.Material; +import gregtech.api.unification.material.Materials; +import gregtech.api.unification.material.info.MaterialFlags; +import gregtech.api.unification.material.properties.PropertyKey; + +import com.github.gtexpert.gtmt.api.util.ModLog; +import com.github.gtexpert.gtmt.integration.storagedrawers.StorageDrawersConfigHolder; + +public class GTMTMaterialFlags { + + public static void integrationStorageDrawers() { + Set materials = new HashSet<>(); + materials.add(Materials.Obsidian); + materials.add(Materials.Iron); + materials.add(Materials.Gold); + materials.add(Materials.Diamond); + materials.add(Materials.Emerald); + + for (String str : StorageDrawersConfigHolder.upgradeMaterials) { + if (str.isEmpty()) continue; + + String[] split1 = str.split("@", 2); + + if (split1.length != 2) { + continue; + + } + String materialPart = split1[0]; + + if (!materialPart.contains(":")) { + continue; + } + + Material material = GregTechAPI.materialManager.getMaterial(materialPart); + + if (material == null) { + continue; + } + + if (!material.hasProperty(PropertyKey.DUST)) { + ModLog.logger.warn("Material must have dust property. Skipping entry."); + } + materials.add(material); + } + + for (Material material : materials) { + if (!material.hasFlag(MaterialFlags.GENERATE_PLATE)) material.addFlags(MaterialFlags.GENERATE_PLATE); + if (!material.hasFlag(MaterialFlags.GENERATE_ROD)) material.addFlags(MaterialFlags.GENERATE_ROD); + if (!material.hasFlag(MaterialFlags.GENERATE_LONG_ROD)) material.addFlags(MaterialFlags.GENERATE_LONG_ROD); + if (!material.hasFlag(MaterialFlags.GENERATE_BOLT_SCREW)) + material.addFlags(MaterialFlags.GENERATE_BOLT_SCREW); + } + } +} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java index a15c027..aca97dc 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java @@ -8,7 +8,6 @@ import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.client.event.ColorHandlerEvent; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent; @@ -21,11 +20,15 @@ import org.jetbrains.annotations.NotNull; +import gregtech.api.unification.material.event.PostMaterialEvent; + import com.github.gtexpert.gtmt.api.ModValues; import com.github.gtexpert.gtmt.api.modules.TModule; +import com.github.gtexpert.gtmt.api.unification.material.info.GTMTMaterialFlags; import com.github.gtexpert.gtmt.integration.IntegrationSubmodule; import com.github.gtexpert.gtmt.integration.storagedrawers.items.ItemGTMaterialUpgradeStorage; import com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems; +import com.github.gtexpert.gtmt.integration.storagedrawers.recipes.UpgradesLoader; import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.StorageUpgradeColors; import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradeMaterialData; import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradesMaterialRegistry; @@ -56,13 +59,7 @@ public void init(FMLInitializationEvent event) { } @Override - public void postInit(FMLPostInitializationEvent event) { - StorageDrawersUtil.UPGRADE_MATERIALS = StorageDrawersUtil.parse(StorageDrawersConfigHolder.upgradeMaterials); - for (UpgradeMaterialData data : StorageDrawersUtil.UPGRADE_MATERIALS) { - UpgradesMaterialRegistry.REGISTRY.put(data.getMaterial(), data.getId(), data.getMultiple(), - data.getTier()); - } - } + public void postInit(FMLPostInitializationEvent event) {} @SubscribeEvent public static void onRegisterItems(RegistryEvent.Register event) { @@ -77,15 +74,24 @@ public static void onRegisterModels(ModelRegistryEvent event) { } @SubscribeEvent - @SideOnly(Side.CLIENT) - public static void onRegisterColors(ColorHandlerEvent.Item event) {} + public static void registerMaterialFlags(PostMaterialEvent event) { + GTMTMaterialFlags.integrationStorageDrawers(); + } @Override public void registerBlocks(RegistryEvent.Register event) {} @Override - public void registerRecipesNormal(RegistryEvent.Register event) {} + public void registerRecipesNormal(RegistryEvent.Register event) { + StorageDrawersUtil.UPGRADE_MATERIALS = StorageDrawersUtil.parse(StorageDrawersConfigHolder.upgradeMaterials); + for (UpgradeMaterialData data : StorageDrawersUtil.UPGRADE_MATERIALS) { + UpgradesMaterialRegistry.REGISTRY.put(data.getMaterial(), data.getId(), data.getMultiple(), + data.getTier()); + } + } @Override - public void registerRecipesLowest(RegistryEvent.Register event) {} + public void registerRecipesLowest(RegistryEvent.Register event) { + UpgradesLoader.upgradeStorage(); + } } diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java deleted file mode 100644 index af04e08..0000000 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/StorageUpgradeLoader.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.gtexpert.gtmt.integration.storagedrawers.recipes; - -import gregtech.api.recipes.ModHandler; - -import com.github.gtexpert.gtmt.api.util.Mods; -import com.github.gtexpert.gtmt.integration.storagedrawers.StorageDrawersConfigHolder; - -public class StorageUpgradeLoader { - - public static void init() { - if (StorageDrawersConfigHolder.removeOriginal) { - ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_obsidian")); - ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_iron")); - ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_gold")); - ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_diamond")); - ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_emerald")); - } - } -} diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java new file mode 100644 index 0000000..4365bc7 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java @@ -0,0 +1,49 @@ +package com.github.gtexpert.gtmt.integration.storagedrawers.recipes; + +import static com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems.upgradeStorageGT; + +import net.minecraft.item.ItemStack; + +import gregtech.api.items.metaitem.MetaItem; +import gregtech.api.recipes.ModHandler; +import gregtech.api.unification.material.Material; +import gregtech.api.unification.ore.OrePrefix; +import gregtech.api.unification.stack.UnificationEntry; +import gregtech.common.items.MetaItems; + +import com.github.gtexpert.gtmt.api.util.Mods; +import com.github.gtexpert.gtmt.integration.storagedrawers.StorageDrawersConfigHolder; +import com.github.gtexpert.gtmt.integration.storagedrawers.storageupgrades.UpgradesMaterialRegistry; + +public class UpgradesLoader { + + public static void upgradeStorage() { + if (StorageDrawersConfigHolder.removeOriginal) { + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_obsidian")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_iron")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_gold")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_diamond")); + ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_emerald")); + } + MetaItem.MetaValueItem[] fieldGenerators = new MetaItem.MetaValueItem[] { + MetaItems.FIELD_GENERATOR_LV, MetaItems.FIELD_GENERATOR_MV, MetaItems.FIELD_GENERATOR_HV, + MetaItems.FIELD_GENERATOR_EV, MetaItems.FIELD_GENERATOR_IV, MetaItems.FIELD_GENERATOR_LuV, + MetaItems.FIELD_GENERATOR_ZPM, MetaItems.FIELD_GENERATOR_UV + }; + + UpgradesMaterialRegistry.REGISTRY.values().forEach(data -> { + Material material = data.getMaterial(); + int meta = data.getId(); + int tier = data.getTier(); + ItemStack output = new ItemStack(upgradeStorageGT, 1, meta); + String recipeName = "storage_upgrade_" + material.getName(); + + ModHandler.addShapedRecipe(true, recipeName, output, + "PSP", "SCS", "PTP", + 'P', new UnificationEntry(OrePrefix.plate, material), + 'S', new UnificationEntry(OrePrefix.screw, material), + 'C', Mods.StorageDrawers.getItem("upgrade_template"), + 'T', tier == -1 ? new UnificationEntry(OrePrefix.stickLong, material) : fieldGenerators[tier - 1]); + }); + } +} From e31a8e911fa25dd1392581dc6d35ed951090e591 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:31:17 +0900 Subject: [PATCH 08/19] [add] convert recipe --- .../recipes/UpgradesLoader.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java index 4365bc7..2df6d5c 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java @@ -2,6 +2,8 @@ import static com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems.upgradeStorageGT; +import gregtech.api.unification.material.Materials; + import net.minecraft.item.ItemStack; import gregtech.api.items.metaitem.MetaItem; @@ -18,6 +20,7 @@ public class UpgradesLoader { public static void upgradeStorage() { + // original if (StorageDrawersConfigHolder.removeOriginal) { ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_obsidian")); ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_iron")); @@ -25,6 +28,7 @@ public static void upgradeStorage() { ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_diamond")); ModHandler.removeRecipeByName(Mods.StorageDrawers.getResource("upgrade_storage_emerald")); } + // custom MetaItem.MetaValueItem[] fieldGenerators = new MetaItem.MetaValueItem[] { MetaItems.FIELD_GENERATOR_LV, MetaItems.FIELD_GENERATOR_MV, MetaItems.FIELD_GENERATOR_HV, MetaItems.FIELD_GENERATOR_EV, MetaItems.FIELD_GENERATOR_IV, MetaItems.FIELD_GENERATOR_LuV, @@ -44,6 +48,27 @@ public static void upgradeStorage() { 'S', new UnificationEntry(OrePrefix.screw, material), 'C', Mods.StorageDrawers.getItem("upgrade_template"), 'T', tier == -1 ? new UnificationEntry(OrePrefix.stickLong, material) : fieldGenerators[tier - 1]); + // convert recipe + if (material == Materials.Obsidian) { + addStorageUpgradeConvertRecipe(Mods.StorageDrawers.getItem("upgrade_storage", 1, 0), output, material); + } + if (material == Materials.Iron) { + addStorageUpgradeConvertRecipe(Mods.StorageDrawers.getItem("upgrade_storage", 1, 1), output, material); + } + if (material == Materials.Gold) { + addStorageUpgradeConvertRecipe(Mods.StorageDrawers.getItem("upgrade_storage", 1, 2), output, material); + } + if (material == Materials.Diamond) { + addStorageUpgradeConvertRecipe(Mods.StorageDrawers.getItem("upgrade_storage", 1, 3), output, material); + } + if (material == Materials.Emerald) { + addStorageUpgradeConvertRecipe(Mods.StorageDrawers.getItem("upgrade_storage", 1, 4), output, material); + } }); } + + private static void addStorageUpgradeConvertRecipe(ItemStack original, ItemStack custom, Material material) { + ModHandler.addShapelessRecipe("original_to_custom/" + material.getUnlocalizedName(), original, custom); + ModHandler.addShapelessRecipe("custom_to_original/" + material.getUnlocalizedName(), custom, original); + } } From f06c8ac35b4f35d354ca270f1a0090b59e8c0f71 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:31:34 +0900 Subject: [PATCH 09/19] [add] default material --- .../StorageDrawersConfigHolder.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java index 51452a8..7bed3aa 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java @@ -16,14 +16,29 @@ public class StorageDrawersConfigHolder { @Config.Comment({ "Specifies the materials that can be used to craft Storage Upgrades.", "Format: modId:materialName@multiplier$tier", + "==Notes==", + "--Material--", + "Material must have dust property", + "--multiplier--", + "The range of \"multiplier\" is 1 to 2147483647", + "The \"multiplier\" value is not affected by StorageDrawers's config.", + "--tier--", "\"tier\" represents the required field generator tier and can be set from 1 (LV) to 8 (UV).", "The \"tier\" field is optional and defaults to -1 (field generator is not required) if omitted.", - "Note: the \"multiplier\" value is not affected by StorageDrawers's config.", - "The range of \"multiplier\" is 1 to (2,147,483,647 / (1x1 Drawer Capacity * 64 * 7)) (default: 149796)", + "--others--", "Original materials (Obsidian/Iron/Gold/Diamond/Emerald) are automatically added with tier -1.", "Do not specify them here.", "The multiplier values for original materials are controlled by the StorageDrawers config.", "If this entry is left empty, only the original materials will be added." }) public static String[] upgradeMaterials = new String[] { + "gregtech:wrought_iron@4", "gregtech:bronze@8", + "gregtech:steel@16", "gregtech:bismuth_bronze@32%1", + "gregtech:aluminium@64", "gregtech:rose_gold@128%2", + "gregtech:stainless_steel@256", "gregtech:ultimet@512%3", + "gregtech:titanium@1024", "gregtech:ruridit@2048%4", + "gregtech:tungsten_steel@4096", "gregtech:hssg@8192%5", + "gregtech:rhodium_plated_palladium@16384", "gregtech:europium@32768%6", + "gregtech:naquadah_alloy@65536", "gregtech:americium@131072%7", + "gregtech:darmstadtium@262144", "gregtech:neutronium@524288%8" }; } From ab0a2c73dc3cd339e7d2c0de2e720d8866b1a4c8 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:31:54 +0900 Subject: [PATCH 10/19] spotless --- .../integration/storagedrawers/recipes/UpgradesLoader.java | 3 +-- .../gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java index 2df6d5c..c3cedbb 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/recipes/UpgradesLoader.java @@ -2,13 +2,12 @@ import static com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems.upgradeStorageGT; -import gregtech.api.unification.material.Materials; - import net.minecraft.item.ItemStack; import gregtech.api.items.metaitem.MetaItem; import gregtech.api.recipes.ModHandler; import gregtech.api.unification.material.Material; +import gregtech.api.unification.material.Materials; import gregtech.api.unification.ore.OrePrefix; import gregtech.api.unification.stack.UnificationEntry; import gregtech.common.items.MetaItems; diff --git a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java index 9f410c9..0330da2 100644 --- a/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java +++ b/src/main/java/com/github/gtexpert/gtmt/mixins/storagedrawers/DrawerUpgradeDataMixin.java @@ -57,7 +57,6 @@ protected DrawerUpgradeDataMixin() { return true; } - @Unique private int gtmt$getCustomMultiplier(ItemStack stack) { if (stack == null || stack.isEmpty()) { From a60bfeadbe1a9281a91459eb6370f892ae0ed386 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:33:08 +0900 Subject: [PATCH 11/19] [fix] typo --- .../integration/storagedrawers/StorageDrawersConfigHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java index 7bed3aa..0d5928c 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java @@ -15,7 +15,7 @@ public class StorageDrawersConfigHolder { public static boolean removeOriginal = true; @Config.Comment({ "Specifies the materials that can be used to craft Storage Upgrades.", - "Format: modId:materialName@multiplier$tier", + "Format: modId:materialName@multiplier%tier", "==Notes==", "--Material--", "Material must have dust property", From 02d6026f66fdad0d5f7f20c556638b360c5e3752 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:37:07 +0900 Subject: [PATCH 12/19] [fix] crash --- .../gtmt/integration/storagedrawers/StorageDrawersModule.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java index aca97dc..b6b7a99 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java @@ -25,6 +25,7 @@ import com.github.gtexpert.gtmt.api.ModValues; import com.github.gtexpert.gtmt.api.modules.TModule; import com.github.gtexpert.gtmt.api.unification.material.info.GTMTMaterialFlags; +import com.github.gtexpert.gtmt.api.util.Mods; import com.github.gtexpert.gtmt.integration.IntegrationSubmodule; import com.github.gtexpert.gtmt.integration.storagedrawers.items.ItemGTMaterialUpgradeStorage; import com.github.gtexpert.gtmt.integration.storagedrawers.items.StorageDrawersItems; @@ -37,6 +38,7 @@ @TModule( moduleID = Modules.MODULE_DRAWERS, containerID = ModValues.MODID, + modDependencies = Mods.Names.STORAGE_DRAWERS, name = "GTMoreTool Storage Drawers Integration", description = "Storage Drawers Module") public class StorageDrawersModule extends IntegrationSubmodule { From 1d3635b4d7fd844932099b2d62091cecd2e57db0 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 18:57:36 +0900 Subject: [PATCH 13/19] [update] README, CHANGELOG, DEVELOPER.md --- CHANGELOG.md | 8 ++++++ DEVELOPER.md | 74 ++++++++++++++++++++++++++++++++++++++++++++++++---- README.md | 3 +++ 3 files changed, 80 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af2a8e1..61d26b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.3.0 +## New: Storage Drawers Integration +- GT materials can now be used to craft _Storage Upgrades_. +- Craftable materials, multipliers, and related settings can be configured via cfg. +- Original materials (Obsidian/Iron/Gold/Diamond/Emerald) are always included. + +* * * + # v1.2.3 ## Tinkers' Construct Integration - GT tool in main-hand + TiC tool in off-hand (and vice versa) now mines blocks using the off-hand tool diff --git a/DEVELOPER.md b/DEVELOPER.md index 7333cc5..2749470 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -3,11 +3,12 @@ GTMoreTools exposes addon APIs for its mod integrations. The table below shows current coverage: -| Integration | API package | Status | -|---|---|---| -| Tinkers' Construct | `integration.tic.api` | Available | -| Better Builder's Wands | — | No API yet | -| Chisel | — | No API yet | +| Integration | API package | Status | +|------------------------|----------------------------------|-------------------------------| +| Tinkers' Construct | `integration.tic.api` | Available | +| Better Builder's Wands | — | No API yet | +| Chisel | — | No API yet | +| Sorage Drawers | `integration.storagedrawers.api` | Available, but for mixin only | All registration calls must happen during your mod's `preInit` phase, **before** GTMT's `registerBlocks`, unless stated otherwise. @@ -160,3 +161,66 @@ Parallel count scales as `4^(tier − EV) / 2` from EV upward. ### Bookshelf variants (Assembler) 6 wood types × 1 recipe each: 6 planks + 3 Books → carved Bookshelf (100 EU, ULV). + +--- + +## Storage Drawers Integration +An addon API currently exists, but it is mixin-based and not usable. The following describes the internal logic for reference. + +### What is added + +- Storage Upgrades made from GT materials will be registered for the GT materials specified in the cfg. + +### Config Options + +`removeOriginal` +- Controls whether the default Storage Upgrade recipes are removed. + - true: All original Storage Upgrade recipes are removed. Only recipes defined by this mod (via upgradeMaterials) will be available. + - false: Original recipes remain alongside the newly added ones. +- Use this if you want to fully replace the default progression with GT-based materials. + +`upgradeMaterials` +- Defines custom materials used to craft Storage Upgrades. +- Each entry adds a new Storage Upgrade variant based on a GT material. + +#### _Format_ +`modId:materialName@multiplier%tier` + +#### _Parameters_ +- `materialName`: Must be a valid GT material with a dust property. +- `multiplier`: Determines the storage capacity multiplier of the upgrade. + - Range: 1 to 2147483647 + - Not affected by the StorageDrawers config. +- `tier` (optional): Required Field Generator tier. + - Range: 1 (LV) to 8 (UV) + - If omitted, defaults to -1 (no Field Generator required). + +#### _Behavior_ +- A Storage Upgrade using the specified material will be registered for each entry. +- If the config is empty, only the original materials are available. +- Original materials (Obsidian / Iron / Gold / Diamond / Emerald): + - Always included automatically. + - Use tier -1. + - Their multipliers are controlled by the StorageDrawers config. + - **Do NOT define them here.** + +#### _Example_ +`gregtech:steel@4%2` +- Adds a Steel Storage Upgrade + - Multiplier: x4 + - Requires MV-tier Field Generator + +### Crafting + +``` +P S P +S U S +P X P +``` + +- **P** = `plate` +- **S** = `screw` +- **U** = Upgrade Template +- **X** = If _tier_ is -1, a `stickLong`; otherwise, a `Field Generator` of the specified tier + +- _Storage Upgrade_ conversion recipes between StorageDrawers and GTMoreTools are always added for Obsidian / Iron / Gold / Diamond / Emerald. diff --git a/README.md b/README.md index 909a85e..64ad36d 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,9 @@ This mod is an add-on for GregTech CEu that provides integration with various mo - GT material fluids can be melted in the TiC Smeltery (ingot, nugget, dust, gem, and optionally ore variants). Raw ore doubling is disabled by default to preserve GT ore-processing progression (configurable) +### Storage Drawers Integration +- Add GT material-based Storage Upgrades. + ## For Addon Developers GTMoreTools exposes a public API for extending the Tinkers' Construct integration. From 3ea136bd78afd0c9db551de08e2c45bd3ba0510a Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 18:59:38 +0900 Subject: [PATCH 14/19] refine config --- .../storagedrawers/StorageDrawersConfigHolder.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java index 0d5928c..1df9a40 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersConfigHolder.java @@ -18,14 +18,14 @@ public class StorageDrawersConfigHolder { "Format: modId:materialName@multiplier%tier", "==Notes==", "--Material--", - "Material must have dust property", - "--multiplier--", + "Must have the dust property", + "--Multiplier--", "The range of \"multiplier\" is 1 to 2147483647", - "The \"multiplier\" value is not affected by StorageDrawers's config.", - "--tier--", + "The \"multiplier\" value is not affected by StorageDrawers config.", + "--Tier--", "\"tier\" represents the required field generator tier and can be set from 1 (LV) to 8 (UV).", - "The \"tier\" field is optional and defaults to -1 (field generator is not required) if omitted.", - "--others--", + "The \"tier\" field is optional and defaults to -1 (no field generator required) if omitted.", + "--Others--", "Original materials (Obsidian/Iron/Gold/Diamond/Emerald) are automatically added with tier -1.", "Do not specify them here.", "The multiplier values for original materials are controlled by the StorageDrawers config.", From e80b33dd9a2059039e9b7f7ed6a60d896bfc638c Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 23:22:59 +0900 Subject: [PATCH 15/19] [apply] review --- DEVELOPER.md | 2 +- .../gtmt/api/unification/material/info/GTMTMaterialFlags.java | 1 + .../gtmt/integration/storagedrawers/StorageDrawersModule.java | 2 +- .../gtmt/integration/storagedrawers/StorageDrawersUtil.java | 2 +- .../storagedrawers/items/ItemGTMaterialUpgradeStorage.java | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DEVELOPER.md b/DEVELOPER.md index 2749470..2539601 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -8,7 +8,7 @@ The table below shows current coverage: | Tinkers' Construct | `integration.tic.api` | Available | | Better Builder's Wands | — | No API yet | | Chisel | — | No API yet | -| Sorage Drawers | `integration.storagedrawers.api` | Available, but for mixin only | +| Storage Drawers | `integration.storagedrawers.api` | Available, but for mixin only | All registration calls must happen during your mod's `preInit` phase, **before** GTMT's `registerBlocks`, unless stated otherwise. diff --git a/src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java b/src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java index 5b2eb45..656b3da 100644 --- a/src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java +++ b/src/main/java/com/github/gtexpert/gtmt/api/unification/material/info/GTMTMaterialFlags.java @@ -45,6 +45,7 @@ public static void integrationStorageDrawers() { if (!material.hasProperty(PropertyKey.DUST)) { ModLog.logger.warn("Material must have dust property. Skipping entry."); + continue; } materials.add(material); } diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java index b6b7a99..395b39b 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersModule.java @@ -39,7 +39,7 @@ moduleID = Modules.MODULE_DRAWERS, containerID = ModValues.MODID, modDependencies = Mods.Names.STORAGE_DRAWERS, - name = "GTMoreTool Storage Drawers Integration", + name = "GTMoreTools Storage Drawers Integration", description = "Storage Drawers Module") public class StorageDrawersModule extends IntegrationSubmodule { diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java index 11f3703..efd789e 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java @@ -90,7 +90,7 @@ public static List parse(String[] entries) { continue; } - if (value < 0 || 8 < value) { + if (value < 1 || 8 < value) { tier = MathHelper.clamp(value, 1, 8); ModLog.logger.warn("Tier is out of range. Fallback to {}", tier); } else diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java index 732b708..1bfa0df 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/items/ItemGTMaterialUpgradeStorage.java @@ -80,7 +80,7 @@ public static ModelResourceLocation getModelLocation() { return super.getItemStackDisplayName(stack); } - String materialName = getMaterial(stack).getUnlocalizedName(); + String materialName = data.getMaterial().getUnlocalizedName(); return I18n.format("gtmt.item.upgrade_storage.name", I18n.format(materialName)); } From 242bb43bc1d8af120ca846197e0be9e7dfd6c78a Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 23:35:19 +0900 Subject: [PATCH 16/19] refine log message --- .../integration/storagedrawers/StorageDrawersUtil.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java index efd789e..fefebe3 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java @@ -29,7 +29,7 @@ public static List parse(String[] entries) { Map check = new HashMap<>(); List result = new ArrayList<>(); - ModLog.logger.info("UpgradeMaterialData Registering was started."); + ModLog.logger.info("UpgradeMaterialData registration started."); String[] defaultEntries = new String[] { "gregtech:obsidian@" + config.getStorageUpgradeMultiplier(EnumUpgradeStorage.OBSIDIAN.getLevel()), @@ -106,16 +106,16 @@ public static List parse(String[] entries) { result.add(data); if (tier == -1) { ModLog.logger.info( - "Success to add UpgradeMaterialRegistry, Material: {}, meta: {}, multiplier: x{}", + "Registered UpgradeMaterial (Material: {}, meta: {}, multiplier: x{})", material, id, multiplier); } else { ModLog.logger.info( - "Success to add UpgradeMaterialRegistry, Material: {}, meta: {}, multiplier: x{}, requiredTier: {} ({})", + "Registered UpgradeMaterial (Material: {}, meta: {}, multiplier: x{}, requiredTier: {} ({}))", material, id, multiplier, tier, GTValues.VN[tier]); } } - ModLog.logger.info("UpgradeMaterialData Registering was finished."); + ModLog.logger.info("UpgradeMaterialData registration finished."); return result; } From d5a2ae97dbe60a78dd64481a779aa53b0445becc Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 23:43:42 +0900 Subject: [PATCH 17/19] refine log message again --- .../gtmt/integration/storagedrawers/StorageDrawersUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java index fefebe3..138bf1b 100644 --- a/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java +++ b/src/main/java/com/github/gtexpert/gtmt/integration/storagedrawers/StorageDrawersUtil.java @@ -106,11 +106,11 @@ public static List parse(String[] entries) { result.add(data); if (tier == -1) { ModLog.logger.info( - "Registered UpgradeMaterial (Material: {}, meta: {}, multiplier: x{})", + "Registered UpgradeMaterial (Material={}, meta={}, multiplier=x{})", material, id, multiplier); } else { ModLog.logger.info( - "Registered UpgradeMaterial (Material: {}, meta: {}, multiplier: x{}, requiredTier: {} ({}))", + "Registered UpgradeMaterial (Material={}, meta={}, multiplier=x{}, requiredTier={} ({}))", material, id, multiplier, tier, GTValues.VN[tier]); } From 013d142c65606eb2737998eef1bc9c459bb9af87 Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 23:45:19 +0900 Subject: [PATCH 18/19] [add] logging --- DEVELOPER.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/DEVELOPER.md b/DEVELOPER.md index 2539601..e1bfa91 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -209,6 +209,13 @@ An addon API currently exists, but it is mixin-based and not usable. The followi - Adds a Steel Storage Upgrade - Multiplier: x4 - Requires MV-tier Field Generator + +#### _Logging_ +- Registration results can be checked in the log. +- The process starts with `[GT More Tools]: UpgradeMaterialData registration started.` and ends with `[GT More Tools]: UpgradeMaterialData registration finished.` +- On successful registration, the following message is logged: `[GT More Tools]: Registered UpgradeMaterial (Material=..., meta=..., multiplier=x..., requiredTier=...)` + - For example, a successful registration will produce a log like: `[GT More Tools]: Registered UpgradeMaterial (Material=steel, meta=324, multiplier=x4, requiredTier=2 (MV))` +- Entries with an invalid format will be skipped, and the log will indicate the issue. ### Crafting From cb4d432154c28bdb35c8199d5b13c59161bc164c Mon Sep 17 00:00:00 2001 From: ko_no <90126004+MrKono@users.noreply.github.com> Date: Fri, 10 Apr 2026 23:46:39 +0900 Subject: [PATCH 19/19] [fix] conflict --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10e875e..e12f5f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.3.0 +## New: Storage Drawers Integration +- GT materials can now be used to craft _Storage Upgrades_. +- Craftable materials, multipliers, and related settings can be configured via cfg. +- Original materials (Obsidian/Iron/Gold/Diamond/Emerald) are always included. + +* * * + # v1.2.4 ## Tinkers' Construct Integration - Fixed GT main-hand + TiC off-hand combination dropping items twice