From dc05d8a2cf6a79eefa20aaf6a63599173e39f473 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 21 Aug 2024 11:47:42 -0700 Subject: [PATCH 01/23] init --- .../api/block/VariantActiveBlock.java | 2 +- .../java/gregtech/api/block/VariantBlock.java | 6 +- .../gregtech/common/blocks/BlockWireCoil.java | 167 +++++++++++++----- 3 files changed, 124 insertions(+), 51 deletions(-) diff --git a/src/main/java/gregtech/api/block/VariantActiveBlock.java b/src/main/java/gregtech/api/block/VariantActiveBlock.java index ba4ac712a03..eb059561bd9 100644 --- a/src/main/java/gregtech/api/block/VariantActiveBlock.java +++ b/src/main/java/gregtech/api/block/VariantActiveBlock.java @@ -39,7 +39,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; -public class VariantActiveBlock & IStringSerializable> extends VariantBlock { +public class VariantActiveBlock extends VariantBlock { private static final Int2ObjectMap> ACTIVE_BLOCKS = new Int2ObjectOpenHashMap<>(); private static final ReadWriteLock ACTIVE_BLOCKS_LOCK = new ReentrantReadWriteLock(); diff --git a/src/main/java/gregtech/api/block/VariantBlock.java b/src/main/java/gregtech/api/block/VariantBlock.java index f50823b8cfc..45e92af9e5d 100644 --- a/src/main/java/gregtech/api/block/VariantBlock.java +++ b/src/main/java/gregtech/api/block/VariantBlock.java @@ -6,6 +6,8 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.properties.PropertyHelper; +import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; @@ -26,9 +28,9 @@ import java.util.Collections; import java.util.List; -public class VariantBlock & IStringSerializable> extends Block { +public class VariantBlock> extends Block { - protected PropertyEnum VARIANT; + protected PropertyHelper VARIANT; protected T[] VALUES; public VariantBlock(@NotNull Material materialIn) { diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 2496bba9267..49cd1af34dc 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -1,5 +1,6 @@ package gregtech.common.blocks; +import gregtech.api.GTValues; import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.block.VariantActiveBlock; import gregtech.api.block.VariantItemBlock; @@ -58,12 +59,12 @@ public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn IBlockState stackState = itemBlock.getBlockState(itemStack); CoilType coilType = getState(stackState); - lines.add(I18n.format("tile.wire_coil.tooltip_heat", coilType.coilTemperature)); + lines.add(I18n.format("tile.wire_coil.tooltip_heat", coilType.getCoilTemperature())); if (TooltipHelper.isShiftDown()) { - int coilTier = coilType.ordinal(); + int coilTier = coilType.getTier(); lines.add(I18n.format("tile.wire_coil.tooltip_smelter")); - lines.add(I18n.format("tile.wire_coil.tooltip_parallel_smelter", coilType.level * 32)); + lines.add(I18n.format("tile.wire_coil.tooltip_parallel_smelter", coilType.getLevel() * 32)); int EUt = MetaTileEntityMultiSmelter.getEUtForParallel( MetaTileEntityMultiSmelter.getMaxParallel(coilType.getLevel()), coilType.getEnergyDiscount()); lines.add(I18n.format("tile.wire_coil.tooltip_energy_smelter", EUt)); @@ -87,69 +88,139 @@ protected boolean isBloomEnabled(CoilType value) { return ConfigHolder.client.coilsActiveEmissiveTextures; } - public enum CoilType implements IStringSerializable, IHeatingCoilBlockStats { + public static abstract class CoilType implements IStringSerializable, IHeatingCoilBlockStats { + + public static final CoilType CUPRONICKEL = coilType(Materials.Cupronickel) + .tier(GTValues.LV) + .coilTemp(1800) + .multiSmelter(1, 1) + .build(); + + public static final CoilType KANTHAL = coilType(Materials.Kanthal) + .tier(GTValues.MV) + .coilTemp(2700) + .multiSmelter(2, 1) + .build(); + + public static final CoilType NICHROME = coilType(Materials.Nichrome) + .tier(GTValues.HV) + .coilTemp(3600) + .multiSmelter(2, 2) + .build(); + + public static final CoilType RTM_ALLOY = coilType(Materials.RTMAlloy) + .tier(GTValues.EV) + .coilTemp(4500) + .multiSmelter(4, 2) + .build(); + + public static final CoilType HSS_G = coilType(Materials.HSSG) + .tier(GTValues.IV) + .coilTemp(5400) + .multiSmelter(4, 4) + .build(); + + public static final CoilType NAQUADAH = coilType(Materials.Naquadah) + .tier(GTValues.LuV) + .coilTemp(7200) + .multiSmelter(8, 8) + .build(); + + public static final CoilType TRINIUM = coilType(Materials.Trinium) + .tier(GTValues.ZPM) + .coilTemp(9001) + .multiSmelter(8, 8) + .build(); + + public static final CoilType TRITANIUM = coilType(Materials.Tritanium) + .tier(GTValues.UV) + .coilTemp(10800) + .multiSmelter(16, 8) + .build(); + + public static Builder coilType(Material material) { + return new Builder(material); + } - CUPRONICKEL("cupronickel", 1800, 1, 1, Materials.Cupronickel), - KANTHAL("kanthal", 2700, 2, 1, Materials.Kanthal), - NICHROME("nichrome", 3600, 2, 2, Materials.Nichrome), - RTM_ALLOY("rtm_alloy", 4500, 4, 2, Materials.RTMAlloy), - HSS_G("hss_g", 5400, 4, 4, Materials.HSSG), - NAQUADAH("naquadah", 7200, 8, 4, Materials.Naquadah), - TRINIUM("trinium", 9001, 8, 8, Materials.Trinium), - TRITANIUM("tritanium", 10800, 16, 8, Materials.Tritanium); + public static Builder coilType(String name) { + return new Builder(name); + } + } + public static class Builder { private final String name; // electric blast furnace properties - private final int coilTemperature; + private int coilTemperature; // multi smelter properties - private final int level; - private final int energyDiscount; + private int level; + private int energyDiscount; + private int tier; private final Material material; - CoilType(String name, int coilTemperature, int level, int energyDiscount, Material material) { - this.name = name; - this.coilTemperature = coilTemperature; - this.level = level; - this.energyDiscount = energyDiscount; + private Builder(Material material) { this.material = material; + this.name = material.getResourceLocation().getPath(); } - @NotNull - @Override - public String getName() { - return this.name; - } - - @Override - public int getCoilTemperature() { - return coilTemperature; - } - - @Override - public int getLevel() { - return level; + private Builder(String name) { + this.name = name; + this.material = null; } - @Override - public int getEnergyDiscount() { - return energyDiscount; + public Builder coilTemp(int coilTemperature) { + this.coilTemperature = coilTemperature; + return this; } - @Override - public int getTier() { - return this.ordinal(); + public Builder tier(int tier) { + this.tier = Math.max(0, 1 - tier); + return this; } - @Nullable - @Override - public Material getMaterial() { - return material; + public Builder multiSmelter(int level, int energyDiscount) { + this.level = level; + this.energyDiscount = energyDiscount; + return this; } - @NotNull - @Override - public String toString() { - return getName(); + public CoilType build() { + return new CoilType() { + + @Override + public @NotNull String getName() { + return name; + } + + @Override + public int getCoilTemperature() { + return coilTemperature; + } + + @Override + public int getLevel() { + return level; + } + + @Override + public int getEnergyDiscount() { + return energyDiscount; + } + + @Override + public int getTier() { + return tier; + } + + @Override + public @Nullable Material getMaterial() { + return material; + } + + @Override + public String toString() { + return getName(); + } + }; } } } From a072f52043e8d2044c38f0fc93c50d9efd3dcba5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 8 Mar 2025 02:54:58 -0700 Subject: [PATCH 02/23] rework VariantBlock with new property register coils to a list remove StoneVariantBlock property --- .../api/block/VariantActiveBlock.java | 25 ++-- .../java/gregtech/api/block/VariantBlock.java | 125 +++++++++++++++--- .../gregtech/api/block/VariantItemBlock.java | 3 +- .../gregtech/common/blocks/BlockWireCoil.java | 41 +++++- .../common/blocks/StoneVariantBlock.java | 13 -- src/main/java/gregtech/core/CoreModule.java | 2 +- 6 files changed, 160 insertions(+), 49 deletions(-) diff --git a/src/main/java/gregtech/api/block/VariantActiveBlock.java b/src/main/java/gregtech/api/block/VariantActiveBlock.java index eb059561bd9..1f55b6064da 100644 --- a/src/main/java/gregtech/api/block/VariantActiveBlock.java +++ b/src/main/java/gregtech/api/block/VariantActiveBlock.java @@ -5,10 +5,11 @@ import gregtech.client.utils.BloomEffectUtil; import gregtech.common.ConfigHolder; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; + import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; -import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; @@ -32,14 +33,14 @@ import org.jetbrains.annotations.NotNull; import team.chisel.ctm.client.state.CTMExtendedState; -import java.util.EnumMap; +import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; -public class VariantActiveBlock extends VariantBlock { +public abstract class VariantActiveBlock> extends VariantBlock { private static final Int2ObjectMap> ACTIVE_BLOCKS = new Int2ObjectOpenHashMap<>(); private static final ReadWriteLock ACTIVE_BLOCKS_LOCK = new ReentrantReadWriteLock(); @@ -113,16 +114,15 @@ public int getMetaFromState(IBlockState state) { if (state.getValue(ACTIVE_DEPRECATED)) { meta += 8; } - return meta + state.getValue(VARIANT).ordinal(); + return meta + state.getValue(VARIANT); } @NotNull @Override protected BlockStateContainer createBlockState() { - Class enumClass = getActualTypeParameter(getClass(), VariantActiveBlock.class); - this.VARIANT = PropertyEnum.create("variant", enumClass); - this.VALUES = enumClass.getEnumConstants(); - return new ExtendedBlockState(this, new IProperty[] { VARIANT, ACTIVE_DEPRECATED }, + super.createBlockState(); + return new ExtendedBlockState(this, + new IProperty[] { VARIANT, ACTIVE_DEPRECATED }, new IUnlistedProperty[] { ACTIVE }); } @@ -144,17 +144,18 @@ public IExtendedBlockState getExtendedState(@NotNull IBlockState state, @NotNull @SideOnly(Side.CLIENT) public void onModelRegister() { - Map models = new EnumMap<>(VALUES[0].getDeclaringClass()); + Int2ObjectMap models = new Int2ObjectArrayMap<>(); for (T value : VALUES) { + int index = VARIANT.getIndexOf(value); ModelResourceLocation inactiveModel = model(false, value); ModelResourceLocation activeModel = model(true, value); ActiveVariantBlockBakedModel model = new ActiveVariantBlockBakedModel(inactiveModel, activeModel, () -> isBloomEnabled(value)); - models.put(value, model.getModelLocation()); + models.put(index, model.getModelLocation()); Item item = Item.getItemFromBlock(this); - ModelLoader.setCustomModelResourceLocation(item, value.ordinal(), inactiveModel); + ModelLoader.setCustomModelResourceLocation(item, index, inactiveModel); ModelLoader.registerItemVariants(item, activeModel); } ModelLoader.setCustomStateMapper(this, @@ -166,7 +167,7 @@ public void onModelRegister() { private ModelResourceLocation model(boolean active, T variant) { return new ModelResourceLocation( Objects.requireNonNull(getRegistryName()), - "active=" + active + ",variant=" + VARIANT.getName(variant)); + "active=" + active + ",variant=" + variant.getName()); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/api/block/VariantBlock.java b/src/main/java/gregtech/api/block/VariantBlock.java index 45e92af9e5d..35a4a71f698 100644 --- a/src/main/java/gregtech/api/block/VariantBlock.java +++ b/src/main/java/gregtech/api/block/VariantBlock.java @@ -5,9 +5,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyHelper; -import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; @@ -20,17 +18,26 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.google.common.base.Optional; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Array; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.List; -public class VariantBlock> extends Block { +public abstract class VariantBlock> extends Block + { - protected PropertyHelper VARIANT; + protected PropertyIntMap VARIANT; protected T[] VALUES; public VariantBlock(@NotNull Material materialIn) { @@ -44,7 +51,7 @@ public VariantBlock(@NotNull Material materialIn) { } } setCreativeTab(GTCreativeTabs.TAB_GREGTECH); - setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, VALUES[0])); + setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, 0)); } @Override @@ -55,11 +62,11 @@ public void getSubBlocks(@NotNull CreativeTabs tab, @NotNull NonNullList enumClass = getActualTypeParameter(getClass(), VariantBlock.class); - this.VARIANT = PropertyEnum.create("variant", enumClass); - this.VALUES = enumClass.getEnumConstants(); + this.VARIANT = new PropertyIntMap<>("variant", computeVariants()); + this.VALUES = VARIANT.getValues(); return new BlockStateContainer(this, VARIANT); } + @NotNull + protected Collection computeVariants() { + Class enumClass = null; + for (Class innerClazz : getClass().getClasses()) { + var enums = innerClazz.getEnumConstants(); + if (enums != null && enums[0] instanceof IStringSerializable) { + // noinspection unchecked + enumClass = (Class) innerClazz; + break; + } + } + if (enumClass == null) { + enumClass = getActualTypeParameter(getClass(), VariantBlock.class);; + } + return Arrays.asList(enumClass.getEnumConstants()); + } + @Override @SideOnly(Side.CLIENT) public void addInformation(@NotNull ItemStack stack, @Nullable World player, @NotNull List tooltip, @@ -106,12 +129,12 @@ public int damageDropped(@NotNull IBlockState state) { @Override @SuppressWarnings("deprecation") public IBlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(VARIANT, VALUES[meta % VALUES.length]); + return getDefaultState().withProperty(VARIANT, meta % VALUES.length); } @Override public int getMetaFromState(IBlockState state) { - return state.getValue(VARIANT).ordinal(); + return state.getValue(VARIANT); } // magic is here @@ -119,13 +142,85 @@ public int getMetaFromState(IBlockState state) { protected static Class getActualTypeParameter(Class thisClass, Class declaringClass) { Type type = thisClass.getGenericSuperclass(); - while (!(type instanceof ParameterizedType) || ((ParameterizedType) type).getRawType() != declaringClass) { + while (!(type instanceof ParameterizedType pType) || pType.getRawType() != declaringClass) { if (type instanceof ParameterizedType) { type = ((Class) ((ParameterizedType) type).getRawType()).getGenericSuperclass(); } else { type = ((Class) type).getGenericSuperclass(); } } - return (Class) ((ParameterizedType) type).getActualTypeArguments()[0]; + var arg = pType.getActualTypeArguments()[0]; + if (!(arg instanceof Class)) { + throw new ClassCastException(String.format("cannot cast %s to a class!", arg)); + } + return (Class) pType.getActualTypeArguments()[0]; + } + + protected static class PropertyIntMap & IStringSerializable> extends PropertyHelper { + + private final Int2ObjectMap intMap; + private final Object2IntMap reverse; + private final O[] allowedObjects; + + @SuppressWarnings("unchecked") + protected PropertyIntMap(String name, Collection values) { + super(name, Integer.class); + if (values.isEmpty()) throw new IllegalArgumentException("values are empty!"); + + this.intMap = new Int2ObjectArrayMap<>(values.size()); + this.reverse = new Object2IntArrayMap<>(values.size()); + + O first = values.iterator().next(); + this.allowedObjects = (O[]) Array.newInstance(first.getClass(), values.size()); + + for (O value : values) { + int size = this.intMap.size(); + this.allowedObjects[size] = value; + this.intMap.put(size, value); + this.reverse.put(value, size); + } + } + + @Override + public @NotNull Collection getAllowedValues() { + return this.intMap.keySet(); + } + + public @NotNull O[] getValues() { + return this.allowedObjects; + } + + @Override + @Deprecated + public @NotNull String getName(@NotNull Integer value) { + return getNameByInt(value); + } + + public @NotNull String getNameByInt(int value) { + return getValue(value).getName(); + } + + @Override + public @NotNull Optional parseValue(@NotNull String value) { + for (O object : reverse.keySet()) { + if (object.getName().equals(value)) { + return Optional.of(getIndexOf(object)); + } + } + return Optional.absent(); + } + + @Override + public int hashCode() { + return 31 * super.hashCode() + this.allowedObjects.hashCode(); + } + + public int getIndexOf(O value) { + return this.reverse.getInt(value); + } + + public O getValue(int index) { + return this.intMap.get(index); + } } } diff --git a/src/main/java/gregtech/api/block/VariantItemBlock.java b/src/main/java/gregtech/api/block/VariantItemBlock.java index 62bf5a561a2..47bfa90a68e 100644 --- a/src/main/java/gregtech/api/block/VariantItemBlock.java +++ b/src/main/java/gregtech/api/block/VariantItemBlock.java @@ -7,7 +7,8 @@ import org.jetbrains.annotations.NotNull; -public class VariantItemBlock & IStringSerializable, T extends VariantBlock> extends ItemBlock { +public class VariantItemBlock, T extends VariantBlock> + extends ItemBlock { private final T genericBlock; diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 49cd1af34dc..aabb1a47dcd 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -7,9 +7,11 @@ import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; +import gregtech.api.util.GTUtility; import gregtech.client.utils.TooltipHelper; import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; +import gregtech.core.unification.material.internal.MaterialRegistryManager; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; @@ -19,6 +21,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -28,6 +31,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; public class BlockWireCoil extends VariantActiveBlock { @@ -48,6 +54,11 @@ public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.SOLID; } + @Override + protected @NotNull Collection computeVariants() { + return Collections.unmodifiableCollection(CoilType.REGISTERED_TYPES); + } + @Override @SideOnly(Side.CLIENT) public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn, @NotNull List lines, @@ -88,14 +99,16 @@ protected boolean isBloomEnabled(CoilType value) { return ConfigHolder.client.coilsActiveEmissiveTextures; } - public static abstract class CoilType implements IStringSerializable, IHeatingCoilBlockStats { + public static abstract class CoilType implements IStringSerializable, IHeatingCoilBlockStats, Comparable { - public static final CoilType CUPRONICKEL = coilType(Materials.Cupronickel) + public static final List REGISTERED_TYPES = new ArrayList<>(); + + public static final CoilType CUPRONICKEL = coilType("cupronickel") .tier(GTValues.LV) .coilTemp(1800) .multiSmelter(1, 1) .build(); - + public static final CoilType KANTHAL = coilType(Materials.Kanthal) .tier(GTValues.MV) .coilTemp(2700) @@ -142,12 +155,26 @@ public static Builder coilType(Material material) { return new Builder(material); } - public static Builder coilType(String name) { - return new Builder(name); + public static Builder coilType(String material) { + return coilType(GTUtility.gregtechId(material)); + } + + public static Builder coilType(ResourceLocation material) { + return new Builder(material.getPath(), material.toString()); + } + + public CoilType() { + REGISTERED_TYPES.add(this); + } + + @Override + public int compareTo(@NotNull BlockWireCoil.CoilType o) { + return Integer.compare(o.getTier(), getTier()); } } public static class Builder { + private final String name; // electric blast furnace properties private int coilTemperature; @@ -162,9 +189,9 @@ private Builder(Material material) { this.name = material.getResourceLocation().getPath(); } - private Builder(String name) { + private Builder(String name, String material) { this.name = name; - this.material = null; + this.material = MaterialRegistryManager.getInstance().getMaterial(material); } public Builder coilTemp(int coilTemperature) { diff --git a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java index 72fcb6d5180..aa970497383 100644 --- a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java +++ b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java @@ -9,8 +9,6 @@ import net.minecraft.block.SoundType; import net.minecraft.block.material.MapColor; -import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLiving; import net.minecraft.item.Item; @@ -25,9 +23,6 @@ @SuppressWarnings("deprecation") public class StoneVariantBlock extends VariantBlock { - // shared property instance - private static final PropertyEnum PROPERTY = PropertyEnum.create("variant", StoneType.class); - private final StoneVariant stoneVariant; public StoneVariantBlock(@NotNull StoneVariant stoneVariant) { @@ -43,14 +38,6 @@ public StoneVariantBlock(@NotNull StoneVariant stoneVariant) { setCreativeTab(GTCreativeTabs.TAB_GREGTECH_DECORATIONS); } - @NotNull - @Override - protected BlockStateContainer createBlockState() { - this.VARIANT = PROPERTY; - this.VALUES = StoneType.values(); - return new BlockStateContainer(this, VARIANT); - } - @Override public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, @NotNull EntityLiving.SpawnPlacementType type) { diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index 6ea9f2a3d94..5cc07391f8b 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -215,7 +215,7 @@ public void preInit(FMLPreInitializationEvent event) { MetaEntities.init(); /* Start API Block Registration */ - for (BlockWireCoil.CoilType type : BlockWireCoil.CoilType.values()) { + for (BlockWireCoil.CoilType type : BlockWireCoil.CoilType.REGISTERED_TYPES) { HEATING_COILS.put(MetaBlocks.WIRE_COIL.getState(type), type); } for (BlockBatteryPart.BatteryPartType type : BlockBatteryPart.BatteryPartType.values()) { From 7c3ad81f154c535269d0206f32312b08ac6b607c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 8 Mar 2025 03:20:56 -0700 Subject: [PATCH 03/23] can't actually add coil types here, since meta limit --- .../api/block/VariantActiveBlock.java | 5 +--- .../java/gregtech/api/block/VariantBlock.java | 6 ++-- .../gregtech/common/blocks/BlockWireCoil.java | 29 +++++++++---------- src/main/java/gregtech/core/CoreModule.java | 2 +- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/main/java/gregtech/api/block/VariantActiveBlock.java b/src/main/java/gregtech/api/block/VariantActiveBlock.java index 1f55b6064da..a568dd42b0a 100644 --- a/src/main/java/gregtech/api/block/VariantActiveBlock.java +++ b/src/main/java/gregtech/api/block/VariantActiveBlock.java @@ -5,8 +5,6 @@ import gregtech.client.utils.BloomEffectUtil; import gregtech.common.ConfigHolder; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; - import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; @@ -26,6 +24,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; @@ -33,8 +32,6 @@ import org.jetbrains.annotations.NotNull; import team.chisel.ctm.client.state.CTMExtendedState; -import java.util.HashMap; -import java.util.Map; import java.util.Objects; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; diff --git a/src/main/java/gregtech/api/block/VariantBlock.java b/src/main/java/gregtech/api/block/VariantBlock.java index 35a4a71f698..db18119ca73 100644 --- a/src/main/java/gregtech/api/block/VariantBlock.java +++ b/src/main/java/gregtech/api/block/VariantBlock.java @@ -34,8 +34,7 @@ import java.util.Collections; import java.util.List; -public abstract class VariantBlock> extends Block - { +public abstract class VariantBlock> extends Block { protected PropertyIntMap VARIANT; protected T[] VALUES; @@ -156,7 +155,8 @@ protected static Class getActualTypeParameter(Class thisC return (Class) pType.getActualTypeArguments()[0]; } - protected static class PropertyIntMap & IStringSerializable> extends PropertyHelper { + protected static class PropertyIntMap & IStringSerializable> + extends PropertyHelper { private final Int2ObjectMap intMap; private final Object2IntMap reverse; diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index aabb1a47dcd..bd3a3ef5765 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -7,11 +7,9 @@ import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; -import gregtech.api.util.GTUtility; import gregtech.client.utils.TooltipHelper; import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; -import gregtech.core.unification.material.internal.MaterialRegistryManager; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; @@ -21,7 +19,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -56,7 +53,7 @@ public BlockRenderLayer getRenderLayer() { @Override protected @NotNull Collection computeVariants() { - return Collections.unmodifiableCollection(CoilType.REGISTERED_TYPES); + return Collections.unmodifiableCollection(CoilType.COIL_TYPES); } @Override @@ -99,11 +96,15 @@ protected boolean isBloomEnabled(CoilType value) { return ConfigHolder.client.coilsActiveEmissiveTextures; } + public static List getCoilTypes() { + return Collections.unmodifiableList(CoilType.COIL_TYPES); + } + public static abstract class CoilType implements IStringSerializable, IHeatingCoilBlockStats, Comparable { - public static final List REGISTERED_TYPES = new ArrayList<>(); + private static final List COIL_TYPES = new ArrayList<>(); - public static final CoilType CUPRONICKEL = coilType("cupronickel") + public static final CoilType CUPRONICKEL = coilType(Materials.Cupronickel) .tier(GTValues.LV) .coilTemp(1800) .multiSmelter(1, 1) @@ -127,7 +128,7 @@ public static abstract class CoilType implements IStringSerializable, IHeatingCo .multiSmelter(4, 2) .build(); - public static final CoilType HSS_G = coilType(Materials.HSSG) + public static final CoilType HSS_G = coilType("hss_g", Materials.HSSG) .tier(GTValues.IV) .coilTemp(5400) .multiSmelter(4, 4) @@ -155,16 +156,12 @@ public static Builder coilType(Material material) { return new Builder(material); } - public static Builder coilType(String material) { - return coilType(GTUtility.gregtechId(material)); - } - - public static Builder coilType(ResourceLocation material) { - return new Builder(material.getPath(), material.toString()); + public static Builder coilType(String name, Material material) { + return new Builder(name, material); } public CoilType() { - REGISTERED_TYPES.add(this); + COIL_TYPES.add(this); } @Override @@ -189,9 +186,9 @@ private Builder(Material material) { this.name = material.getResourceLocation().getPath(); } - private Builder(String name, String material) { + private Builder(String name, Material material) { + this.material = material; this.name = name; - this.material = MaterialRegistryManager.getInstance().getMaterial(material); } public Builder coilTemp(int coilTemperature) { diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index 5cc07391f8b..f0cf02d35c0 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -215,7 +215,7 @@ public void preInit(FMLPreInitializationEvent event) { MetaEntities.init(); /* Start API Block Registration */ - for (BlockWireCoil.CoilType type : BlockWireCoil.CoilType.REGISTERED_TYPES) { + for (BlockWireCoil.CoilType type : BlockWireCoil.getCoilTypes()) { HEATING_COILS.put(MetaBlocks.WIRE_COIL.getState(type), type); } for (BlockBatteryPart.BatteryPartType type : BlockBatteryPart.BatteryPartType.values()) { From 995fceb28788ba243178c060bb4d0148dbea7b64 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 8 Mar 2025 15:17:34 -0700 Subject: [PATCH 04/23] make new blocks when over meta limit --- .../java/gregtech/api/block/VariantBlock.java | 1 + .../java/gregtech/common/CommonProxy.java | 3 ++- .../gregtech/common/blocks/BlockWireCoil.java | 12 +++++++++++- .../gregtech/common/blocks/MetaBlocks.java | 19 +++++++++++++++++-- src/main/java/gregtech/core/CoreModule.java | 7 +++++-- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/block/VariantBlock.java b/src/main/java/gregtech/api/block/VariantBlock.java index db18119ca73..dde94c8cbe4 100644 --- a/src/main/java/gregtech/api/block/VariantBlock.java +++ b/src/main/java/gregtech/api/block/VariantBlock.java @@ -166,6 +166,7 @@ protected static class PropertyIntMap & IStringSerializa protected PropertyIntMap(String name, Collection values) { super(name, Integer.class); if (values.isEmpty()) throw new IllegalArgumentException("values are empty!"); + if (values.size() > 16) throw new IllegalArgumentException("values cannot be greater than 16!"); this.intMap = new Int2ObjectArrayMap<>(values.size()); this.reverse = new Object2IntArrayMap<>(values.size()); diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 59055bb74e1..2c6d6139fd5 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -263,7 +263,8 @@ public static void registerItems(RegistryEvent.Register event) { registry.register(createItemBlock(STEAM_CASING, VariantItemBlock::new)); registry.register(createItemBlock(MULTIBLOCK_CASING, VariantItemBlock::new)); registry.register(createItemBlock(TRANSPARENT_CASING, VariantItemBlock::new)); - registry.register(createItemBlock(WIRE_COIL, VariantItemBlock::new)); + for (var coil : WIRE_COILS) + registry.register(createItemBlock(coil, VariantItemBlock::new)); registry.register(createItemBlock(FUSION_CASING, VariantItemBlock::new)); registry.register(createItemBlock(WARNING_SIGN, VariantItemBlock::new)); registry.register(createItemBlock(WARNING_SIGN_1, VariantItemBlock::new)); diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index bd3a3ef5765..2e881cd2ee0 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -35,6 +35,8 @@ public class BlockWireCoil extends VariantActiveBlock { + private static int index; + public BlockWireCoil() { super(net.minecraft.block.material.Material.IRON); setTranslationKey("wire_coil"); @@ -53,7 +55,9 @@ public BlockRenderLayer getRenderLayer() { @Override protected @NotNull Collection computeVariants() { - return Collections.unmodifiableCollection(CoilType.COIL_TYPES); + int min = 8 * index++; + int max = Math.min(min + 8, getCoilTypes().size()); + return Collections.unmodifiableCollection(getCoilTypes().subList(min, max)); } @Override @@ -152,6 +156,12 @@ public static abstract class CoilType implements IStringSerializable, IHeatingCo .multiSmelter(16, 8) .build(); + public static final CoilType NEUTRONIUM = coilType(Materials.Neutronium) + .tier(GTValues.UHV) + .coilTemp(17800) + .multiSmelter(32, 16) + .build(); + public static Builder coilType(Material material) { return new Builder(material); } diff --git a/src/main/java/gregtech/common/blocks/MetaBlocks.java b/src/main/java/gregtech/common/blocks/MetaBlocks.java index ed353717832..439a1b8c5b6 100644 --- a/src/main/java/gregtech/common/blocks/MetaBlocks.java +++ b/src/main/java/gregtech/common/blocks/MetaBlocks.java @@ -131,6 +131,7 @@ private MetaBlocks() {} public static BlockMultiblockCasing MULTIBLOCK_CASING; public static BlockGlassCasing TRANSPARENT_CASING; public static BlockWireCoil WIRE_COIL; + public static BlockWireCoil[] WIRE_COILS; public static BlockFusionCasing FUSION_CASING; public static BlockWarningSign WARNING_SIGN; public static BlockWarningSign1 WARNING_SIGN_1; @@ -247,8 +248,22 @@ public static void init() { MULTIBLOCK_CASING.setRegistryName("multiblock_casing"); TRANSPARENT_CASING = new BlockGlassCasing(); TRANSPARENT_CASING.setRegistryName("transparent_casing"); - WIRE_COIL = new BlockWireCoil(); - WIRE_COIL.setRegistryName("wire_coil"); + + // init coils + int size = BlockWireCoil.getCoilTypes().size(); + int coils = Math.floorDiv(size, 8) + 1; + WIRE_COILS = new BlockWireCoil[coils]; + for (int i = 0; i < coils; i++) { + if (i == 0) { + WIRE_COIL = new BlockWireCoil(); + WIRE_COIL.setRegistryName("wire_coil"); + WIRE_COILS[i] = WIRE_COIL; + } else { + WIRE_COILS[i] = new BlockWireCoil(); + WIRE_COILS[i].setRegistryName("wire_coil_" + i); + } + } + FUSION_CASING = new BlockFusionCasing(); FUSION_CASING.setRegistryName("fusion_casing"); WARNING_SIGN = new BlockWarningSign(); diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index f0cf02d35c0..e5536cd6666 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -97,6 +97,7 @@ import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Map; import static gregtech.api.GregTechAPI.*; @@ -215,8 +216,10 @@ public void preInit(FMLPreInitializationEvent event) { MetaEntities.init(); /* Start API Block Registration */ - for (BlockWireCoil.CoilType type : BlockWireCoil.getCoilTypes()) { - HEATING_COILS.put(MetaBlocks.WIRE_COIL.getState(type), type); + List coilTypes = BlockWireCoil.getCoilTypes(); + for (int i = 0; i < coilTypes.size(); i++) { + var type = coilTypes.get(i); + HEATING_COILS.put(MetaBlocks.WIRE_COILS[i / 8].getState(type), type); } for (BlockBatteryPart.BatteryPartType type : BlockBatteryPart.BatteryPartType.values()) { PSS_BATTERIES.put(MetaBlocks.BATTERY_BLOCK.getState(type), type); From 3b6175039f8b10d0ea3be238e22aaede274ce4a6 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:59:39 -0700 Subject: [PATCH 05/23] move to an event for registering new coils move harvest level into own method --- .../java/gregtech/api/block/VariantBlock.java | 15 +- .../java/gregtech/api/event/CoilEvent.java | 267 ++++++++++++++++++ .../java/gregtech/common/CommonProxy.java | 29 +- .../gregtech/common/blocks/BlockWireCoil.java | 118 ++++---- .../gregtech/common/blocks/MetaBlocks.java | 19 +- src/main/java/gregtech/core/CoreModule.java | 5 +- 6 files changed, 360 insertions(+), 93 deletions(-) create mode 100644 src/main/java/gregtech/api/event/CoilEvent.java diff --git a/src/main/java/gregtech/api/block/VariantBlock.java b/src/main/java/gregtech/api/block/VariantBlock.java index dde94c8cbe4..dbd418ee1c5 100644 --- a/src/main/java/gregtech/api/block/VariantBlock.java +++ b/src/main/java/gregtech/api/block/VariantBlock.java @@ -41,16 +41,19 @@ public abstract class VariantBlock public VariantBlock(@NotNull Material materialIn) { super(materialIn); - if (VALUES.length > 0 && VALUES[0] instanceof IStateHarvestLevel) { + updateHarvestLevels(); + setCreativeTab(GTCreativeTabs.TAB_GREGTECH); + setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, 0)); + } + + protected void updateHarvestLevels() { + if (VALUES.length > 0 && VALUES[0] instanceof IStateHarvestLevel stateHarvestLevel) { for (T t : VALUES) { - IStateHarvestLevel stateHarvestLevel = (IStateHarvestLevel) t; IBlockState state = getState(t); - setHarvestLevel(stateHarvestLevel.getHarvestTool(state), stateHarvestLevel.getHarvestLevel(state), - state); + setHarvestLevel(stateHarvestLevel.getHarvestTool(state), + stateHarvestLevel.getHarvestLevel(state), state); } } - setCreativeTab(GTCreativeTabs.TAB_GREGTECH); - setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, 0)); } @Override diff --git a/src/main/java/gregtech/api/event/CoilEvent.java b/src/main/java/gregtech/api/event/CoilEvent.java new file mode 100644 index 00000000000..443fe617a91 --- /dev/null +++ b/src/main/java/gregtech/api/event/CoilEvent.java @@ -0,0 +1,267 @@ +package gregtech.api.event; + +import gregtech.api.GTValues; +import gregtech.api.GregTechAPI; +import gregtech.api.block.IHeatingCoilBlockStats; +import gregtech.api.block.VariantActiveBlock; +import gregtech.api.block.VariantItemBlock; +import gregtech.api.items.toolitem.ToolClasses; +import gregtech.api.unification.material.Material; +import gregtech.api.unification.material.Materials; +import gregtech.api.util.GTUtility; +import gregtech.client.utils.TooltipHelper; +import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.EntityLiving; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.registries.IForgeRegistry; + +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; + +public abstract class CoilEvent extends Event { + + public static final int ACTIVE_META_LIMIT = 8; + + protected static final Object2ObjectMap> STATS = new Object2ObjectOpenHashMap<>(); + protected static final Object2ObjectMap BLOCKS = new Object2ObjectOpenHashMap<>(); + + public static void registerBlocks(IForgeRegistry registry) { + for (CustomCoilBlock[] value : BLOCKS.values()) { + for (CustomCoilBlock customCoilBlock : value) { + registry.register(createItemBlock(customCoilBlock, VariantItemBlock::new)); + } + } + } + + private static ItemBlock createItemBlock(T block, Function producer) { + ItemBlock itemBlock = producer.apply(block); + ResourceLocation registryName = block.getRegistryName(); + if (registryName == null) { + throw new IllegalArgumentException("Block " + block.getTranslationKey() + " has no registry name."); + } + itemBlock.setRegistryName(registryName); + return itemBlock; + } + + public static class Register extends CoilEvent { + + private static final AtomicReference> activeSublist = new AtomicReference<>(); + + public Builder addCoilType(ResourceLocation location) { + return new Builder(location); + } + + public Builder addCoilType(String modid, String path) { + return addCoilType(new ResourceLocation(modid, path)); + } + + public Builder addCoilType(String path) { + return addCoilType(GTUtility.gregtechId(path)); + } + + public void register(ResourceLocation location) { + List variants = STATS.get(location); + if (variants.isEmpty()) + throw new IllegalArgumentException("Variants is empty!"); + + int blocks = (variants.size() / ACTIVE_META_LIMIT) + 1; + CustomCoilBlock[] customCoilBlocks = new CustomCoilBlock[blocks]; + Arrays.setAll(customCoilBlocks, value -> createBlock(value, location, variants)); + BLOCKS.put(location, customCoilBlocks); + } + + private CustomCoilBlock createBlock(int index, ResourceLocation location, List variants) { + int metaIndex = index / ACTIVE_META_LIMIT; + int from = 8 * metaIndex; + int to = Math.min(from + 8, variants.size()); + List subList = variants.subList(from, to); + activeSublist.set(subList); + var block = new CustomCoilBlock(); + for (var stat : subList) { + GregTechAPI.HEATING_COILS.put(block.getState(stat), stat); + } + activeSublist.set(null); + block.setRegistryName(location); + return block; + } + } + + public static class Modify extends CoilEvent { + + } + + public static class Builder { + + private final ResourceLocation location; + private final CustomCoilStats stats; + + private Builder(ResourceLocation location) { + this.location = location; + this.stats = new CustomCoilStats(); + } + + public Builder material(Material material) { + stats.material = material; + stats.name = material.getResourceLocation().getPath(); + return this; + } + + public Builder coilTemp(int coilTemperature) { + stats.coilTemperature = coilTemperature; + return this; + } + + public Builder tier(int tier) { + stats.tier = Math.max(0, tier); + return this; + } + + public Builder multiSmelter(int level, int energyDiscount) { + stats.level = level; + stats.energyDiscount = energyDiscount; + return this; + } + + public void register() { + if (!STATS.containsKey(this.location)) + STATS.put(location, new ArrayList<>(ACTIVE_META_LIMIT)); + + STATS.get(this.location).add(this.stats); + } + } + + public static final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable, + IStringSerializable { + + private String name; + + // electric blast furnace properties + private int coilTemperature = -1; + + // multi smelter properties + private int level = -1; + private int energyDiscount = 0; + + // voltage tier + private int tier = GTValues.ULV; + + private Material material = Materials.Iron; + + private CustomCoilStats() {} + + @Override + public @NotNull String getName() { + return name; + } + + @Override + public int getCoilTemperature() { + return coilTemperature; + } + + @Override + public int getLevel() { + return level; + } + + @Override + public int getEnergyDiscount() { + return energyDiscount; + } + + @Override + public int getTier() { + return tier; + } + + @Override + public @Nullable Material getMaterial() { + return material; + } + + @Override + public int compareTo(@NotNull CustomCoilStats o) { + // todo add more comparisons? + return Integer.compare(o.getTier(), this.getTier()); + } + } + + public static final class CustomCoilBlock extends VariantActiveBlock { + + public CustomCoilBlock() { + super(net.minecraft.block.material.Material.IRON); + setTranslationKey("wire_coil"); + setHardness(5.0f); + setResistance(10.0f); + setSoundType(SoundType.METAL); + setHarvestLevel(ToolClasses.WRENCH, 2); + setDefaultState(getState(VALUES[0])); + } + + @Override + protected @NotNull Collection computeVariants() { + return Register.activeSublist.get(); // stupid super constructor nonsense + } + + @Override + public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, + @NotNull EntityLiving.SpawnPlacementType type) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn, @NotNull List lines, + @NotNull ITooltipFlag tooltipFlag) { + super.addInformation(itemStack, worldIn, lines, tooltipFlag); + + // noinspection rawtypes, unchecked + VariantItemBlock itemBlock = (VariantItemBlock) itemStack.getItem(); + IBlockState stackState = itemBlock.getBlockState(itemStack); + IHeatingCoilBlockStats coilType = getState(stackState); + + lines.add(I18n.format("tile.wire_coil.tooltip_heat", coilType.getCoilTemperature())); + + if (TooltipHelper.isShiftDown()) { + int coilTier = coilType.getTier(); + lines.add(I18n.format("tile.wire_coil.tooltip_smelter")); + lines.add(I18n.format("tile.wire_coil.tooltip_parallel_smelter", coilType.getLevel() * 32)); + int EUt = MetaTileEntityMultiSmelter.getEUtForParallel( + MetaTileEntityMultiSmelter.getMaxParallel(coilType.getLevel()), coilType.getEnergyDiscount()); + lines.add(I18n.format("tile.wire_coil.tooltip_energy_smelter", EUt)); + lines.add(I18n.format("tile.wire_coil.tooltip_pyro")); + lines.add( + I18n.format("tile.wire_coil.tooltip_speed_pyro", coilTier == GTValues.LV ? 75 : 50 * coilTier)); + lines.add(I18n.format("tile.wire_coil.tooltip_cracking")); + lines.add(I18n.format("tile.wire_coil.tooltip_energy_cracking", 100 - 10 * (coilTier - 1))); + } else { + lines.add(I18n.format("tile.wire_coil.tooltip_extended_info")); + } + } + } +} diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 2c6d6139fd5..7cfdd9aac93 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -4,6 +4,7 @@ import gregtech.api.GregTechAPI; import gregtech.api.block.VariantItemBlock; import gregtech.api.block.machines.MachineItemBlock; +import gregtech.api.event.CoilEvent; import gregtech.api.items.metaitem.MetaItem; import gregtech.api.items.toolitem.IGTTool; import gregtech.api.metatileentity.registry.MTERegistry; @@ -12,6 +13,7 @@ import gregtech.api.recipes.ingredients.GTRecipeOreInput; import gregtech.api.recipes.properties.impl.FusionEUToStartProperty; 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.DustProperty; import gregtech.api.unification.material.properties.PropertyKey; @@ -21,6 +23,7 @@ import gregtech.api.unification.stack.ItemMaterialInfo; import gregtech.api.util.AssemblyLineManager; import gregtech.api.util.GTLog; +import gregtech.api.util.GTUtility; import gregtech.common.blocks.BlockCompressed; import gregtech.common.blocks.BlockFrame; import gregtech.common.blocks.BlockLamp; @@ -218,6 +221,26 @@ public static void registerBlocksLast(RegistryEvent.Register event) { FLUID_BLOCKS.forEach(event.getRegistry()::register); } + // todo REMOVE, THIS IS FOR TESTING + @SubscribeEvent + public static void registerCoils(CoilEvent.Register event) { + event.addCoilType("custom_coil") + .coilTemp(42069) + .tier(GTValues.UHV) + .multiSmelter(69, 98) + .material(Materials.Chlorine) + .register(); + + event.addCoilType("custom_coil") + .coilTemp(696969) + .tier(GTValues.UHV) + .multiSmelter(69, 99) + .material(Materials.Neutronium) + .register(); + + event.register(GTUtility.gregtechId("custom_coil")); + } + @SubscribeEvent public static void registerItems(RegistryEvent.Register event) { GTLog.logger.info("Registering Items..."); @@ -263,8 +286,10 @@ public static void registerItems(RegistryEvent.Register event) { registry.register(createItemBlock(STEAM_CASING, VariantItemBlock::new)); registry.register(createItemBlock(MULTIBLOCK_CASING, VariantItemBlock::new)); registry.register(createItemBlock(TRANSPARENT_CASING, VariantItemBlock::new)); - for (var coil : WIRE_COILS) - registry.register(createItemBlock(coil, VariantItemBlock::new)); + + MinecraftForge.EVENT_BUS.post(new CoilEvent.Register()); + CoilEvent.registerBlocks(registry); + registry.register(createItemBlock(WIRE_COIL, VariantItemBlock::new)); registry.register(createItemBlock(FUSION_CASING, VariantItemBlock::new)); registry.register(createItemBlock(WARNING_SIGN, VariantItemBlock::new)); registry.register(createItemBlock(WARNING_SIGN_1, VariantItemBlock::new)); diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 2e881cd2ee0..934fdc9d7b4 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -8,7 +8,6 @@ import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; import gregtech.client.utils.TooltipHelper; -import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; import net.minecraft.block.SoundType; @@ -35,8 +34,6 @@ public class BlockWireCoil extends VariantActiveBlock { - private static int index; - public BlockWireCoil() { super(net.minecraft.block.material.Material.IRON); setTranslationKey("wire_coil"); @@ -55,9 +52,7 @@ public BlockRenderLayer getRenderLayer() { @Override protected @NotNull Collection computeVariants() { - int min = 8 * index++; - int max = Math.min(min + 8, getCoilTypes().size()); - return Collections.unmodifiableCollection(getCoilTypes().subList(min, max)); + return getCoilTypes(); } @Override @@ -95,11 +90,6 @@ public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAcces return false; } - @Override - protected boolean isBloomEnabled(CoilType value) { - return ConfigHolder.client.coilsActiveEmissiveTextures; - } - public static List getCoilTypes() { return Collections.unmodifiableList(CoilType.COIL_TYPES); } @@ -108,59 +98,57 @@ public static abstract class CoilType implements IStringSerializable, IHeatingCo private static final List COIL_TYPES = new ArrayList<>(); - public static final CoilType CUPRONICKEL = coilType(Materials.Cupronickel) - .tier(GTValues.LV) - .coilTemp(1800) - .multiSmelter(1, 1) - .build(); - - public static final CoilType KANTHAL = coilType(Materials.Kanthal) - .tier(GTValues.MV) - .coilTemp(2700) - .multiSmelter(2, 1) - .build(); - - public static final CoilType NICHROME = coilType(Materials.Nichrome) - .tier(GTValues.HV) - .coilTemp(3600) - .multiSmelter(2, 2) - .build(); - - public static final CoilType RTM_ALLOY = coilType(Materials.RTMAlloy) - .tier(GTValues.EV) - .coilTemp(4500) - .multiSmelter(4, 2) - .build(); - - public static final CoilType HSS_G = coilType("hss_g", Materials.HSSG) - .tier(GTValues.IV) - .coilTemp(5400) - .multiSmelter(4, 4) - .build(); - - public static final CoilType NAQUADAH = coilType(Materials.Naquadah) - .tier(GTValues.LuV) - .coilTemp(7200) - .multiSmelter(8, 8) - .build(); - - public static final CoilType TRINIUM = coilType(Materials.Trinium) - .tier(GTValues.ZPM) - .coilTemp(9001) - .multiSmelter(8, 8) - .build(); - - public static final CoilType TRITANIUM = coilType(Materials.Tritanium) - .tier(GTValues.UV) - .coilTemp(10800) - .multiSmelter(16, 8) - .build(); - - public static final CoilType NEUTRONIUM = coilType(Materials.Neutronium) - .tier(GTValues.UHV) - .coilTemp(17800) - .multiSmelter(32, 16) - .build(); + public static final CoilType CUPRONICKEL; + public static final CoilType KANTHAL; + public static final CoilType NICHROME; + public static final CoilType RTM_ALLOY; + public static final CoilType HSS_G; + public static final CoilType NAQUADAH; + public static final CoilType TRINIUM; + public static final CoilType TRITANIUM; + + static { + CUPRONICKEL = coilType(Materials.Cupronickel) + .tier(GTValues.LV) + .coilTemp(1800) + .multiSmelter(1, 1) + .build(); + KANTHAL = coilType(Materials.Kanthal) + .tier(GTValues.MV) + .coilTemp(2700) + .multiSmelter(2, 1) + .build(); + NICHROME = coilType(Materials.Nichrome) + .tier(GTValues.HV) + .coilTemp(3600) + .multiSmelter(2, 2) + .build(); + RTM_ALLOY = coilType(Materials.RTMAlloy) + .tier(GTValues.EV) + .coilTemp(4500) + .multiSmelter(4, 2) + .build(); + HSS_G = coilType("hss_g", Materials.HSSG) + .tier(GTValues.IV) + .coilTemp(5400) + .multiSmelter(4, 4) + .build(); + NAQUADAH = coilType(Materials.Naquadah) + .tier(GTValues.LuV) + .coilTemp(7200) + .multiSmelter(8, 8) + .build(); + TRINIUM = coilType(Materials.Trinium) + .tier(GTValues.ZPM) + .coilTemp(9001) + .multiSmelter(8, 8) + .build(); + TRITANIUM = coilType(Materials.Tritanium) + .tier(GTValues.UV) + .coilTemp(10800) + .multiSmelter(16, 8) + .build(); + } public static Builder coilType(Material material) { return new Builder(material); @@ -207,7 +195,7 @@ public Builder coilTemp(int coilTemperature) { } public Builder tier(int tier) { - this.tier = Math.max(0, 1 - tier); + this.tier = Math.max(0, tier); return this; } diff --git a/src/main/java/gregtech/common/blocks/MetaBlocks.java b/src/main/java/gregtech/common/blocks/MetaBlocks.java index 439a1b8c5b6..ed353717832 100644 --- a/src/main/java/gregtech/common/blocks/MetaBlocks.java +++ b/src/main/java/gregtech/common/blocks/MetaBlocks.java @@ -131,7 +131,6 @@ private MetaBlocks() {} public static BlockMultiblockCasing MULTIBLOCK_CASING; public static BlockGlassCasing TRANSPARENT_CASING; public static BlockWireCoil WIRE_COIL; - public static BlockWireCoil[] WIRE_COILS; public static BlockFusionCasing FUSION_CASING; public static BlockWarningSign WARNING_SIGN; public static BlockWarningSign1 WARNING_SIGN_1; @@ -248,22 +247,8 @@ public static void init() { MULTIBLOCK_CASING.setRegistryName("multiblock_casing"); TRANSPARENT_CASING = new BlockGlassCasing(); TRANSPARENT_CASING.setRegistryName("transparent_casing"); - - // init coils - int size = BlockWireCoil.getCoilTypes().size(); - int coils = Math.floorDiv(size, 8) + 1; - WIRE_COILS = new BlockWireCoil[coils]; - for (int i = 0; i < coils; i++) { - if (i == 0) { - WIRE_COIL = new BlockWireCoil(); - WIRE_COIL.setRegistryName("wire_coil"); - WIRE_COILS[i] = WIRE_COIL; - } else { - WIRE_COILS[i] = new BlockWireCoil(); - WIRE_COILS[i].setRegistryName("wire_coil_" + i); - } - } - + WIRE_COIL = new BlockWireCoil(); + WIRE_COIL.setRegistryName("wire_coil"); FUSION_CASING = new BlockFusionCasing(); FUSION_CASING.setRegistryName("fusion_casing"); WARNING_SIGN = new BlockWarningSign(); diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index e5536cd6666..64e63456170 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -217,9 +217,8 @@ public void preInit(FMLPreInitializationEvent event) { /* Start API Block Registration */ List coilTypes = BlockWireCoil.getCoilTypes(); - for (int i = 0; i < coilTypes.size(); i++) { - var type = coilTypes.get(i); - HEATING_COILS.put(MetaBlocks.WIRE_COILS[i / 8].getState(type), type); + for (BlockWireCoil.CoilType type : coilTypes) { + HEATING_COILS.put(MetaBlocks.WIRE_COIL.getState(type), type); } for (BlockBatteryPart.BatteryPartType type : BlockBatteryPart.BatteryPartType.values()) { PSS_BATTERIES.put(MetaBlocks.BATTERY_BLOCK.getState(type), type); From e4445e76e6d503cf698252f26d142123e9dfa20f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 11 Mar 2025 17:26:56 -0700 Subject: [PATCH 06/23] improve CoilEvent's methods --- .../java/gregtech/api/event/CoilEvent.java | 87 +++++++++++-------- .../java/gregtech/common/CommonProxy.java | 26 +++--- 2 files changed, 63 insertions(+), 50 deletions(-) diff --git a/src/main/java/gregtech/api/event/CoilEvent.java b/src/main/java/gregtech/api/event/CoilEvent.java index 443fe617a91..4c94c2c71a7 100644 --- a/src/main/java/gregtech/api/event/CoilEvent.java +++ b/src/main/java/gregtech/api/event/CoilEvent.java @@ -8,7 +8,6 @@ import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; -import gregtech.api.util.GTUtility; import gregtech.client.utils.TooltipHelper; import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; @@ -42,6 +41,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; +import java.util.function.UnaryOperator; public abstract class CoilEvent extends Event { @@ -70,88 +70,95 @@ private static ItemBlock createItemBlock(T block, Function> activeSublist = new AtomicReference<>(); + public CoilBlockBuilder create(String modid, String path) { + return new CoilBlockBuilder(new ResourceLocation(modid, path)); + } - public Builder addCoilType(ResourceLocation location) { - return new Builder(location); + public CoilBlockBuilder create(String path) { + return create(GTValues.MODID, path); } + } + + public static class Modify extends CoilEvent { + + } + + public static class CoilBlockBuilder { - public Builder addCoilType(String modid, String path) { - return addCoilType(new ResourceLocation(modid, path)); + private final ResourceLocation location; + private final List stats = new ArrayList<>(ACTIVE_META_LIMIT); + + public CoilBlockBuilder(ResourceLocation location) { + this.location = location; } - public Builder addCoilType(String path) { - return addCoilType(GTUtility.gregtechId(path)); + public CoilBlockBuilder addCoilType(UnaryOperator builder) { + stats.add(builder.apply(new CoilStatBuilder()).build()); + return this; } - public void register(ResourceLocation location) { - List variants = STATS.get(location); - if (variants.isEmpty()) + public void register() { + if (this.stats.isEmpty()) throw new IllegalArgumentException("Variants is empty!"); - int blocks = (variants.size() / ACTIVE_META_LIMIT) + 1; + int blocks = (this.stats.size() / ACTIVE_META_LIMIT) + 1; CustomCoilBlock[] customCoilBlocks = new CustomCoilBlock[blocks]; - Arrays.setAll(customCoilBlocks, value -> createBlock(value, location, variants)); - BLOCKS.put(location, customCoilBlocks); + Arrays.setAll(customCoilBlocks, value -> createBlock(value, this.location, this.stats)); + BLOCKS.put(this.location, customCoilBlocks); } - private CustomCoilBlock createBlock(int index, ResourceLocation location, List variants) { + private static CustomCoilBlock createBlock(int index, ResourceLocation location, + List variants) { int metaIndex = index / ACTIVE_META_LIMIT; int from = 8 * metaIndex; int to = Math.min(from + 8, variants.size()); + List subList = variants.subList(from, to); - activeSublist.set(subList); + CustomCoilBlock.setActiveSublist(subList); var block = new CustomCoilBlock(); + CustomCoilBlock.clearSubList(); + for (var stat : subList) { GregTechAPI.HEATING_COILS.put(block.getState(stat), stat); } - activeSublist.set(null); + block.setRegistryName(location); return block; } } - public static class Modify extends CoilEvent { - - } - - public static class Builder { + public static class CoilStatBuilder { - private final ResourceLocation location; private final CustomCoilStats stats; - private Builder(ResourceLocation location) { - this.location = location; + private CoilStatBuilder() { this.stats = new CustomCoilStats(); } - public Builder material(Material material) { + public CoilStatBuilder material(Material material) { stats.material = material; stats.name = material.getResourceLocation().getPath(); return this; } - public Builder coilTemp(int coilTemperature) { + public CoilStatBuilder coilTemp(int coilTemperature) { stats.coilTemperature = coilTemperature; return this; } - public Builder tier(int tier) { + public CoilStatBuilder tier(int tier) { stats.tier = Math.max(0, tier); return this; } - public Builder multiSmelter(int level, int energyDiscount) { + public CoilStatBuilder multiSmelter(int level, int energyDiscount) { stats.level = level; stats.energyDiscount = energyDiscount; return this; } - public void register() { - if (!STATS.containsKey(this.location)) - STATS.put(location, new ArrayList<>(ACTIVE_META_LIMIT)); - - STATS.get(this.location).add(this.stats); + private CustomCoilStats build() { + return this.stats; } } @@ -213,6 +220,16 @@ public int compareTo(@NotNull CustomCoilStats o) { public static final class CustomCoilBlock extends VariantActiveBlock { + private static final AtomicReference> activeSublist = new AtomicReference<>(); + + private static void setActiveSublist(List sublist) { + activeSublist.set(sublist); + } + + private static void clearSubList() { + activeSublist.set(null); + } + public CustomCoilBlock() { super(net.minecraft.block.material.Material.IRON); setTranslationKey("wire_coil"); @@ -225,7 +242,7 @@ public CustomCoilBlock() { @Override protected @NotNull Collection computeVariants() { - return Register.activeSublist.get(); // stupid super constructor nonsense + return activeSublist.get(); // stupid super constructor nonsense } @Override diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 7cfdd9aac93..07cd00f7a1f 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -23,7 +23,6 @@ import gregtech.api.unification.stack.ItemMaterialInfo; import gregtech.api.util.AssemblyLineManager; import gregtech.api.util.GTLog; -import gregtech.api.util.GTUtility; import gregtech.common.blocks.BlockCompressed; import gregtech.common.blocks.BlockFrame; import gregtech.common.blocks.BlockLamp; @@ -224,21 +223,18 @@ public static void registerBlocksLast(RegistryEvent.Register event) { // todo REMOVE, THIS IS FOR TESTING @SubscribeEvent public static void registerCoils(CoilEvent.Register event) { - event.addCoilType("custom_coil") - .coilTemp(42069) - .tier(GTValues.UHV) - .multiSmelter(69, 98) - .material(Materials.Chlorine) + event.create("custom_coil") + .addCoilType(b -> b + .coilTemp(42069) + .tier(GTValues.UHV) + .multiSmelter(69, 98) + .material(Materials.Chlorine)) + .addCoilType(b -> b + .coilTemp(696969) + .tier(GTValues.UHV) + .multiSmelter(69, 99) + .material(Materials.Neutronium)) .register(); - - event.addCoilType("custom_coil") - .coilTemp(696969) - .tier(GTValues.UHV) - .multiSmelter(69, 99) - .material(Materials.Neutronium) - .register(); - - event.register(GTUtility.gregtechId("custom_coil")); } @SubscribeEvent From 38cf980bbd20de38876f022480d6da747bb49ea7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 11 Mar 2025 17:50:11 -0700 Subject: [PATCH 07/23] add missing method and todo --- src/main/java/gregtech/api/event/CoilEvent.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/gregtech/api/event/CoilEvent.java b/src/main/java/gregtech/api/event/CoilEvent.java index 4c94c2c71a7..e7a675f0176 100644 --- a/src/main/java/gregtech/api/event/CoilEvent.java +++ b/src/main/java/gregtech/api/event/CoilEvent.java @@ -20,6 +20,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -218,6 +219,7 @@ public int compareTo(@NotNull CustomCoilStats o) { } } + // todo render block with respect to material rgb color public static final class CustomCoilBlock extends VariantActiveBlock { private static final AtomicReference> activeSublist = new AtomicReference<>(); @@ -240,6 +242,12 @@ public CustomCoilBlock() { setDefaultState(getState(VALUES[0])); } + @NotNull + @Override + public BlockRenderLayer getRenderLayer() { + return BlockRenderLayer.SOLID; + } + @Override protected @NotNull Collection computeVariants() { return activeSublist.get(); // stupid super constructor nonsense From 130f2f88232b026da226bbf0a48129c14cf7c6c0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 12 Mar 2025 18:41:18 -0700 Subject: [PATCH 08/23] simplify methods and make private --- .../gregtech/common/blocks/BlockWireCoil.java | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 934fdc9d7b4..ba06f1b652e 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -128,6 +128,7 @@ public static abstract class CoilType implements IStringSerializable, IHeatingCo .coilTemp(4500) .multiSmelter(4, 2) .build(); + // material path is "hssg" but texture needs "hss_g" HSS_G = coilType("hss_g", Materials.HSSG) .tier(GTValues.IV) .coilTemp(5400) @@ -150,15 +151,15 @@ public static abstract class CoilType implements IStringSerializable, IHeatingCo .build(); } - public static Builder coilType(Material material) { - return new Builder(material); + private static Builder coilType(Material material) { + return coilType(material.getResourceLocation().getPath(), material); } - public static Builder coilType(String name, Material material) { + private static Builder coilType(String name, Material material) { return new Builder(name, material); } - public CoilType() { + private CoilType() { COIL_TYPES.add(this); } @@ -166,9 +167,14 @@ public CoilType() { public int compareTo(@NotNull BlockWireCoil.CoilType o) { return Integer.compare(o.getTier(), getTier()); } + + @Override + public String toString() { + return getName(); + } } - public static class Builder { + private static class Builder { private final String name; // electric blast furnace properties @@ -179,11 +185,6 @@ public static class Builder { private int tier; private final Material material; - private Builder(Material material) { - this.material = material; - this.name = material.getResourceLocation().getPath(); - } - private Builder(String name, Material material) { this.material = material; this.name = name; @@ -237,11 +238,6 @@ public int getTier() { public @Nullable Material getMaterial() { return material; } - - @Override - public String toString() { - return getName(); - } }; } } From 289c3e901494107d4a9a449e63133b4b4e2ac0d5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 12 Mar 2025 23:07:17 -0700 Subject: [PATCH 09/23] unify coil textures into one grayscale textures mostly working ignore .ase files --- .gitignore | 1 + .../api/block/IHeatingCoilBlockStats.java | 2 + .../java/gregtech/api/event/CoilEvent.java | 8 +- .../gregtech/common/blocks/BlockWireCoil.java | 77 +++++++++++++ .../gregtech/common/blocks/MetaBlocks.java | 2 + .../block/CTHeatingCoilBlockStats.java | 5 + .../gregtech/blockstates/wire_coil.json | 109 +----------------- .../models/block/cube_2_layer_all_tint.json | 18 +++ .../models/block/cube_2_layer_tint.json | 29 +++++ .../casings/coils/machine_coil_generic.png | Bin 0 -> 392 bytes .../coils/machine_coil_generic_base.png | Bin 0 -> 267 bytes 11 files changed, 147 insertions(+), 104 deletions(-) create mode 100644 src/main/resources/assets/gregtech/models/block/cube_2_layer_all_tint.json create mode 100644 src/main/resources/assets/gregtech/models/block/cube_2_layer_tint.json create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base.png diff --git a/.gitignore b/.gitignore index c2fb66e1e33..423e503213e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ thumbs.db *.war *.ear *.txt +*.ase # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* diff --git a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java index 0e2b7427591..6231b2d9c84 100644 --- a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java @@ -52,4 +52,6 @@ public interface IHeatingCoilBlockStats { */ @Nullable Material getMaterial(); + + int getCoilColor(); } diff --git a/src/main/java/gregtech/api/event/CoilEvent.java b/src/main/java/gregtech/api/event/CoilEvent.java index e7a675f0176..7abb0683ab7 100644 --- a/src/main/java/gregtech/api/event/CoilEvent.java +++ b/src/main/java/gregtech/api/event/CoilEvent.java @@ -177,6 +177,7 @@ public static final class CustomCoilStats implements IHeatingCoilBlockStats, Com // voltage tier private int tier = GTValues.ULV; + private int color = 0xFFFFFFFF; private Material material = Materials.Iron; @@ -212,6 +213,11 @@ public int getTier() { return material; } + @Override + public int getCoilColor() { + return color; + } + @Override public int compareTo(@NotNull CustomCoilStats o) { // todo add more comparisons? @@ -219,7 +225,7 @@ public int compareTo(@NotNull CustomCoilStats o) { } } - // todo render block with respect to material rgb color + // todo render block with respect to material rgb color or custom color public static final class CustomCoilBlock extends VariantActiveBlock { private static final AtomicReference> activeSublist = new AtomicReference<>(); diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index ba06f1b652e..9746d969fb9 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -7,30 +7,42 @@ import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; +import gregtech.client.model.ActiveVariantBlockBakedModel; import gregtech.client.utils.TooltipHelper; import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.color.BlockColors; +import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.EntityLiving.SpawnPlacementType; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.utils.Color; +import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; +import it.unimi.dsi.fastutil.ints.Int2IntMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; public class BlockWireCoil extends VariantActiveBlock { @@ -90,6 +102,47 @@ public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAcces return false; } + @SideOnly(Side.CLIENT) + public void onModelRegister() { + var mrl = new ModelResourceLocation(Objects.requireNonNull(getRegistryName()), "normal"); + var model = new ActiveVariantBlockBakedModel(mrl, mrl, null); + Item item = Item.getItemFromBlock(this); + + for (CoilType value : VALUES) { + // inactive + ModelLoader.setCustomModelResourceLocation(item, VARIANT.getIndexOf(value), mrl); + + // active + ModelLoader.registerItemVariants(item, mrl); + } + + ModelLoader.setCustomStateMapper(this, b -> { + Map map = new HashMap<>(); + for (IBlockState s : b.getBlockState().getValidStates()) { + map.put(s, model.getModelLocation()); + } + return map; + }); + } + + public void onColorRegister(BlockColors blockColors, ItemColors itemColors) { + Int2IntMap colorMap = new Int2IntArrayMap(); + Item item = Item.getItemFromBlock(this); + + for (CoilType value : VALUES) { + colorMap.put(VARIANT.getIndexOf(value), getColor(value)); + } + + blockColors.registerBlockColorHandler((state, worldIn, pos, tintIndex) -> colorMap.get(state.getValue(VARIANT)), + this); + + itemColors.registerItemColorHandler((stack, tintIndex) -> colorMap.get(item.getMetadata(stack)), item); + } + + private int getColor(CoilType type) { + return type.getMaterial() == null ? 0xFFFFFFFF : type.getMaterial().getMaterialRGB(); + } + public static List getCoilTypes() { return Collections.unmodifiableList(CoilType.COIL_TYPES); } @@ -183,6 +236,7 @@ private static class Builder { private int level; private int energyDiscount; private int tier; + private int color = Color.WHITE.main; private final Material material; private Builder(String name, Material material) { @@ -200,12 +254,30 @@ public Builder tier(int tier) { return this; } + public Builder color(int color) { + this.color = color; + return this; + } + + public Builder color(String color) { + return color(parseColor(color)); + } + public Builder multiSmelter(int level, int energyDiscount) { this.level = level; this.energyDiscount = energyDiscount; return this; } + private int parseColor(String s) { + // stupid java not having actual unsigned ints + long tmp = Long.parseLong(s, 16); + if (tmp > 0x7FFFFFFF) { + tmp -= 0x100000000L; + } + return (int) tmp; + } + public CoilType build() { return new CoilType() { @@ -238,6 +310,11 @@ public int getTier() { public @Nullable Material getMaterial() { return material; } + + @Override + public int getCoilColor() { + return color; + } }; } } diff --git a/src/main/java/gregtech/common/blocks/MetaBlocks.java b/src/main/java/gregtech/common/blocks/MetaBlocks.java index ed353717832..3c4382a59f4 100644 --- a/src/main/java/gregtech/common/blocks/MetaBlocks.java +++ b/src/main/java/gregtech/common/blocks/MetaBlocks.java @@ -644,6 +644,8 @@ public static void registerColors() { blockColors.registerBlockColorHandler((s, w, p, i) -> ConfigHolder.client.defaultPaintingColor, HERMETIC_CASING); itemColors.registerItemColorHandler((s, i) -> ConfigHolder.client.defaultPaintingColor, HERMETIC_CASING); + + WIRE_COIL.onColorRegister(blockColors, itemColors); } public static void registerWalkingSpeedBonus() { diff --git a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java index 7c2dd912ab8..e37932d0073 100644 --- a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java @@ -74,6 +74,11 @@ public Material getMaterial() { return this.material; } + @Override + public int getCoilColor() { + return getMaterial().getMaterialRGB(); + } + @ZenMethod public static void add(@NotNull IBlockState state, @NotNull String name, int coilTemperature, int level, int energyDiscount, int tier, @Nullable Material material) { diff --git a/src/main/resources/assets/gregtech/blockstates/wire_coil.json b/src/main/resources/assets/gregtech/blockstates/wire_coil.json index ff29e674dab..12ac4ba29d9 100644 --- a/src/main/resources/assets/gregtech/blockstates/wire_coil.json +++ b/src/main/resources/assets/gregtech/blockstates/wire_coil.json @@ -1,109 +1,12 @@ { "forge_marker": 1, "variants": { - "active=false,variant=cupronickel": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_cupronickel" - } - }, - "active=true,variant=cupronickel": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_cupronickel", - "top_all":"gregtech:blocks/casings/coils/machine_coil_cupronickel_bloom" - } - }, - "active=false,variant=kanthal": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_kanthal" - } - }, - "active=true,variant=kanthal": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_kanthal", - "top_all":"gregtech:blocks/casings/coils/machine_coil_kanthal_bloom" - } - }, - "active=false,variant=nichrome": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_nichrome" - } - }, - "active=true,variant=nichrome": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_nichrome", - "top_all":"gregtech:blocks/casings/coils/machine_coil_nichrome_bloom" - } - }, - "active=false,variant=rtm_alloy": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_rtm_alloy" - } - }, - "active=true,variant=rtm_alloy": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_rtm_alloy", - "top_all":"gregtech:blocks/casings/coils/machine_coil_rtm_alloy_bloom" - } - }, - "active=false,variant=hss_g": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_hssg" - } - }, - "active=true,variant=hss_g": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_hssg", - "top_all":"gregtech:blocks/casings/coils/machine_coil_hssg_bloom" - } - }, - "active=false,variant=naquadah": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_naquadah" - } - }, - "active=true,variant=naquadah": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_naquadah", - "top_all":"gregtech:blocks/casings/coils/machine_coil_naquadah_bloom" - } - }, - "active=false,variant=trinium": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_trinium" - } - }, - "active=true,variant=trinium": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_trinium", - "top_all":"gregtech:blocks/casings/coils/machine_coil_trinium_bloom" - } - }, - "active=false,variant=tritanium": { - "model": "minecraft:cube_all", - "textures": { - "all": "gregtech:blocks/casings/coils/machine_coil_tritanium" - } - }, - "active=true,variant=tritanium": { - "model": "gregtech:cube_2_layer_all", - "textures": { - "bot_all": "gregtech:blocks/casings/coils/machine_coil_tritanium", - "top_all":"gregtech:blocks/casings/coils/machine_coil_tritanium_bloom" - } + "normal": { + "model": "gregtech:cube_2_layer_all_tint", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_generic_base", + "top_all": "gregtech:blocks/casings/coils/machine_coil_generic" + } } } } diff --git a/src/main/resources/assets/gregtech/models/block/cube_2_layer_all_tint.json b/src/main/resources/assets/gregtech/models/block/cube_2_layer_all_tint.json new file mode 100644 index 00000000000..636fa1228ed --- /dev/null +++ b/src/main/resources/assets/gregtech/models/block/cube_2_layer_all_tint.json @@ -0,0 +1,18 @@ +{ + "parent": "gregtech:block/cube_2_layer_tint", + "textures": { + "particle": "#bot_all", + "bot_down": "#bot_all", + "bot_up": "#bot_all", + "bot_north": "#bot_all", + "bot_east": "#bot_all", + "bot_south": "#bot_all", + "bot_west": "#bot_all", + "top_down": "#top_all", + "top_up": "#top_all", + "top_north": "#top_all", + "top_east": "#top_all", + "top_south": "#top_all", + "top_west": "#top_all" + } +} diff --git a/src/main/resources/assets/gregtech/models/block/cube_2_layer_tint.json b/src/main/resources/assets/gregtech/models/block/cube_2_layer_tint.json new file mode 100644 index 00000000000..311dcbf7e23 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/block/cube_2_layer_tint.json @@ -0,0 +1,29 @@ +{ + "parent": "block/block", + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bot_down", "cullface": "down" }, + "up": { "texture": "#bot_up", "cullface": "up" }, + "north": { "texture": "#bot_north", "cullface": "north" }, + "south": { "texture": "#bot_south", "cullface": "south" }, + "west": { "texture": "#bot_west", "cullface": "west" }, + "east": { "texture": "#bot_east", "cullface": "east" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#top_down", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#top_up", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#top_north", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#top_south", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#top_west", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#top_east", "cullface": "east", "tintindex": 0 } + } + } + ] +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic.png b/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic.png new file mode 100644 index 0000000000000000000000000000000000000000..24998ec7ae8bd73662de328b10569643255f6de0 GIT binary patch literal 392 zcmV;30eAk1P)Px$LPrlP#{oKoo_)HZ_EXDf5dU=>{;YhYheG6oNI7fG@=~!J<$E9FAa_ zq)+gs=>yEeaNXpdeD|C?Gw|(-0H)Jv?Y-xCJksrU>2x~edCuW*U^pC-Wf`NBX-Wcz>=~o84Ly(V^B&_6a~&Xj4>~;_T=CsX*WNC#ldD-mb`<7Nkvg$t;HDA z#B$C(0KwKLuq23s?Pu7t?dO~;+d|qpPx##Ysd#R5*?8(=l!WQ4B@Vi}c6uQ?aM81NyLnB>RE_vVy>>GDG~FNinPdDIK@6 zEV=Vp9goMkehX(}7q)R3XJIE!QVt;o*0Dd;gf*G)?SwyScTtKgQAgo4Z0Wx=$4*^! R6SDvS002ovPDHLkV1np1buIt^ literal 0 HcmV?d00001 From b9efc81068f2048c588fe3107a0c53d2097248f9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 13 Mar 2025 04:02:13 -0700 Subject: [PATCH 10/23] more work on coil texture --- .../gregtech/common/blocks/BlockWireCoil.java | 11 ++--- .../gregtech/blockstates/wire_coil.json | 8 ++++ .../models/block/cube_3_layer_all_tint.json | 24 ++++++++++ .../models/block/cube_3_layer_tint.json | 41 ++++++++++++++++++ .../coils/machine_coil_generic.png.mcmeta | 13 ++++++ .../machine_coil_generic_base.png.mcmeta | 13 ++++++ .../coils/machine_coil_generic_base_ctm.png | Bin 0 -> 296 bytes .../coils/machine_coil_generic_bloom.png | Bin 0 -> 2747 bytes .../machine_coil_generic_bloom.png.mcmeta | 15 +++++++ .../coils/machine_coil_generic_bloom_ctm.png | Bin 0 -> 2849 bytes .../coils/machine_coil_generic_ctm.png | Bin 0 -> 547 bytes 11 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/gregtech/models/block/cube_3_layer_all_tint.json create mode 100644 src/main/resources/assets/gregtech/models/block/cube_3_layer_tint.json create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic.png.mcmeta create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base.png.mcmeta create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base_ctm.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_bloom.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_bloom_ctm.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_ctm.png diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 9746d969fb9..cac16c2b7f3 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -59,7 +59,7 @@ public BlockWireCoil() { @NotNull @Override public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.SOLID; + return BlockRenderLayer.CUTOUT; } @Override @@ -104,16 +104,17 @@ public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAcces @SideOnly(Side.CLIENT) public void onModelRegister() { - var mrl = new ModelResourceLocation(Objects.requireNonNull(getRegistryName()), "normal"); - var model = new ActiveVariantBlockBakedModel(mrl, mrl, null); + var inactive = new ModelResourceLocation(Objects.requireNonNull(getRegistryName()), "normal"); + var active = new ModelResourceLocation(Objects.requireNonNull(getRegistryName()), "active"); + var model = new ActiveVariantBlockBakedModel(inactive, active, null); Item item = Item.getItemFromBlock(this); for (CoilType value : VALUES) { // inactive - ModelLoader.setCustomModelResourceLocation(item, VARIANT.getIndexOf(value), mrl); + ModelLoader.setCustomModelResourceLocation(item, VARIANT.getIndexOf(value), inactive); // active - ModelLoader.registerItemVariants(item, mrl); + ModelLoader.registerItemVariants(item, active); } ModelLoader.setCustomStateMapper(this, b -> { diff --git a/src/main/resources/assets/gregtech/blockstates/wire_coil.json b/src/main/resources/assets/gregtech/blockstates/wire_coil.json index 12ac4ba29d9..4a2ea501c17 100644 --- a/src/main/resources/assets/gregtech/blockstates/wire_coil.json +++ b/src/main/resources/assets/gregtech/blockstates/wire_coil.json @@ -7,6 +7,14 @@ "bot_all": "gregtech:blocks/casings/coils/machine_coil_generic_base", "top_all": "gregtech:blocks/casings/coils/machine_coil_generic" } + }, + "active": { + "model": "gregtech:cube_3_layer_all_tint", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_generic_base", + "mid_all": "gregtech:blocks/casings/coils/machine_coil_generic", + "top_all": "gregtech:blocks/casings/coils/machine_coil_generic_bloom" + } } } } diff --git a/src/main/resources/assets/gregtech/models/block/cube_3_layer_all_tint.json b/src/main/resources/assets/gregtech/models/block/cube_3_layer_all_tint.json new file mode 100644 index 00000000000..f4d16e6101c --- /dev/null +++ b/src/main/resources/assets/gregtech/models/block/cube_3_layer_all_tint.json @@ -0,0 +1,24 @@ +{ + "parent": "gregtech:block/cube_3_layer_tint", + "textures": { + "particle": "#bot_all", + "bot_down": "#bot_all", + "bot_up": "#bot_all", + "bot_north": "#bot_all", + "bot_east": "#bot_all", + "bot_south": "#bot_all", + "bot_west": "#bot_all", + "mid_down": "#mid_all", + "mid_up": "#mid_all", + "mid_north": "#mid_all", + "mid_east": "#mid_all", + "mid_south": "#mid_all", + "mid_west": "#mid_all", + "top_down": "#top_all", + "top_up": "#top_all", + "top_north": "#top_all", + "top_east": "#top_all", + "top_south": "#top_all", + "top_west": "#top_all" + } +} diff --git a/src/main/resources/assets/gregtech/models/block/cube_3_layer_tint.json b/src/main/resources/assets/gregtech/models/block/cube_3_layer_tint.json new file mode 100644 index 00000000000..31449c3a250 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/block/cube_3_layer_tint.json @@ -0,0 +1,41 @@ +{ + "parent": "block/block", + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bot_down", "cullface": "down" }, + "up": { "texture": "#bot_up", "cullface": "up" }, + "north": { "texture": "#bot_north", "cullface": "north" }, + "south": { "texture": "#bot_south", "cullface": "south" }, + "west": { "texture": "#bot_west", "cullface": "west" }, + "east": { "texture": "#bot_east", "cullface": "east" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#mid_down", "cullface": "down" }, + "up": { "texture": "#mid_up", "cullface": "up" }, + "north": { "texture": "#mid_north", "cullface": "north" }, + "south": { "texture": "#mid_south", "cullface": "south" }, + "west": { "texture": "#mid_west", "cullface": "west" }, + "east": { "texture": "#mid_east", "cullface": "east" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#top_down", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#top_up", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#top_north", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#top_south", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#top_west", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#top_east", "cullface": "east", "tintindex": 0 } + } + } + ] +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic.png.mcmeta new file mode 100644 index 00000000000..9eb46676f53 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic.png.mcmeta @@ -0,0 +1,13 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "CTM", + "layer": "CUTOUT", + "textures": [ + "gregtech:blocks/casings/coils/machine_coil_generic_ctm" + ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base.png.mcmeta new file mode 100644 index 00000000000..df287f690b6 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base.png.mcmeta @@ -0,0 +1,13 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "CTM", + "layer": "CUTOUT", + "textures": [ + "gregtech:blocks/casings/coils/machine_coil_generic_base_ctm" + ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base_ctm.png b/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_base_ctm.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d6d795a7f2bc8cbf17dc05835d8b81a0a83b6f GIT binary patch literal 296 zcmV+@0oVSCP)Px#;z>k7R9J=W)vwW36e$<^X@an0l=^x_pfQ00004Tx07!|QmUmQB*%pV-y*Is3k`RiN&}(Q?0!R(LNRcioF$oY#z>okUHbhi# zL{X8Z2r?+(fTKf^u_B6v0a3B*1Q|rsac~qHmPur-8Q;8l@6DUvANPK1pS{oBXYYO1 zx&V;;g9XA&SP6g(p;#2*=f#MPi)Ua50Sxc}18e}`aI>>Q7WhU2nF4&+jBJ?`_!qsp z4j}paD$_rV!2tiCl(|_VF#u4QjOX(B*<2YH$v8b%oF%tU$(Xh@P0lb%&LUZYGFFpw z@+@0?_L*f5IrB1vJQ>S#&f;b8cV}o=_hCs$|GJ-ARc>v%@$zSl&FIdda6Uz_9&dgda5+tXH875p)hK-XG zi{a1DP3Mcn%rFi&jU(bQ*qIqw9N}^RX3zXt6nSkKvLZX!I5{{lZ7prSDAa#l{F{>Z zc9vd*f9@GXANa%eSALld0I;TIwb}ZIZD|z%UF!i*yZwjFU@riQvc7c=eQ_STd|pz- z;w)z?tK8gNO97v2DKF^n`kxMeLtlK)Qoh~qM8wF>;&Ay4 z=AVc79|!(*9u^V&B)*6*lto0#rc5AAmbF{R6Nm+wLWV&2pPKj&!~Ue%xt59A_z}>S zSOTRX8bE#?04OREAPIY9E70$K3&uwS`OS;bnV6mX&w~DaSGY|6$QC4jj$=neGPn{^ z&g`1}S^_j607XCp>OdRl0~5dmw!jg%01w~;0zoK<1aV+7;DQv80Yo4d6o9p$7?gso zU?->sb)XS6gEnv&bb({wG&lz?fy-b7+yPQB4xWH1@CwX85QK%u5EW8~bRa{>9I}O2 zkQ?L!1w#=~9FzzpLqbRb6+r8tQm7oNhU%ea=v(M0bQ-z<4MVq}QD_qS6?z9FFbSr? zTCfpp1+!pJI0%k}7s1K!GB_VDg15kxa07f0?u1Xnm*5dt3O|9T5r7a8I--j(5f;Km zLXmhR2@xTykP@TC$XgT!MMW`COq2`C9~Fh-qL!gnp*EwcQ3p_+ zs6NzH)F^5S^$|@*Yog83&gcMiEIJvTi!Mf2pqtPg=(Fe%^f>wz27{qvj4_TFe@q-E z6|(}f8M7PHjyZ)H#*AU6u~@7+)*S1K4aIV>Vr((C3VRTH5_<(Zj(vk8;&gDfIA2^m zPKYbSRp451CvaDA6Sx_?65bH+j1R^0@XPUK_(psWeh5E~pCKp{j0vuUNJ1)MEuoUo zMmS5jOL##f67`5q#Bid3xQ19sJVZQC93{RbQAlPaHYtH5A#EY;C!HeQBE2A!$wp)k zay(f~-a>9BpCR8TzfqtnSSkc4@Dx@n)F^Z+Tv2$Yh*vaJ^i*7|n6Fr&ctmkX@u?DC z$w-N<#8FzMRHJlM>4ws@GF90|IaE1Ad9!kh@&)Bb6fDJv;zQw4iYWUiXDDM-gsM+v zQ@PZ2)JE!A>NpKUGo}U5QfZ~MZ)k(GDHV!}ol3Myo=T0%aTO^Yp&QWy=;`z_`eFKY z`a4xERZmsE>L%4T)hnv6)#j*qsPWZG)Y{cX)ZVEx)P2;`)VHa3so&E;X_#q*YvgL| z(KxH|bPjEf%N*{Uk~xRx+}4CO%`_u4S7`3j9MGKB($@0R%F?RRI-~Veo38DlovOV< z`-JwS4pqlZN1(Gq=cLYKh6=-zkLZ@rEqJ6vJJH{f4iNjE!Q9HW+moJu+4^4lvF)ZZ*DZ zLN;+XS!U8;a?KQD$}&we-EDf=3^ubjOEIf48#0H@9n1yhyUm9!&=yV>LW>5A8%z?@ zlbOS8WsX|XErTr!ExRnASs7TxTWz!IxB6&pZ=G)4Xnn_qViRanXwzf!tF4(W*S5y? z+FbHn-?^*jcF%ooXKu&0+hcdro@yUrzrnuO{)2;~gUF%HVbamSG10Ns@dk^=3S(_% zop(Yzc{#0iI_C7&*}+-teAxLH7p6;^ON+~+dB*ej^BU)kx$3!cTZVb0Xx4mvs zcU^amdxQG}4}A}wN0Y~dr>SSE=RwbBUe;bBuMV%*Y-jdL_9<_~+t0hid(emC6XjFw zbKh6bH`%w{0a^jvfaZXyK*zw9fqg-wpantIK@Wn>fV8I2F~=-fTgudr?_nHF76Ya z2X6;&lJCkd=T9WLCY2{WN_I`&o;;c2o>GzWRKONg3!bO?r`DyuP76)jpY|y|CcQla zmywupR7eq~3Hvg&GxIWsv&^%Kv!u(Mm+f3OB?=NXWkcDEvb)7J+0WE~#6+@QGMeL- zQhTd=lZbfxFY`c=@XrK@^Z>#r_a zJ-)_o&4IOqwP|aAD6}ptFMPQ!W?fH_R?(WGvGsoITZV0)e^+=6ZO?$0o?WWq-yLr2> z?D5#sR;N{0TK8_RVDHU(zxvJwqlSuon0-0>9yUfd_J7U#y17ZCskG_Ce&K%UfrtZr z&5q5@Et)N5t#GTPb@E`s!OP!xf79K@Y^!glx0fCQha`s{f1CL2^}|7jdylY=w0&pz zU2O-oqofn+T;4g=mC_~cj_V#i8hEs~$EBy^d&}?lAJaWnb6n+k*$Kjlq7$D^=AWEC zm38Xr>EzR6y-RxUoQXYituMT9@NCf8^XGieo$2@NKY8Bu{ILtp7mi+JUF^E#aH(^^ zexTzA`yV<69R@px9EZ9uJ6-M>o;Q5riu;w*SG}*EyB2Wm(#ZUg;pqt>?FMZqM9Va~FNLGD$lbNT*KP&%S`^@CocfWZ2GB6c8HU3=m{L`|I+Sd?{wJo{Z|>UW?q-PQGavbE$eOnyO?(qGr8}v?<+r;e(3oa^zrVej8C6_ z1NVgU`|NE2YXATM22e~?Me^a%0001XVKGhs0007XQchF<0OhwZN&o-=B}qg004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_ z0K*JTY>22pL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr z?{oLrd!Mx~03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE@L0LWj&=4?(nOT_siPRbOditRHZrp6?S8Agej zFG^6va$=5K|`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t z74chfY%+(L4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AW zE=!MYYHiJ+dvY?9I0Av8Ka-Wn(gPeepdb@piwLhwjRWWeSr7baCBSDM=|p zK0Q5^$>Pur|2)M1IPkCYSQ^NQ`z*p zYmq4Rp8z$=2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV z=Mor9X9@Wki)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3 zF4znTKoQsl_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZX zRY(gmfXpBUWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6qn9`(3jA6(BtSg7z~Dn z(ZN_@JTc*z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW z#Hr%UaPGJW91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5Y zU_t_6GogaeLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*C zkMxR6CTo)&$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4 z=0!`QmC#PmhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`hkG4N#KjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=? zH;57x71R{;CfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV z4H2`e-B#~iJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOj zV`f+`tbMHKY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9 zk0dT6g(bBnMJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3 zsdQ;h>DV6MJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP z-cdbwfPG-_pyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1 z@Q#ce4LsV@Xw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy z`y}IJ%XeDeRku;v3frOf?DmPgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3 ze|F(q&bit1spqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bE zTE}(E>+O9OeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$ zcQ|r*xkvZnNio#z9&IX9*nWZ zp8u5o(}(f=r{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8 z{*wQ4;n(6<@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh; zdbp6hu<#rAg!B711SuW>000J1OjJexegFUf00%)#tpET30(4SNQ~vU}U5WGhh)z!5}5*VpPVXZh&AaxPcK3 zpvz+@K$jmT;XpAS05@QX3v_@gk0rWMC;hB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_ctm.png b/src/main/resources/assets/gregtech/textures/blocks/casings/coils/machine_coil_generic_ctm.png new file mode 100644 index 0000000000000000000000000000000000000000..1356386fbc92c60433acdfd21cc468d517303f57 GIT binary patch literal 547 zcmV+;0^I$HP)Px$-AP12R9J=WRy&TuFc5vV(jWx>jFSR!00iO|w48yKBX9&N4nu(ih%TRkE6^ZB zLq&u{Ll9dz3hZh{aIsn`=`7E@dGq`{4x7*Ck0eQ8i~$kB7=tK^;QKzb)*vE8QG_4} zKt#}5=ljMOD5c<%?L6r_~UT4OvOv!Vye z9GhLU>2&%y9*=pkX0r(?B@TxJlv3#T``=_MUfoY*f0_fmUJvK<8H2&#X|vny=AGG2 zipA|(O6fKS%Es7O0aU4H^+2Sr9 z;Py<4#oi_J8@YE4?Ge$FjGS{U77Gv&PNx%Yw;PtrC4>;TTrSA646D@&LI?;Uek51M z1AI6fGP_9A6r0Tk#u#K-2F4hYB!TC7;GCn;Xkfiw<9fX!O;b!J6IS-vUX^iv4QI32 lqwM&# Date: Sat, 15 Mar 2025 15:27:45 -0700 Subject: [PATCH 11/23] try implement option for using per-coil textures this conflicts with the render layer --- .../api/block/IHeatingCoilBlockStats.java | 5 + .../api/block/VariantActiveBlock.java | 2 +- .../java/gregtech/api/event/CoilEvent.java | 7 ++ .../model/ActiveVariantBlockBakedModel.java | 8 ++ .../gregtech/common/blocks/BlockWireCoil.java | 101 ++++++++++------- .../block/CTHeatingCoilBlockStats.java | 8 ++ .../gregtech/blockstates/wire_coil.json | 104 ++++++++++++++++++ 7 files changed, 193 insertions(+), 42 deletions(-) diff --git a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java index 6231b2d9c84..1301a312738 100644 --- a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java @@ -2,10 +2,13 @@ import gregtech.api.recipes.properties.impl.TemperatureProperty; import gregtech.api.unification.material.Material; +import gregtech.client.model.ActiveVariantBlockBakedModel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.function.Predicate; + /** * Implement this interface on the Block Enum for your Heating Coil block * @@ -54,4 +57,6 @@ public interface IHeatingCoilBlockStats { Material getMaterial(); int getCoilColor(); + + ActiveVariantBlockBakedModel createModel(Predicate bloomConfig); } diff --git a/src/main/java/gregtech/api/block/VariantActiveBlock.java b/src/main/java/gregtech/api/block/VariantActiveBlock.java index a568dd42b0a..8263ba46181 100644 --- a/src/main/java/gregtech/api/block/VariantActiveBlock.java +++ b/src/main/java/gregtech/api/block/VariantActiveBlock.java @@ -168,7 +168,7 @@ private ModelResourceLocation model(boolean active, T variant) { } @SideOnly(Side.CLIENT) - protected boolean isBloomEnabled(T value) { + public boolean isBloomEnabled(T value) { return ConfigHolder.client.machinesEmissiveTextures; } } diff --git a/src/main/java/gregtech/api/event/CoilEvent.java b/src/main/java/gregtech/api/event/CoilEvent.java index 7abb0683ab7..e779903eac8 100644 --- a/src/main/java/gregtech/api/event/CoilEvent.java +++ b/src/main/java/gregtech/api/event/CoilEvent.java @@ -8,6 +8,7 @@ import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; +import gregtech.client.model.ActiveVariantBlockBakedModel; import gregtech.client.utils.TooltipHelper; import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; @@ -42,6 +43,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; +import java.util.function.Predicate; import java.util.function.UnaryOperator; public abstract class CoilEvent extends Event { @@ -218,6 +220,11 @@ public int getCoilColor() { return color; } + @Override + public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { + return null; + } + @Override public int compareTo(@NotNull CustomCoilStats o) { // todo add more comparisons? diff --git a/src/main/java/gregtech/client/model/ActiveVariantBlockBakedModel.java b/src/main/java/gregtech/client/model/ActiveVariantBlockBakedModel.java index 8a17399f9a0..ba6aa69be46 100644 --- a/src/main/java/gregtech/client/model/ActiveVariantBlockBakedModel.java +++ b/src/main/java/gregtech/client/model/ActiveVariantBlockBakedModel.java @@ -63,6 +63,14 @@ public ModelResourceLocation getModelLocation() { return modelLocation; } + public ModelResourceLocation getActiveModelLocation() { + return activeModelLocation; + } + + public ModelResourceLocation getInactiveModelLocation() { + return inactiveModelLocation; + } + protected boolean getBloomConfig() { return bloomConfig == null || bloomConfig.getAsBoolean(); } diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index cac16c2b7f3..f4f58b1b150 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -7,6 +7,7 @@ import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; +import gregtech.api.util.GTUtility; import gregtech.client.model.ActiveVariantBlockBakedModel; import gregtech.client.utils.TooltipHelper; import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; @@ -23,6 +24,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -33,6 +35,8 @@ import com.cleanroommc.modularui.utils.Color; import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,6 +47,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Predicate; public class BlockWireCoil extends VariantActiveBlock { @@ -59,7 +64,7 @@ public BlockWireCoil() { @NotNull @Override public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.CUTOUT; + return BlockRenderLayer.SOLID; } @Override @@ -104,23 +109,25 @@ public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAcces @SideOnly(Side.CLIENT) public void onModelRegister() { - var inactive = new ModelResourceLocation(Objects.requireNonNull(getRegistryName()), "normal"); - var active = new ModelResourceLocation(Objects.requireNonNull(getRegistryName()), "active"); - var model = new ActiveVariantBlockBakedModel(inactive, active, null); Item item = Item.getItemFromBlock(this); + Int2ObjectMap modelMap = new Int2ObjectArrayMap<>(); for (CoilType value : VALUES) { + var model = value.createModel(object -> isBloomEnabled((CoilType) object)); + modelMap.put(VARIANT.getIndexOf(value), model.getModelLocation()); + // inactive - ModelLoader.setCustomModelResourceLocation(item, VARIANT.getIndexOf(value), inactive); + ModelLoader.setCustomModelResourceLocation(item, VARIANT.getIndexOf(value), + model.getInactiveModelLocation()); // active - ModelLoader.registerItemVariants(item, active); + ModelLoader.registerItemVariants(item, model.getActiveModelLocation()); } ModelLoader.setCustomStateMapper(this, b -> { Map map = new HashMap<>(); for (IBlockState s : b.getBlockState().getValidStates()) { - map.put(s, model.getModelLocation()); + map.put(s, modelMap.get(s.getValue(VARIANT))); } return map; }); @@ -148,22 +155,38 @@ public static List getCoilTypes() { return Collections.unmodifiableList(CoilType.COIL_TYPES); } - public static abstract class CoilType implements IStringSerializable, IHeatingCoilBlockStats, Comparable { + public abstract static class CoilType implements IStringSerializable, IHeatingCoilBlockStats, Comparable { private static final List COIL_TYPES = new ArrayList<>(); - public static final CoilType CUPRONICKEL; - public static final CoilType KANTHAL; - public static final CoilType NICHROME; - public static final CoilType RTM_ALLOY; - public static final CoilType HSS_G; - public static final CoilType NAQUADAH; - public static final CoilType TRINIUM; - public static final CoilType TRITANIUM; + public static CoilType CUPRONICKEL; + public static CoilType KANTHAL; + public static CoilType NICHROME; + public static CoilType RTM_ALLOY; + public static CoilType HSS_G; + public static CoilType NAQUADAH; + public static CoilType TRINIUM; + public static CoilType TRITANIUM; + + private CoilType() { + COIL_TYPES.add(this); + } + + @Override + public int compareTo(@NotNull BlockWireCoil.CoilType o) { + return Integer.compare(o.getTier(), getTier()); + } + + @Override + public String toString() { + return getName(); + } static { CUPRONICKEL = coilType(Materials.Cupronickel) .tier(GTValues.LV) + // this works, but requires SOLID, while everything else needs CUTOUT + .texture(GTUtility.gregtechId("wire_coil"), false) .coilTemp(1800) .multiSmelter(1, 1) .build(); @@ -212,20 +235,6 @@ private static Builder coilType(Material material) { private static Builder coilType(String name, Material material) { return new Builder(name, material); } - - private CoilType() { - COIL_TYPES.add(this); - } - - @Override - public int compareTo(@NotNull BlockWireCoil.CoilType o) { - return Integer.compare(o.getTier(), getTier()); - } - - @Override - public String toString() { - return getName(); - } } private static class Builder { @@ -239,6 +248,8 @@ private static class Builder { private int tier; private int color = Color.WHITE.main; private final Material material; + private ModelResourceLocation inactive; + private ModelResourceLocation active; private Builder(String name, Material material) { this.material = material; @@ -260,8 +271,14 @@ public Builder color(int color) { return this; } - public Builder color(String color) { - return color(parseColor(color)); + public Builder texture(ResourceLocation location, boolean generic) { + ResourceLocation loc = Objects.requireNonNull(location); + String variant = generic ? "%s" : "active=%s,variant=%s"; + this.inactive = new ModelResourceLocation(loc, + generic ? String.format(variant, false) : String.format(variant, false, name)); + this.active = new ModelResourceLocation(loc, + generic ? String.format(variant, true) : String.format(variant, true, name)); + return this; } public Builder multiSmelter(int level, int energyDiscount) { @@ -270,16 +287,13 @@ public Builder multiSmelter(int level, int energyDiscount) { return this; } - private int parseColor(String s) { - // stupid java not having actual unsigned ints - long tmp = Long.parseLong(s, 16); - if (tmp > 0x7FFFFFFF) { - tmp -= 0x100000000L; - } - return (int) tmp; - } - public CoilType build() { + if (inactive == null) { + inactive = new ModelResourceLocation(GTUtility.gregtechId("wire_coil"), "normal"); + } + if (active == null) { + active = inactive; + } return new CoilType() { @Override @@ -316,6 +330,11 @@ public int getTier() { public int getCoilColor() { return color; } + + @Override + public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { + return new ActiveVariantBlockBakedModel(inactive, active, () -> bloomConfig.test(this)); + } }; } } diff --git a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java index e37932d0073..71aab8ab010 100644 --- a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java @@ -3,6 +3,7 @@ import gregtech.api.GregTechAPI; import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.unification.material.Material; +import gregtech.client.model.ActiveVariantBlockBakedModel; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.block.IBlockState; @@ -12,6 +13,8 @@ import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; +import java.util.function.Predicate; + @ZenClass("mods.gregtech.blocks.HeatingCoils") @ZenRegister @SuppressWarnings("unused") @@ -79,6 +82,11 @@ public int getCoilColor() { return getMaterial().getMaterialRGB(); } + @Override + public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { + return null; + } + @ZenMethod public static void add(@NotNull IBlockState state, @NotNull String name, int coilTemperature, int level, int energyDiscount, int tier, @Nullable Material material) { diff --git a/src/main/resources/assets/gregtech/blockstates/wire_coil.json b/src/main/resources/assets/gregtech/blockstates/wire_coil.json index 4a2ea501c17..1bf3858650a 100644 --- a/src/main/resources/assets/gregtech/blockstates/wire_coil.json +++ b/src/main/resources/assets/gregtech/blockstates/wire_coil.json @@ -15,6 +15,110 @@ "mid_all": "gregtech:blocks/casings/coils/machine_coil_generic", "top_all": "gregtech:blocks/casings/coils/machine_coil_generic_bloom" } + }, + "active=false,variant=cupronickel": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_cupronickel" + } + }, + "active=true,variant=cupronickel": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_cupronickel", + "top_all":"gregtech:blocks/casings/coils/machine_coil_cupronickel_bloom" + } + }, + "active=false,variant=kanthal": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_kanthal" + } + }, + "active=true,variant=kanthal": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_kanthal", + "top_all":"gregtech:blocks/casings/coils/machine_coil_kanthal_bloom" + } + }, + "active=false,variant=nichrome": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_nichrome" + } + }, + "active=true,variant=nichrome": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_nichrome", + "top_all":"gregtech:blocks/casings/coils/machine_coil_nichrome_bloom" + } + }, + "active=false,variant=rtm_alloy": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_rtm_alloy" + } + }, + "active=true,variant=rtm_alloy": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_rtm_alloy", + "top_all":"gregtech:blocks/casings/coils/machine_coil_rtm_alloy_bloom" + } + }, + "active=false,variant=hss_g": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_hssg" + } + }, + "active=true,variant=hss_g": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_hssg", + "top_all":"gregtech:blocks/casings/coils/machine_coil_hssg_bloom" + } + }, + "active=false,variant=naquadah": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_naquadah" + } + }, + "active=true,variant=naquadah": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_naquadah", + "top_all":"gregtech:blocks/casings/coils/machine_coil_naquadah_bloom" + } + }, + "active=false,variant=trinium": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_trinium" + } + }, + "active=true,variant=trinium": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_trinium", + "top_all":"gregtech:blocks/casings/coils/machine_coil_trinium_bloom" + } + }, + "active=false,variant=tritanium": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/casings/coils/machine_coil_tritanium" + } + }, + "active=true,variant=tritanium": { + "model": "gregtech:cube_2_layer_all", + "textures": { + "bot_all": "gregtech:blocks/casings/coils/machine_coil_tritanium", + "top_all":"gregtech:blocks/casings/coils/machine_coil_tritanium_bloom" + } } } } From 1fa8e4cebf1edcd5e7b4a7ac127c647bc14f887c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 30 Sep 2025 23:20:03 -0700 Subject: [PATCH 12/23] split and move several classes out of CoilEvent.java create manager and registries like MTEs remove color method rollback custom rendering changes --- .../api/block/IHeatingCoilBlockStats.java | 2 - .../api/block/coil/CoilBlockBuilder.java | 47 +++ .../gregtech/api/block/coil/CoilManager.java | 62 ++++ .../gregtech/api/block/coil/CoilRegistry.java | 41 +++ .../api/block/coil/CoilStatBuilder.java | 38 +++ .../api/block/coil/CustomCoilBlock.java | 99 ++++++ .../api/block/coil/CustomCoilStats.java | 75 +++++ .../java/gregtech/api/event/CoilEvent.java | 305 ------------------ .../java/gregtech/common/CommonProxy.java | 21 +- .../gregtech/common/blocks/BlockWireCoil.java | 5 - src/main/java/gregtech/core/CoreModule.java | 4 +- .../block/CTHeatingCoilBlockStats.java | 5 - 12 files changed, 378 insertions(+), 326 deletions(-) create mode 100644 src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java create mode 100644 src/main/java/gregtech/api/block/coil/CoilManager.java create mode 100644 src/main/java/gregtech/api/block/coil/CoilRegistry.java create mode 100644 src/main/java/gregtech/api/block/coil/CoilStatBuilder.java create mode 100644 src/main/java/gregtech/api/block/coil/CustomCoilBlock.java create mode 100644 src/main/java/gregtech/api/block/coil/CustomCoilStats.java delete mode 100644 src/main/java/gregtech/api/event/CoilEvent.java diff --git a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java index 1301a312738..b32a74344a9 100644 --- a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java @@ -56,7 +56,5 @@ public interface IHeatingCoilBlockStats { @Nullable Material getMaterial(); - int getCoilColor(); - ActiveVariantBlockBakedModel createModel(Predicate bloomConfig); } diff --git a/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java b/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java new file mode 100644 index 00000000000..a0f7a979dc4 --- /dev/null +++ b/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java @@ -0,0 +1,47 @@ +package gregtech.api.block.coil; + +import gregtech.api.GregTechAPI; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + +public class CoilBlockBuilder { + + public static final int ACTIVE_META_LIMIT = 8; + + private final List stats = new ArrayList<>(ACTIVE_META_LIMIT); + private final Consumer onBuild; + + private CoilBlockBuilder(Consumer onBuild) { + this.onBuild = onBuild; + } + + static CoilBlockBuilder builder(Consumer onBuild) { + return new CoilBlockBuilder(onBuild); + } + + public CoilBlockBuilder addCoilType(UnaryOperator builder) { + if (stats.size() >= ACTIVE_META_LIMIT) { + throw new IllegalStateException("Cannot exceed active meta limit!"); + } + stats.add(builder.apply(new CoilStatBuilder()).build()); + return this; + } + + public CustomCoilBlock build() { + if (this.stats.isEmpty()) + throw new IllegalArgumentException("Variants is empty!"); + CustomCoilBlock.setActiveList(this.stats); + var block = new CustomCoilBlock(); + CustomCoilBlock.clearActiveList(); + for (var stat : this.stats) { + GregTechAPI.HEATING_COILS.put(block.getState(stat), stat); + } + + this.onBuild.accept(block); + + return block; + } +} diff --git a/src/main/java/gregtech/api/block/coil/CoilManager.java b/src/main/java/gregtech/api/block/coil/CoilManager.java new file mode 100644 index 00000000000..3a0750dfaff --- /dev/null +++ b/src/main/java/gregtech/api/block/coil/CoilManager.java @@ -0,0 +1,62 @@ +package gregtech.api.block.coil; + +import gregtech.api.GTValues; + +import net.minecraftforge.fml.common.eventhandler.Event; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; + +import java.util.Collection; + +public class CoilManager { + + private static CoilManager instance; + private static int networkId; + private static CoilRegistry internal; + + private final Object2ObjectMap registryMap = new Object2ObjectOpenHashMap<>(); + private final Int2ObjectMap networkMap = new Int2ObjectOpenHashMap<>(); + + public static CoilManager getInstance() { + if (instance == null) { + instance = new CoilManager(); + internal = instance.createRegistry(GTValues.MODID); + } + return instance; + } + + private CoilManager() {} + + public CoilRegistry getRegistry(String modid) { + CoilRegistry coilRegistry = registryMap.get(modid); + if (coilRegistry == null) { + throw new IllegalArgumentException("No MTE registry exists for modid \"" + modid + "\""); + } + return coilRegistry; + } + + public CoilRegistry createRegistry(String modid) { + if (registryMap.containsKey(modid)) { + throw new IllegalArgumentException("MTE Registry for modid \"" + modid + "\" is already registered"); + } + CoilRegistry registry = new CoilRegistry(modid, ++networkId); + registryMap.put(modid, registry); + networkMap.put(networkId, registry); + return registry; + } + + public CoilRegistry getRegistry(int networkId) { + CoilRegistry coilRegistry = networkMap.get(networkId); + return coilRegistry == null ? internal : coilRegistry; + } + + public Collection getRegistries() { + return registryMap.values(); + } + + // event class + public static class CoilRegistryEvent extends Event {} +} diff --git a/src/main/java/gregtech/api/block/coil/CoilRegistry.java b/src/main/java/gregtech/api/block/coil/CoilRegistry.java new file mode 100644 index 00000000000..1960fe9f833 --- /dev/null +++ b/src/main/java/gregtech/api/block/coil/CoilRegistry.java @@ -0,0 +1,41 @@ +package gregtech.api.block.coil; + +import gregtech.api.util.GTControlledRegistry; + +import net.minecraft.util.ResourceLocation; + +import org.jetbrains.annotations.NotNull; + +public class CoilRegistry extends GTControlledRegistry { + + private final String modid; + private final int networkId; + + public CoilRegistry(String modId, int networkId) { + super(Short.MAX_VALUE); + this.modid = modId; + this.networkId = networkId; + } + + public CoilBlockBuilder makeBuilder(int id, String name) { + ResourceLocation loc = new ResourceLocation(this.modid, name); + return CoilBlockBuilder.builder(b -> register(id, loc, b)); + } + + @Override + public void register(int id, @NotNull ResourceLocation key, @NotNull CustomCoilBlock value) { + if (!canRegister(key.getNamespace())) { + throw new IllegalArgumentException("Cannot register CoilBlock to another mod's registry"); + } + value.setRegistryName(key); + super.register(id, key, value); + } + + /** + * @param modid the modid to test + * @return if the mod is allowed to be registered to this registry + */ + private boolean canRegister(@NotNull String modid) { + return this.modid.equals(modid); + } +} diff --git a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java new file mode 100644 index 00000000000..d74ec04b0d6 --- /dev/null +++ b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java @@ -0,0 +1,38 @@ +package gregtech.api.block.coil; + +import gregtech.api.unification.material.Material; + +public class CoilStatBuilder { + + private final CustomCoilStats stats; + + CoilStatBuilder() { + this.stats = new CustomCoilStats(); + } + + public CoilStatBuilder material(Material material) { + stats.material = material; + stats.name = material.getResourceLocation().getPath(); + return this; + } + + public CoilStatBuilder coilTemp(int coilTemperature) { + stats.coilTemperature = coilTemperature; + return this; + } + + public CoilStatBuilder tier(int tier) { + stats.tier = Math.max(0, tier); + return this; + } + + public CoilStatBuilder multiSmelter(int level, int energyDiscount) { + stats.level = level; + stats.energyDiscount = energyDiscount; + return this; + } + + CustomCoilStats build() { + return this.stats; + } +} diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java new file mode 100644 index 00000000000..ff82021f141 --- /dev/null +++ b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java @@ -0,0 +1,99 @@ +package gregtech.api.block.coil; + +import gregtech.api.GTValues; +import gregtech.api.block.IHeatingCoilBlockStats; +import gregtech.api.block.VariantActiveBlock; +import gregtech.api.block.VariantItemBlock; +import gregtech.api.items.toolitem.ToolClasses; +import gregtech.client.utils.TooltipHelper; +import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; + +import net.minecraft.block.SoundType; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.EntityLiving; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +public final class CustomCoilBlock extends VariantActiveBlock { + + private static final AtomicReference> activeSublist = new AtomicReference<>(); + + static void setActiveList(List sublist) { + activeSublist.set(sublist); + } + + static void clearActiveList() { + activeSublist.set(null); + } + + public CustomCoilBlock() { + super(net.minecraft.block.material.Material.IRON); + setTranslationKey("wire_coil"); + setHardness(5.0f); + setResistance(10.0f); + setSoundType(SoundType.METAL); + setHarvestLevel(ToolClasses.WRENCH, 2); + setDefaultState(getState(VALUES[0])); + } + + @NotNull + @Override + public BlockRenderLayer getRenderLayer() { + return BlockRenderLayer.SOLID; + } + + @Override + protected @NotNull Collection computeVariants() { + return activeSublist.get(); // stupid super constructor nonsense + } + + @Override + public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, + @NotNull EntityLiving.SpawnPlacementType type) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn, @NotNull List lines, + @NotNull ITooltipFlag tooltipFlag) { + super.addInformation(itemStack, worldIn, lines, tooltipFlag); + + // noinspection rawtypes, unchecked + VariantItemBlock itemBlock = (VariantItemBlock) itemStack.getItem(); + IBlockState stackState = itemBlock.getBlockState(itemStack); + IHeatingCoilBlockStats coilType = getState(stackState); + + lines.add(I18n.format("tile.wire_coil.tooltip_heat", coilType.getCoilTemperature())); + + if (TooltipHelper.isShiftDown()) { + int coilTier = coilType.getTier(); + lines.add(I18n.format("tile.wire_coil.tooltip_smelter")); + lines.add(I18n.format("tile.wire_coil.tooltip_parallel_smelter", coilType.getLevel() * 32)); + int EUt = MetaTileEntityMultiSmelter.getEUtForParallel( + MetaTileEntityMultiSmelter.getMaxParallel(coilType.getLevel()), coilType.getEnergyDiscount()); + lines.add(I18n.format("tile.wire_coil.tooltip_energy_smelter", EUt)); + lines.add(I18n.format("tile.wire_coil.tooltip_pyro")); + lines.add( + I18n.format("tile.wire_coil.tooltip_speed_pyro", coilTier == GTValues.LV ? 75 : 50 * coilTier)); + lines.add(I18n.format("tile.wire_coil.tooltip_cracking")); + lines.add(I18n.format("tile.wire_coil.tooltip_energy_cracking", 100 - 10 * (coilTier - 1))); + } else { + lines.add(I18n.format("tile.wire_coil.tooltip_extended_info")); + } + } +} diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java new file mode 100644 index 00000000000..b96a0323e67 --- /dev/null +++ b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java @@ -0,0 +1,75 @@ +package gregtech.api.block.coil; + +import gregtech.api.GTValues; +import gregtech.api.block.IHeatingCoilBlockStats; +import gregtech.api.unification.material.Material; +import gregtech.api.unification.material.Materials; +import gregtech.client.model.ActiveVariantBlockBakedModel; + +import net.minecraft.util.IStringSerializable; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Predicate; + +public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable, + IStringSerializable { + + String name; + + // electric blast furnace properties + int coilTemperature = -1; + + // multi smelter properties + int level = -1; + int energyDiscount = 0; + + // voltage tier + int tier = GTValues.ULV; + + Material material = Materials.Iron; + + CustomCoilStats() {} + + @Override + public @NotNull String getName() { + return name; + } + + @Override + public int getCoilTemperature() { + return coilTemperature; + } + + @Override + public int getLevel() { + return level; + } + + @Override + public int getEnergyDiscount() { + return energyDiscount; + } + + @Override + public int getTier() { + return tier; + } + + @Override + public @Nullable Material getMaterial() { + return material; + } + + @Override + public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { + return null; + } + + @Override + public int compareTo(@NotNull CustomCoilStats o) { + // todo add more comparisons? + return Integer.compare(o.getTier(), this.getTier()); + } +} diff --git a/src/main/java/gregtech/api/event/CoilEvent.java b/src/main/java/gregtech/api/event/CoilEvent.java deleted file mode 100644 index e779903eac8..00000000000 --- a/src/main/java/gregtech/api/event/CoilEvent.java +++ /dev/null @@ -1,305 +0,0 @@ -package gregtech.api.event; - -import gregtech.api.GTValues; -import gregtech.api.GregTechAPI; -import gregtech.api.block.IHeatingCoilBlockStats; -import gregtech.api.block.VariantActiveBlock; -import gregtech.api.block.VariantItemBlock; -import gregtech.api.items.toolitem.ToolClasses; -import gregtech.api.unification.material.Material; -import gregtech.api.unification.material.Materials; -import gregtech.client.model.ActiveVariantBlockBakedModel; -import gregtech.client.utils.TooltipHelper; -import gregtech.common.metatileentities.multi.electric.MetaTileEntityMultiSmelter; - -import net.minecraft.block.Block; -import net.minecraft.block.SoundType; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.resources.I18n; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.EntityLiving; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.eventhandler.Event; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.registries.IForgeRegistry; - -import it.unimi.dsi.fastutil.objects.Object2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.UnaryOperator; - -public abstract class CoilEvent extends Event { - - public static final int ACTIVE_META_LIMIT = 8; - - protected static final Object2ObjectMap> STATS = new Object2ObjectOpenHashMap<>(); - protected static final Object2ObjectMap BLOCKS = new Object2ObjectOpenHashMap<>(); - - public static void registerBlocks(IForgeRegistry registry) { - for (CustomCoilBlock[] value : BLOCKS.values()) { - for (CustomCoilBlock customCoilBlock : value) { - registry.register(createItemBlock(customCoilBlock, VariantItemBlock::new)); - } - } - } - - private static ItemBlock createItemBlock(T block, Function producer) { - ItemBlock itemBlock = producer.apply(block); - ResourceLocation registryName = block.getRegistryName(); - if (registryName == null) { - throw new IllegalArgumentException("Block " + block.getTranslationKey() + " has no registry name."); - } - itemBlock.setRegistryName(registryName); - return itemBlock; - } - - public static class Register extends CoilEvent { - - public CoilBlockBuilder create(String modid, String path) { - return new CoilBlockBuilder(new ResourceLocation(modid, path)); - } - - public CoilBlockBuilder create(String path) { - return create(GTValues.MODID, path); - } - } - - public static class Modify extends CoilEvent { - - } - - public static class CoilBlockBuilder { - - private final ResourceLocation location; - private final List stats = new ArrayList<>(ACTIVE_META_LIMIT); - - public CoilBlockBuilder(ResourceLocation location) { - this.location = location; - } - - public CoilBlockBuilder addCoilType(UnaryOperator builder) { - stats.add(builder.apply(new CoilStatBuilder()).build()); - return this; - } - - public void register() { - if (this.stats.isEmpty()) - throw new IllegalArgumentException("Variants is empty!"); - - int blocks = (this.stats.size() / ACTIVE_META_LIMIT) + 1; - CustomCoilBlock[] customCoilBlocks = new CustomCoilBlock[blocks]; - Arrays.setAll(customCoilBlocks, value -> createBlock(value, this.location, this.stats)); - BLOCKS.put(this.location, customCoilBlocks); - } - - private static CustomCoilBlock createBlock(int index, ResourceLocation location, - List variants) { - int metaIndex = index / ACTIVE_META_LIMIT; - int from = 8 * metaIndex; - int to = Math.min(from + 8, variants.size()); - - List subList = variants.subList(from, to); - CustomCoilBlock.setActiveSublist(subList); - var block = new CustomCoilBlock(); - CustomCoilBlock.clearSubList(); - - for (var stat : subList) { - GregTechAPI.HEATING_COILS.put(block.getState(stat), stat); - } - - block.setRegistryName(location); - return block; - } - } - - public static class CoilStatBuilder { - - private final CustomCoilStats stats; - - private CoilStatBuilder() { - this.stats = new CustomCoilStats(); - } - - public CoilStatBuilder material(Material material) { - stats.material = material; - stats.name = material.getResourceLocation().getPath(); - return this; - } - - public CoilStatBuilder coilTemp(int coilTemperature) { - stats.coilTemperature = coilTemperature; - return this; - } - - public CoilStatBuilder tier(int tier) { - stats.tier = Math.max(0, tier); - return this; - } - - public CoilStatBuilder multiSmelter(int level, int energyDiscount) { - stats.level = level; - stats.energyDiscount = energyDiscount; - return this; - } - - private CustomCoilStats build() { - return this.stats; - } - } - - public static final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable, - IStringSerializable { - - private String name; - - // electric blast furnace properties - private int coilTemperature = -1; - - // multi smelter properties - private int level = -1; - private int energyDiscount = 0; - - // voltage tier - private int tier = GTValues.ULV; - private int color = 0xFFFFFFFF; - - private Material material = Materials.Iron; - - private CustomCoilStats() {} - - @Override - public @NotNull String getName() { - return name; - } - - @Override - public int getCoilTemperature() { - return coilTemperature; - } - - @Override - public int getLevel() { - return level; - } - - @Override - public int getEnergyDiscount() { - return energyDiscount; - } - - @Override - public int getTier() { - return tier; - } - - @Override - public @Nullable Material getMaterial() { - return material; - } - - @Override - public int getCoilColor() { - return color; - } - - @Override - public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { - return null; - } - - @Override - public int compareTo(@NotNull CustomCoilStats o) { - // todo add more comparisons? - return Integer.compare(o.getTier(), this.getTier()); - } - } - - // todo render block with respect to material rgb color or custom color - public static final class CustomCoilBlock extends VariantActiveBlock { - - private static final AtomicReference> activeSublist = new AtomicReference<>(); - - private static void setActiveSublist(List sublist) { - activeSublist.set(sublist); - } - - private static void clearSubList() { - activeSublist.set(null); - } - - public CustomCoilBlock() { - super(net.minecraft.block.material.Material.IRON); - setTranslationKey("wire_coil"); - setHardness(5.0f); - setResistance(10.0f); - setSoundType(SoundType.METAL); - setHarvestLevel(ToolClasses.WRENCH, 2); - setDefaultState(getState(VALUES[0])); - } - - @NotNull - @Override - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.SOLID; - } - - @Override - protected @NotNull Collection computeVariants() { - return activeSublist.get(); // stupid super constructor nonsense - } - - @Override - public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, - @NotNull EntityLiving.SpawnPlacementType type) { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn, @NotNull List lines, - @NotNull ITooltipFlag tooltipFlag) { - super.addInformation(itemStack, worldIn, lines, tooltipFlag); - - // noinspection rawtypes, unchecked - VariantItemBlock itemBlock = (VariantItemBlock) itemStack.getItem(); - IBlockState stackState = itemBlock.getBlockState(itemStack); - IHeatingCoilBlockStats coilType = getState(stackState); - - lines.add(I18n.format("tile.wire_coil.tooltip_heat", coilType.getCoilTemperature())); - - if (TooltipHelper.isShiftDown()) { - int coilTier = coilType.getTier(); - lines.add(I18n.format("tile.wire_coil.tooltip_smelter")); - lines.add(I18n.format("tile.wire_coil.tooltip_parallel_smelter", coilType.getLevel() * 32)); - int EUt = MetaTileEntityMultiSmelter.getEUtForParallel( - MetaTileEntityMultiSmelter.getMaxParallel(coilType.getLevel()), coilType.getEnergyDiscount()); - lines.add(I18n.format("tile.wire_coil.tooltip_energy_smelter", EUt)); - lines.add(I18n.format("tile.wire_coil.tooltip_pyro")); - lines.add( - I18n.format("tile.wire_coil.tooltip_speed_pyro", coilTier == GTValues.LV ? 75 : 50 * coilTier)); - lines.add(I18n.format("tile.wire_coil.tooltip_cracking")); - lines.add(I18n.format("tile.wire_coil.tooltip_energy_cracking", 100 - 10 * (coilTier - 1))); - } else { - lines.add(I18n.format("tile.wire_coil.tooltip_extended_info")); - } - } - } -} diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 07cd00f7a1f..738f9426cc2 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -3,8 +3,9 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.VariantItemBlock; +import gregtech.api.block.coil.CoilManager; +import gregtech.api.block.coil.CoilRegistry; import gregtech.api.block.machines.MachineItemBlock; -import gregtech.api.event.CoilEvent; import gregtech.api.items.metaitem.MetaItem; import gregtech.api.items.toolitem.IGTTool; import gregtech.api.metatileentity.registry.MTERegistry; @@ -222,8 +223,11 @@ public static void registerBlocksLast(RegistryEvent.Register event) { // todo REMOVE, THIS IS FOR TESTING @SubscribeEvent - public static void registerCoils(CoilEvent.Register event) { - event.create("custom_coil") + public static void registerCoils(CoilManager.CoilRegistryEvent event) { + final String modid = "test"; + CoilRegistry registry = CoilManager.getInstance().createRegistry(modid); + + registry.makeBuilder(0, "coil_block") .addCoilType(b -> b .coilTemp(42069) .tier(GTValues.UHV) @@ -234,7 +238,7 @@ public static void registerCoils(CoilEvent.Register event) { .tier(GTValues.UHV) .multiSmelter(69, 99) .material(Materials.Neutronium)) - .register(); + .build(); } @SubscribeEvent @@ -283,8 +287,13 @@ public static void registerItems(RegistryEvent.Register event) { registry.register(createItemBlock(MULTIBLOCK_CASING, VariantItemBlock::new)); registry.register(createItemBlock(TRANSPARENT_CASING, VariantItemBlock::new)); - MinecraftForge.EVENT_BUS.post(new CoilEvent.Register()); - CoilEvent.registerBlocks(registry); + MinecraftForge.EVENT_BUS.post(new CoilManager.CoilRegistryEvent()); + for (CoilRegistry r : CoilManager.getInstance().getRegistries()) { + for (ResourceLocation l : r.getKeys()) { + registry.register(createItemBlock(r.getObject(l), VariantItemBlock::new)); + } + } + registry.register(createItemBlock(WIRE_COIL, VariantItemBlock::new)); registry.register(createItemBlock(FUSION_CASING, VariantItemBlock::new)); registry.register(createItemBlock(WARNING_SIGN, VariantItemBlock::new)); diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index f4f58b1b150..98628bdadcb 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -326,11 +326,6 @@ public int getTier() { return material; } - @Override - public int getCoilColor() { - return color; - } - @Override public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { return new ActiveVariantBlockBakedModel(inactive, active, () -> bloomConfig.test(this)); diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index 64e63456170..f0cf02d35c0 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -97,7 +97,6 @@ import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; -import java.util.List; import java.util.Map; import static gregtech.api.GregTechAPI.*; @@ -216,8 +215,7 @@ public void preInit(FMLPreInitializationEvent event) { MetaEntities.init(); /* Start API Block Registration */ - List coilTypes = BlockWireCoil.getCoilTypes(); - for (BlockWireCoil.CoilType type : coilTypes) { + for (BlockWireCoil.CoilType type : BlockWireCoil.getCoilTypes()) { HEATING_COILS.put(MetaBlocks.WIRE_COIL.getState(type), type); } for (BlockBatteryPart.BatteryPartType type : BlockBatteryPart.BatteryPartType.values()) { diff --git a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java index 71aab8ab010..6ece3614d65 100644 --- a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java @@ -77,11 +77,6 @@ public Material getMaterial() { return this.material; } - @Override - public int getCoilColor() { - return getMaterial().getMaterialRGB(); - } - @Override public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { return null; From 596f998d1098b770a62e9b3181367c8d37b8825f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 30 Sep 2025 23:25:59 -0700 Subject: [PATCH 13/23] improve `createModel()` --- .../java/gregtech/api/block/IHeatingCoilBlockStats.java | 6 ++++-- .../java/gregtech/api/block/coil/CustomCoilStats.java | 8 -------- src/main/java/gregtech/common/blocks/BlockWireCoil.java | 8 ++++---- .../crafttweaker/block/CTHeatingCoilBlockStats.java | 8 -------- 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java index b32a74344a9..a6fd5a60c17 100644 --- a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Predicate; +import java.util.function.BooleanSupplier; /** * Implement this interface on the Block Enum for your Heating Coil block @@ -56,5 +56,7 @@ public interface IHeatingCoilBlockStats { @Nullable Material getMaterial(); - ActiveVariantBlockBakedModel createModel(Predicate bloomConfig); + default ActiveVariantBlockBakedModel createModel(BooleanSupplier bloomConfig) { + return null; + } } diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java index b96a0323e67..41a0121efbe 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java @@ -4,15 +4,12 @@ import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; -import gregtech.client.model.ActiveVariantBlockBakedModel; import net.minecraft.util.IStringSerializable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Predicate; - public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable, IStringSerializable { @@ -62,11 +59,6 @@ public int getTier() { return material; } - @Override - public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { - return null; - } - @Override public int compareTo(@NotNull CustomCoilStats o) { // todo add more comparisons? diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 98628bdadcb..cb08148fc45 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -47,7 +47,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.Predicate; +import java.util.function.BooleanSupplier; public class BlockWireCoil extends VariantActiveBlock { @@ -113,7 +113,7 @@ public void onModelRegister() { Int2ObjectMap modelMap = new Int2ObjectArrayMap<>(); for (CoilType value : VALUES) { - var model = value.createModel(object -> isBloomEnabled((CoilType) object)); + var model = value.createModel(() -> isBloomEnabled(value)); modelMap.put(VARIANT.getIndexOf(value), model.getModelLocation()); // inactive @@ -327,8 +327,8 @@ public int getTier() { } @Override - public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { - return new ActiveVariantBlockBakedModel(inactive, active, () -> bloomConfig.test(this)); + public ActiveVariantBlockBakedModel createModel(BooleanSupplier bloomConfig) { + return new ActiveVariantBlockBakedModel(inactive, active, bloomConfig); } }; } diff --git a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java index 6ece3614d65..7c2dd912ab8 100644 --- a/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/integration/crafttweaker/block/CTHeatingCoilBlockStats.java @@ -3,7 +3,6 @@ import gregtech.api.GregTechAPI; import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.unification.material.Material; -import gregtech.client.model.ActiveVariantBlockBakedModel; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.block.IBlockState; @@ -13,8 +12,6 @@ import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; -import java.util.function.Predicate; - @ZenClass("mods.gregtech.blocks.HeatingCoils") @ZenRegister @SuppressWarnings("unused") @@ -77,11 +74,6 @@ public Material getMaterial() { return this.material; } - @Override - public ActiveVariantBlockBakedModel createModel(Predicate bloomConfig) { - return null; - } - @ZenMethod public static void add(@NotNull IBlockState state, @NotNull String name, int coilTemperature, int level, int energyDiscount, int tier, @Nullable Material material) { From 9725d584d1751b6e5af46e64061333866bf48bb4 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 30 Sep 2025 23:35:23 -0700 Subject: [PATCH 14/23] add textures for custom coil add color back with material rgb --- .../api/block/IHeatingCoilBlockStats.java | 4 ++++ .../api/block/coil/CoilStatBuilder.java | 22 +++++++++++++++++++ .../api/block/coil/CustomCoilStats.java | 10 +++++++++ .../gregtech/common/blocks/BlockWireCoil.java | 6 +---- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java index a6fd5a60c17..4bbd66e90ed 100644 --- a/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java +++ b/src/main/java/gregtech/api/block/IHeatingCoilBlockStats.java @@ -56,6 +56,10 @@ public interface IHeatingCoilBlockStats { @Nullable Material getMaterial(); + default int getColor() { + return getMaterial() == null ? 0xFFFFFFFF : getMaterial().getMaterialRGB(); + } + default ActiveVariantBlockBakedModel createModel(BooleanSupplier bloomConfig) { return null; } diff --git a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java index d74ec04b0d6..a2bc10f2359 100644 --- a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java +++ b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java @@ -1,6 +1,12 @@ package gregtech.api.block.coil; import gregtech.api.unification.material.Material; +import gregtech.api.util.GTUtility; + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.util.ResourceLocation; + +import java.util.Objects; public class CoilStatBuilder { @@ -32,7 +38,23 @@ public CoilStatBuilder multiSmelter(int level, int energyDiscount) { return this; } + public CoilStatBuilder texture(ResourceLocation location, boolean generic) { + ResourceLocation loc = Objects.requireNonNull(location); + String variant = generic ? "%s" : "active=%s,variant=%s"; + stats.inactive = new ModelResourceLocation(loc, + generic ? String.format(variant, false) : String.format(variant, false, stats.name)); + stats.active = new ModelResourceLocation(loc, + generic ? String.format(variant, true) : String.format(variant, true, stats.name)); + return this; + } + CustomCoilStats build() { + if (stats.inactive == null) { + stats.inactive = new ModelResourceLocation(GTUtility.gregtechId("wire_coil"), "normal"); + } + if (stats.active == null) { + stats.active = stats.inactive; + } return this.stats; } } diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java index 41a0121efbe..e4b3a3846c3 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java @@ -4,12 +4,16 @@ import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; +import gregtech.client.model.ActiveVariantBlockBakedModel; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.util.IStringSerializable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.function.BooleanSupplier; + public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable, IStringSerializable { @@ -26,6 +30,7 @@ public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable int tier = GTValues.ULV; Material material = Materials.Iron; + ModelResourceLocation active, inactive; CustomCoilStats() {} @@ -59,6 +64,11 @@ public int getTier() { return material; } + @Override + public ActiveVariantBlockBakedModel createModel(BooleanSupplier bloomConfig) { + return new ActiveVariantBlockBakedModel(inactive, active, bloomConfig); + } + @Override public int compareTo(@NotNull CustomCoilStats o) { // todo add more comparisons? diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index cb08148fc45..cddfe1d8a49 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -138,7 +138,7 @@ public void onColorRegister(BlockColors blockColors, ItemColors itemColors) { Item item = Item.getItemFromBlock(this); for (CoilType value : VALUES) { - colorMap.put(VARIANT.getIndexOf(value), getColor(value)); + colorMap.put(VARIANT.getIndexOf(value), value.getColor()); } blockColors.registerBlockColorHandler((state, worldIn, pos, tintIndex) -> colorMap.get(state.getValue(VARIANT)), @@ -147,10 +147,6 @@ public void onColorRegister(BlockColors blockColors, ItemColors itemColors) { itemColors.registerItemColorHandler((stack, tintIndex) -> colorMap.get(item.getMetadata(stack)), item); } - private int getColor(CoilType type) { - return type.getMaterial() == null ? 0xFFFFFFFF : type.getMaterial().getMaterialRGB(); - } - public static List getCoilTypes() { return Collections.unmodifiableList(CoilType.COIL_TYPES); } From 6b094b32fc24b9444d7f73fad06ae2e274b2e741 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 1 Oct 2025 00:40:15 -0700 Subject: [PATCH 15/23] move event post to CoreModule freeze/unfreeze in CoreModule add static reference in GregTechAPI add color and model register --- src/main/java/gregtech/api/GregTechAPI.java | 3 ++ .../api/block/coil/CustomCoilBlock.java | 51 +++++++++++++++++++ .../java/gregtech/common/CommonProxy.java | 8 +-- .../gregtech/common/blocks/MetaBlocks.java | 14 +++++ src/main/java/gregtech/core/CoreModule.java | 13 +++++ 5 files changed, 85 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/GregTechAPI.java b/src/main/java/gregtech/api/GregTechAPI.java index 4e3bc8bc69c..79a5716ea7b 100644 --- a/src/main/java/gregtech/api/GregTechAPI.java +++ b/src/main/java/gregtech/api/GregTechAPI.java @@ -3,6 +3,7 @@ import gregtech.api.advancement.IAdvancementManager; import gregtech.api.block.ICleanroomFilter; import gregtech.api.block.IHeatingCoilBlockStats; +import gregtech.api.block.coil.CoilManager; import gregtech.api.command.ICommandManager; import gregtech.api.cover.CoverDefinition; import gregtech.api.event.HighTierEvent; @@ -55,6 +56,8 @@ public class GregTechAPI { public static MarkerMaterialRegistry markerMaterialRegistry; /** Will be available at the Pre-Initialization stage */ public static MTEManager mteManager; + /** Will be available at the Pre-Initialization stage */ + public static CoilManager coilManager; /** GT's data migrations API */ public static final MigrationAPI MIGRATIONS = new MigrationAPI(); public static final RecipePropertyRegistry RECIPE_PROPERTIES = new RecipePropertyRegistry(); diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java index ff82021f141..f79e40707db 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java @@ -10,22 +10,33 @@ import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.color.BlockColors; +import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.EntityLiving; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicReference; public final class CustomCoilBlock extends VariantActiveBlock { @@ -96,4 +107,44 @@ public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn lines.add(I18n.format("tile.wire_coil.tooltip_extended_info")); } } + + @SideOnly(Side.CLIENT) + public void onModelRegister() { + Item item = Item.getItemFromBlock(this); + Int2ObjectMap modelMap = new Int2ObjectArrayMap<>(); + + for (CustomCoilStats value : VALUES) { + var model = value.createModel(() -> isBloomEnabled(value)); + modelMap.put(VARIANT.getIndexOf(value), model.getModelLocation()); + + // inactive + ModelLoader.setCustomModelResourceLocation(item, VARIANT.getIndexOf(value), + model.getInactiveModelLocation()); + + // active + ModelLoader.registerItemVariants(item, model.getActiveModelLocation()); + } + + ModelLoader.setCustomStateMapper(this, b -> { + Map map = new HashMap<>(); + for (IBlockState s : b.getBlockState().getValidStates()) { + map.put(s, modelMap.get(s.getValue(VARIANT))); + } + return map; + }); + } + + public void onColorRegister(BlockColors blockColors, ItemColors itemColors) { + Int2IntMap colorMap = new Int2IntArrayMap(); + Item item = Item.getItemFromBlock(this); + + for (CustomCoilStats value : VALUES) { + colorMap.put(VARIANT.getIndexOf(value), value.getColor()); + } + + blockColors.registerBlockColorHandler((state, worldIn, pos, tintIndex) -> colorMap.get(state.getValue(VARIANT)), + this); + + itemColors.registerItemColorHandler((stack, tintIndex) -> colorMap.get(item.getMetadata(stack)), item); + } } diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 738f9426cc2..63c77ebb0f3 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -5,6 +5,7 @@ import gregtech.api.block.VariantItemBlock; import gregtech.api.block.coil.CoilManager; import gregtech.api.block.coil.CoilRegistry; +import gregtech.api.block.coil.CustomCoilBlock; import gregtech.api.block.machines.MachineItemBlock; import gregtech.api.items.metaitem.MetaItem; import gregtech.api.items.toolitem.IGTTool; @@ -287,10 +288,9 @@ public static void registerItems(RegistryEvent.Register event) { registry.register(createItemBlock(MULTIBLOCK_CASING, VariantItemBlock::new)); registry.register(createItemBlock(TRANSPARENT_CASING, VariantItemBlock::new)); - MinecraftForge.EVENT_BUS.post(new CoilManager.CoilRegistryEvent()); - for (CoilRegistry r : CoilManager.getInstance().getRegistries()) { - for (ResourceLocation l : r.getKeys()) { - registry.register(createItemBlock(r.getObject(l), VariantItemBlock::new)); + for (CoilRegistry coilRegistry : GregTechAPI.coilManager.getRegistries()) { + for (CustomCoilBlock block : coilRegistry) { + registry.register(createItemBlock(block, VariantItemBlock::new)); } } diff --git a/src/main/java/gregtech/common/blocks/MetaBlocks.java b/src/main/java/gregtech/common/blocks/MetaBlocks.java index 3c4382a59f4..56c10a73c3f 100644 --- a/src/main/java/gregtech/common/blocks/MetaBlocks.java +++ b/src/main/java/gregtech/common/blocks/MetaBlocks.java @@ -1,6 +1,8 @@ package gregtech.common.blocks; import gregtech.api.GregTechAPI; +import gregtech.api.block.coil.CoilRegistry; +import gregtech.api.block.coil.CustomCoilBlock; import gregtech.api.block.machines.BlockMachine; import gregtech.api.metatileentity.MetaTileEntityHolder; import gregtech.api.metatileentity.registry.MTERegistry; @@ -508,6 +510,12 @@ public static void registerItemModels() { MULTIBLOCK_CASING.onModelRegister(); TRANSPARENT_CASING.onModelRegister(); + for (CoilRegistry r : GregTechAPI.coilManager.getRegistries()) { + for (CustomCoilBlock block : r) { + block.onModelRegister(); + } + } + for (BlockLamp lamp : LAMPS.values()) lamp.onModelRegister(); for (BlockLamp lamp : BORDERLESS_LAMPS.values()) lamp.onModelRegister(); @@ -646,6 +654,12 @@ public static void registerColors() { itemColors.registerItemColorHandler((s, i) -> ConfigHolder.client.defaultPaintingColor, HERMETIC_CASING); WIRE_COIL.onColorRegister(blockColors, itemColors); + + for (CoilRegistry r : GregTechAPI.coilManager.getRegistries()) { + for (CustomCoilBlock block : r) { + block.onColorRegister(blockColors, itemColors); + } + } } public static void registerWalkingSpeedBonus() { diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index f0cf02d35c0..f605df0a07a 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -4,6 +4,8 @@ import gregtech.api.GregTechAPI; import gregtech.api.GregTechAPIInternal; import gregtech.api.block.IHeatingCoilBlockStats; +import gregtech.api.block.coil.CoilManager; +import gregtech.api.block.coil.CoilRegistry; import gregtech.api.capability.SimpleCapabilityManager; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverUIFactory; @@ -193,12 +195,20 @@ public void preInit(FMLPreInitializationEvent event) { // need to do this before MetaBlocks runs, to make sure all addons get their own BlockMachine /* Start MTE Registry Addition */ GregTechAPI.mteManager = MTEManager.getInstance(); + GregTechAPI.coilManager = CoilManager.getInstance(); MinecraftForge.EVENT_BUS.post(new MTEManager.MTERegistryEvent()); /* End MTE Registry Addition */ OreDictUnifier.init(); MetaBlocks.init(); + + for (CoilRegistry registry : coilManager.getRegistries()) { + registry.unfreeze(); + } + logger.info("Registering Coils"); + MinecraftForge.EVENT_BUS.post(new CoilManager.CoilRegistryEvent()); + MetaItems.init(); ToolItems.init(); GTFluidRegistration.INSTANCE.register(); @@ -254,6 +264,9 @@ public void init(FMLInitializationEvent event) { for (MTERegistry registry : mteManager.getRegistries()) { registry.freeze(); } + for (CoilRegistry r : coilManager.getRegistries()) { + r.freeze(); + } proxy.onLoad(); if (RecipeMap.isFoundInvalidRecipe()) { logger.fatal("Seems like invalid recipe was found."); From bda95fa16750deb3482d448b9bf7d323b53e3434 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 1 Oct 2025 00:52:56 -0700 Subject: [PATCH 16/23] freezing doesn't work --- src/main/java/gregtech/core/CoreModule.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index f605df0a07a..773593329de 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -203,9 +203,9 @@ public void preInit(FMLPreInitializationEvent event) { MetaBlocks.init(); - for (CoilRegistry registry : coilManager.getRegistries()) { - registry.unfreeze(); - } +// for (CoilRegistry registry : coilManager.getRegistries()) { +// registry.unfreeze(); +// } logger.info("Registering Coils"); MinecraftForge.EVENT_BUS.post(new CoilManager.CoilRegistryEvent()); @@ -264,9 +264,9 @@ public void init(FMLInitializationEvent event) { for (MTERegistry registry : mteManager.getRegistries()) { registry.freeze(); } - for (CoilRegistry r : coilManager.getRegistries()) { - r.freeze(); - } +// for (CoilRegistry r : coilManager.getRegistries()) { +// r.freeze(); +// } proxy.onLoad(); if (RecipeMap.isFoundInvalidRecipe()) { logger.fatal("Seems like invalid recipe was found."); From 4fd45e65b4e8c4598c9f58cf1cff79ea5d89a6ca Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 1 Oct 2025 01:34:23 -0700 Subject: [PATCH 17/23] register blocks --- src/main/java/gregtech/common/CommonProxy.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 63c77ebb0f3..1d824dddc5c 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -95,6 +95,12 @@ public static void registerBlocks(RegistryEvent.Register event) { registry.register(r.getBlock()); } + for (CoilRegistry r : GregTechAPI.coilManager.getRegistries()) { + for (CustomCoilBlock block : r) { + registry.register(block); + } + } + StoneType.init(); for (MaterialRegistry materialRegistry : GregTechAPI.materialManager.getRegistries()) { From 2883e450155b8537c424339941bc24fb83c6c8f5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:30:33 -0700 Subject: [PATCH 18/23] fix render layer simplify BlockWireCoil simplify texture --- .../api/block/VariantActiveBlock.java | 5 +++ .../api/block/coil/CoilStatBuilder.java | 26 +++++++------ .../api/block/coil/CustomCoilBlock.java | 8 ++-- .../api/block/coil/CustomCoilStats.java | 1 + .../gregtech/common/blocks/BlockWireCoil.java | 37 ++----------------- src/main/java/gregtech/core/CoreModule.java | 13 +++---- 6 files changed, 34 insertions(+), 56 deletions(-) diff --git a/src/main/java/gregtech/api/block/VariantActiveBlock.java b/src/main/java/gregtech/api/block/VariantActiveBlock.java index 8263ba46181..47c057c019a 100644 --- a/src/main/java/gregtech/api/block/VariantActiveBlock.java +++ b/src/main/java/gregtech/api/block/VariantActiveBlock.java @@ -90,6 +90,11 @@ protected boolean canSilkHarvest() { @NotNull @Override public BlockRenderLayer getRenderLayer() { + return getRenderLayer(VALUES[0]); + } + + @NotNull + public BlockRenderLayer getRenderLayer(T value) { return BlockRenderLayer.CUTOUT; } diff --git a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java index a2bc10f2359..1688d784a0f 100644 --- a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java +++ b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java @@ -1,7 +1,6 @@ package gregtech.api.block.coil; import gregtech.api.unification.material.Material; -import gregtech.api.util.GTUtility; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.util.ResourceLocation; @@ -11,6 +10,7 @@ public class CoilStatBuilder { private final CustomCoilStats stats; + private ResourceLocation textureLocation; CoilStatBuilder() { this.stats = new CustomCoilStats(); @@ -39,21 +39,23 @@ public CoilStatBuilder multiSmelter(int level, int energyDiscount) { } public CoilStatBuilder texture(ResourceLocation location, boolean generic) { - ResourceLocation loc = Objects.requireNonNull(location); - String variant = generic ? "%s" : "active=%s,variant=%s"; - stats.inactive = new ModelResourceLocation(loc, - generic ? String.format(variant, false) : String.format(variant, false, stats.name)); - stats.active = new ModelResourceLocation(loc, - generic ? String.format(variant, true) : String.format(variant, true, stats.name)); + this.textureLocation = Objects.requireNonNull(location); + this.stats.isGeneric = generic; return this; } CustomCoilStats build() { - if (stats.inactive == null) { - stats.inactive = new ModelResourceLocation(GTUtility.gregtechId("wire_coil"), "normal"); - } - if (stats.active == null) { - stats.active = stats.inactive; + String variant; + if (this.stats.isGeneric) { + variant = "%s"; + this.stats.inactive = new ModelResourceLocation(this.textureLocation, String.format(variant, false)); + this.stats.active = new ModelResourceLocation(this.textureLocation, String.format(variant, true)); + } else { + variant = "active=%s,variant=%s"; + this.stats.inactive = new ModelResourceLocation(this.textureLocation, + String.format(variant, false, stats.name)); + this.stats.active = new ModelResourceLocation(this.textureLocation, + String.format(variant, true, stats.name)); } return this.stats; } diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java index f79e40707db..bcad7e7022b 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java @@ -63,8 +63,8 @@ public CustomCoilBlock() { @NotNull @Override - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.SOLID; + public BlockRenderLayer getRenderLayer(CustomCoilStats value) { + return value.isGeneric ? BlockRenderLayer.CUTOUT : BlockRenderLayer.SOLID; } @Override @@ -84,8 +84,8 @@ public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn @NotNull ITooltipFlag tooltipFlag) { super.addInformation(itemStack, worldIn, lines, tooltipFlag); - // noinspection rawtypes, unchecked - VariantItemBlock itemBlock = (VariantItemBlock) itemStack.getItem(); + // noinspection unchecked + var itemBlock = (VariantItemBlock) itemStack.getItem(); IBlockState stackState = itemBlock.getBlockState(itemStack); IHeatingCoilBlockStats coilType = getState(stackState); diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java index e4b3a3846c3..c7685233fcc 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java @@ -31,6 +31,7 @@ public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable Material material = Materials.Iron; ModelResourceLocation active, inactive; + boolean isGeneric = true; CustomCoilStats() {} diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index cddfe1d8a49..0d5784c06bf 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -22,7 +22,6 @@ import net.minecraft.entity.EntityLiving.SpawnPlacementType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -32,7 +31,6 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.utils.Color; import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; @@ -46,7 +44,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.BooleanSupplier; public class BlockWireCoil extends VariantActiveBlock { @@ -61,12 +58,6 @@ public BlockWireCoil() { setDefaultState(getState(CoilType.CUPRONICKEL)); } - @NotNull - @Override - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.SOLID; - } - @Override protected @NotNull Collection computeVariants() { return getCoilTypes(); @@ -181,8 +172,6 @@ public String toString() { static { CUPRONICKEL = coilType(Materials.Cupronickel) .tier(GTValues.LV) - // this works, but requires SOLID, while everything else needs CUTOUT - .texture(GTUtility.gregtechId("wire_coil"), false) .coilTemp(1800) .multiSmelter(1, 1) .build(); @@ -242,7 +231,6 @@ private static class Builder { private int level; private int energyDiscount; private int tier; - private int color = Color.WHITE.main; private final Material material; private ModelResourceLocation inactive; private ModelResourceLocation active; @@ -262,21 +250,6 @@ public Builder tier(int tier) { return this; } - public Builder color(int color) { - this.color = color; - return this; - } - - public Builder texture(ResourceLocation location, boolean generic) { - ResourceLocation loc = Objects.requireNonNull(location); - String variant = generic ? "%s" : "active=%s,variant=%s"; - this.inactive = new ModelResourceLocation(loc, - generic ? String.format(variant, false) : String.format(variant, false, name)); - this.active = new ModelResourceLocation(loc, - generic ? String.format(variant, true) : String.format(variant, true, name)); - return this; - } - public Builder multiSmelter(int level, int energyDiscount) { this.level = level; this.energyDiscount = energyDiscount; @@ -284,12 +257,10 @@ public Builder multiSmelter(int level, int energyDiscount) { } public CoilType build() { - if (inactive == null) { - inactive = new ModelResourceLocation(GTUtility.gregtechId("wire_coil"), "normal"); - } - if (active == null) { - active = inactive; - } + ResourceLocation loc = GTUtility.gregtechId("wire_coil"); + String variant = "active=%s,variant=%s"; + this.inactive = new ModelResourceLocation(loc, String.format(variant, false, name)); + this.active = new ModelResourceLocation(loc, String.format(variant, true, name)); return new CoilType() { @Override diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index 773593329de..7891295b25a 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -5,7 +5,6 @@ import gregtech.api.GregTechAPIInternal; import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.block.coil.CoilManager; -import gregtech.api.block.coil.CoilRegistry; import gregtech.api.capability.SimpleCapabilityManager; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverUIFactory; @@ -203,9 +202,9 @@ public void preInit(FMLPreInitializationEvent event) { MetaBlocks.init(); -// for (CoilRegistry registry : coilManager.getRegistries()) { -// registry.unfreeze(); -// } + // for (CoilRegistry registry : coilManager.getRegistries()) { + // registry.unfreeze(); + // } logger.info("Registering Coils"); MinecraftForge.EVENT_BUS.post(new CoilManager.CoilRegistryEvent()); @@ -264,9 +263,9 @@ public void init(FMLInitializationEvent event) { for (MTERegistry registry : mteManager.getRegistries()) { registry.freeze(); } -// for (CoilRegistry r : coilManager.getRegistries()) { -// r.freeze(); -// } + // for (CoilRegistry r : coilManager.getRegistries()) { + // r.freeze(); + // } proxy.onLoad(); if (RecipeMap.isFoundInvalidRecipe()) { logger.fatal("Seems like invalid recipe was found."); From de0f4c1e251ca948381d63a76bedaab8f694299d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 1 Oct 2025 19:05:33 -0700 Subject: [PATCH 19/23] fix render layer pt 2 pass modid down to CoilStatBuilder split texture and generic make generic false by default add custom tooltips for custom coils --- .../api/block/VariantActiveBlock.java | 2 +- .../api/block/coil/CoilBlockBuilder.java | 10 ++++--- .../gregtech/api/block/coil/CoilRegistry.java | 2 +- .../api/block/coil/CoilStatBuilder.java | 30 ++++++++++++++----- .../api/block/coil/CustomCoilBlock.java | 5 ++-- .../api/block/coil/CustomCoilStats.java | 18 ++++++++++- .../api/util/function/QuadConsumer.java | 7 +++++ .../java/gregtech/common/CommonProxy.java | 2 ++ .../gregtech/common/blocks/BlockWireCoil.java | 6 ++++ 9 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 src/main/java/gregtech/api/util/function/QuadConsumer.java diff --git a/src/main/java/gregtech/api/block/VariantActiveBlock.java b/src/main/java/gregtech/api/block/VariantActiveBlock.java index 47c057c019a..becc8fb40ce 100644 --- a/src/main/java/gregtech/api/block/VariantActiveBlock.java +++ b/src/main/java/gregtech/api/block/VariantActiveBlock.java @@ -100,7 +100,7 @@ public BlockRenderLayer getRenderLayer(T value) { @Override public boolean canRenderInLayer(@NotNull IBlockState state, @NotNull BlockRenderLayer layer) { - return layer == getRenderLayer() || + return layer == getRenderLayer(getState(state)) || layer == BloomEffectUtil.getEffectiveBloomLayer(isBloomEnabled(getState(state))); } diff --git a/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java b/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java index a0f7a979dc4..da6dfc9df81 100644 --- a/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java +++ b/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java @@ -12,21 +12,23 @@ public class CoilBlockBuilder { public static final int ACTIVE_META_LIMIT = 8; private final List stats = new ArrayList<>(ACTIVE_META_LIMIT); + private final String modid; private final Consumer onBuild; - private CoilBlockBuilder(Consumer onBuild) { + private CoilBlockBuilder(String modid, Consumer onBuild) { + this.modid = modid; this.onBuild = onBuild; } - static CoilBlockBuilder builder(Consumer onBuild) { - return new CoilBlockBuilder(onBuild); + static CoilBlockBuilder builder(String modid, Consumer onBuild) { + return new CoilBlockBuilder(modid, onBuild); } public CoilBlockBuilder addCoilType(UnaryOperator builder) { if (stats.size() >= ACTIVE_META_LIMIT) { throw new IllegalStateException("Cannot exceed active meta limit!"); } - stats.add(builder.apply(new CoilStatBuilder()).build()); + stats.add(builder.apply(new CoilStatBuilder(this.modid)).build()); return this; } diff --git a/src/main/java/gregtech/api/block/coil/CoilRegistry.java b/src/main/java/gregtech/api/block/coil/CoilRegistry.java index 1960fe9f833..4244c58d597 100644 --- a/src/main/java/gregtech/api/block/coil/CoilRegistry.java +++ b/src/main/java/gregtech/api/block/coil/CoilRegistry.java @@ -19,7 +19,7 @@ public CoilRegistry(String modId, int networkId) { public CoilBlockBuilder makeBuilder(int id, String name) { ResourceLocation loc = new ResourceLocation(this.modid, name); - return CoilBlockBuilder.builder(b -> register(id, loc, b)); + return CoilBlockBuilder.builder(this.modid, b -> register(id, loc, b)); } @Override diff --git a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java index 1688d784a0f..fd514191c82 100644 --- a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java +++ b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java @@ -1,18 +1,19 @@ package gregtech.api.block.coil; import gregtech.api.unification.material.Material; +import gregtech.api.util.GTUtility; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.util.ResourceLocation; -import java.util.Objects; - public class CoilStatBuilder { private final CustomCoilStats stats; private ResourceLocation textureLocation; + private final String modid; - CoilStatBuilder() { + CoilStatBuilder(String modid) { + this.modid = modid; this.stats = new CustomCoilStats(); } @@ -38,18 +39,33 @@ public CoilStatBuilder multiSmelter(int level, int energyDiscount) { return this; } - public CoilStatBuilder texture(ResourceLocation location, boolean generic) { - this.textureLocation = Objects.requireNonNull(location); + public CoilStatBuilder texture(String location) { + this.textureLocation = new ResourceLocation(this.modid, location); + return this; + } + + public CoilStatBuilder texture(String location, boolean generic) { + return texture(location).generic(generic); + } + + public CoilStatBuilder generic(boolean generic) { this.stats.isGeneric = generic; return this; } + public CoilStatBuilder generic() { + return generic(true); + } + CustomCoilStats build() { + if (this.textureLocation == null) { + this.textureLocation = GTUtility.gregtechId("wire_coil"); + } String variant; if (this.stats.isGeneric) { variant = "%s"; - this.stats.inactive = new ModelResourceLocation(this.textureLocation, String.format(variant, false)); - this.stats.active = new ModelResourceLocation(this.textureLocation, String.format(variant, true)); + this.stats.inactive = new ModelResourceLocation(this.textureLocation, String.format(variant, "normal")); + this.stats.active = new ModelResourceLocation(this.textureLocation, String.format(variant, "active")); } else { variant = "active=%s,variant=%s"; this.stats.inactive = new ModelResourceLocation(this.textureLocation, diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java index bcad7e7022b..205111fb4cc 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java @@ -1,7 +1,6 @@ package gregtech.api.block.coil; import gregtech.api.GTValues; -import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.block.VariantActiveBlock; import gregtech.api.block.VariantItemBlock; import gregtech.api.items.toolitem.ToolClasses; @@ -87,7 +86,7 @@ public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn // noinspection unchecked var itemBlock = (VariantItemBlock) itemStack.getItem(); IBlockState stackState = itemBlock.getBlockState(itemStack); - IHeatingCoilBlockStats coilType = getState(stackState); + CustomCoilStats coilType = getState(stackState); lines.add(I18n.format("tile.wire_coil.tooltip_heat", coilType.getCoilTemperature())); @@ -106,6 +105,8 @@ public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn } else { lines.add(I18n.format("tile.wire_coil.tooltip_extended_info")); } + + coilType.addInformation(itemStack, worldIn, lines, tooltipFlag); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java index c7685233fcc..5db98ad952c 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java @@ -4,14 +4,21 @@ import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; +import gregtech.api.util.function.QuadConsumer; import gregtech.client.model.ActiveVariantBlockBakedModel; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.function.BooleanSupplier; public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable, @@ -31,7 +38,8 @@ public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable Material material = Materials.Iron; ModelResourceLocation active, inactive; - boolean isGeneric = true; + boolean isGeneric; + QuadConsumer, ITooltipFlag> additionalTooltips; CustomCoilStats() {} @@ -75,4 +83,12 @@ public int compareTo(@NotNull CustomCoilStats o) { // todo add more comparisons? return Integer.compare(o.getTier(), this.getTier()); } + + @SideOnly(Side.CLIENT) + public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn, @NotNull List lines, + @NotNull ITooltipFlag tooltipFlag) { + if (this.additionalTooltips != null) { + this.additionalTooltips.accept(itemStack, worldIn, lines, tooltipFlag); + } + } } diff --git a/src/main/java/gregtech/api/util/function/QuadConsumer.java b/src/main/java/gregtech/api/util/function/QuadConsumer.java new file mode 100644 index 00000000000..cbe51d8c5db --- /dev/null +++ b/src/main/java/gregtech/api/util/function/QuadConsumer.java @@ -0,0 +1,7 @@ +package gregtech.api.util.function; + +@FunctionalInterface +public interface QuadConsumer { + + void accept(P p, S s, T t, Q q); +} diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 1d824dddc5c..b57e9cc4eff 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -237,11 +237,13 @@ public static void registerCoils(CoilManager.CoilRegistryEvent event) { registry.makeBuilder(0, "coil_block") .addCoilType(b -> b .coilTemp(42069) + .generic() .tier(GTValues.UHV) .multiSmelter(69, 98) .material(Materials.Chlorine)) .addCoilType(b -> b .coilTemp(696969) + .generic() .tier(GTValues.UHV) .multiSmelter(69, 99) .material(Materials.Neutronium)) diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 0d5784c06bf..8c3b9f9dc52 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -22,6 +22,7 @@ import net.minecraft.entity.EntityLiving.SpawnPlacementType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.IStringSerializable; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -98,6 +99,11 @@ public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAcces return false; } + @Override + public @NotNull BlockRenderLayer getRenderLayer(CoilType value) { + return BlockRenderLayer.SOLID; + } + @SideOnly(Side.CLIENT) public void onModelRegister() { Item item = Item.getItemFromBlock(this); From 46955297b63cf121fef24a44e78abdd528efe579 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 1 Oct 2025 19:14:18 -0700 Subject: [PATCH 20/23] more work on custom tooltips use boolean instead of client only class --- .../java/gregtech/api/block/coil/CoilStatBuilder.java | 10 ++++++++++ .../java/gregtech/api/block/coil/CustomCoilStats.java | 4 ++-- src/main/java/gregtech/common/CommonProxy.java | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java index fd514191c82..6a6f2f64340 100644 --- a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java +++ b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java @@ -2,9 +2,14 @@ import gregtech.api.unification.material.Material; import gregtech.api.util.GTUtility; +import gregtech.api.util.function.QuadConsumer; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +import java.util.List; public class CoilStatBuilder { @@ -57,6 +62,11 @@ public CoilStatBuilder generic() { return generic(true); } + public CoilStatBuilder tooltip(QuadConsumer, Boolean> additionalTooltips) { + this.stats.additionalTooltips = additionalTooltips; + return this; + } + CustomCoilStats build() { if (this.textureLocation == null) { this.textureLocation = GTUtility.gregtechId("wire_coil"); diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java index 5db98ad952c..66ab2798884 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java @@ -39,7 +39,7 @@ public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable Material material = Materials.Iron; ModelResourceLocation active, inactive; boolean isGeneric; - QuadConsumer, ITooltipFlag> additionalTooltips; + QuadConsumer, Boolean> additionalTooltips; CustomCoilStats() {} @@ -88,7 +88,7 @@ public int compareTo(@NotNull CustomCoilStats o) { public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn, @NotNull List lines, @NotNull ITooltipFlag tooltipFlag) { if (this.additionalTooltips != null) { - this.additionalTooltips.accept(itemStack, worldIn, lines, tooltipFlag); + this.additionalTooltips.accept(itemStack, worldIn, lines, tooltipFlag.isAdvanced()); } } } diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index b57e9cc4eff..34aec68971e 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -238,6 +238,9 @@ public static void registerCoils(CoilManager.CoilRegistryEvent event) { .addCoilType(b -> b .coilTemp(42069) .generic() + .tooltip((stack, world, strings, advanced) -> { + strings.add("this is a custom coil!"); + }) .tier(GTValues.UHV) .multiSmelter(69, 98) .material(Materials.Chlorine)) From 23dc7f96a78da33ae3352fb175e14bdc86b43666 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 1 Oct 2025 19:26:53 -0700 Subject: [PATCH 21/23] most static block + methods above constructor --- .../gregtech/common/blocks/BlockWireCoil.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/common/blocks/BlockWireCoil.java b/src/main/java/gregtech/common/blocks/BlockWireCoil.java index 8c3b9f9dc52..6f5851e6894 100644 --- a/src/main/java/gregtech/common/blocks/BlockWireCoil.java +++ b/src/main/java/gregtech/common/blocks/BlockWireCoil.java @@ -161,20 +161,6 @@ public abstract static class CoilType implements IStringSerializable, IHeatingCo public static CoilType TRINIUM; public static CoilType TRITANIUM; - private CoilType() { - COIL_TYPES.add(this); - } - - @Override - public int compareTo(@NotNull BlockWireCoil.CoilType o) { - return Integer.compare(o.getTier(), getTier()); - } - - @Override - public String toString() { - return getName(); - } - static { CUPRONICKEL = coilType(Materials.Cupronickel) .tier(GTValues.LV) @@ -226,6 +212,20 @@ private static Builder coilType(Material material) { private static Builder coilType(String name, Material material) { return new Builder(name, material); } + + private CoilType() { + COIL_TYPES.add(this); + } + + @Override + public int compareTo(@NotNull BlockWireCoil.CoilType o) { + return Integer.compare(o.getTier(), getTier()); + } + + @Override + public String toString() { + return getName(); + } } private static class Builder { From 320e60a54f0f20affc5ea32537c23a908f616ef2 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:41:57 -0700 Subject: [PATCH 22/23] address some reviews create BuilderFactory so only `makeBuilder()` is visible remove event testing code --- .../api/block/coil/BuilderFactory.java | 6 +++++ .../api/block/coil/CoilBlockBuilder.java | 10 ++----- .../gregtech/api/block/coil/CoilManager.java | 8 +++--- .../gregtech/api/block/coil/CoilRegistry.java | 5 ++-- .../api/block/coil/CustomCoilBlock.java | 14 ++++++---- .../java/gregtech/common/CommonProxy.java | 27 ------------------- src/main/java/gregtech/core/CoreModule.java | 7 ----- 7 files changed, 24 insertions(+), 53 deletions(-) create mode 100644 src/main/java/gregtech/api/block/coil/BuilderFactory.java diff --git a/src/main/java/gregtech/api/block/coil/BuilderFactory.java b/src/main/java/gregtech/api/block/coil/BuilderFactory.java new file mode 100644 index 00000000000..e697382375d --- /dev/null +++ b/src/main/java/gregtech/api/block/coil/BuilderFactory.java @@ -0,0 +1,6 @@ +package gregtech.api.block.coil; + +public interface BuilderFactory { + + CoilBlockBuilder makeBuilder(int id, String name); +} diff --git a/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java b/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java index da6dfc9df81..6fb787db6df 100644 --- a/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java +++ b/src/main/java/gregtech/api/block/coil/CoilBlockBuilder.java @@ -15,15 +15,11 @@ public class CoilBlockBuilder { private final String modid; private final Consumer onBuild; - private CoilBlockBuilder(String modid, Consumer onBuild) { + CoilBlockBuilder(String modid, Consumer onBuild) { this.modid = modid; this.onBuild = onBuild; } - static CoilBlockBuilder builder(String modid, Consumer onBuild) { - return new CoilBlockBuilder(modid, onBuild); - } - public CoilBlockBuilder addCoilType(UnaryOperator builder) { if (stats.size() >= ACTIVE_META_LIMIT) { throw new IllegalStateException("Cannot exceed active meta limit!"); @@ -35,9 +31,7 @@ public CoilBlockBuilder addCoilType(UnaryOperator builder) { public CustomCoilBlock build() { if (this.stats.isEmpty()) throw new IllegalArgumentException("Variants is empty!"); - CustomCoilBlock.setActiveList(this.stats); - var block = new CustomCoilBlock(); - CustomCoilBlock.clearActiveList(); + var block = new CustomCoilBlock(this.stats); for (var stat : this.stats) { GregTechAPI.HEATING_COILS.put(block.getState(stat), stat); } diff --git a/src/main/java/gregtech/api/block/coil/CoilManager.java b/src/main/java/gregtech/api/block/coil/CoilManager.java index 3a0750dfaff..a770a8b81ad 100644 --- a/src/main/java/gregtech/api/block/coil/CoilManager.java +++ b/src/main/java/gregtech/api/block/coil/CoilManager.java @@ -15,7 +15,7 @@ public class CoilManager { private static CoilManager instance; private static int networkId; - private static CoilRegistry internal; + private static BuilderFactory internal; private final Object2ObjectMap registryMap = new Object2ObjectOpenHashMap<>(); private final Int2ObjectMap networkMap = new Int2ObjectOpenHashMap<>(); @@ -30,7 +30,7 @@ public static CoilManager getInstance() { private CoilManager() {} - public CoilRegistry getRegistry(String modid) { + public BuilderFactory getRegistry(String modid) { CoilRegistry coilRegistry = registryMap.get(modid); if (coilRegistry == null) { throw new IllegalArgumentException("No MTE registry exists for modid \"" + modid + "\""); @@ -38,7 +38,7 @@ public CoilRegistry getRegistry(String modid) { return coilRegistry; } - public CoilRegistry createRegistry(String modid) { + public BuilderFactory createRegistry(String modid) { if (registryMap.containsKey(modid)) { throw new IllegalArgumentException("MTE Registry for modid \"" + modid + "\" is already registered"); } @@ -48,7 +48,7 @@ public CoilRegistry createRegistry(String modid) { return registry; } - public CoilRegistry getRegistry(int networkId) { + public BuilderFactory getRegistry(int networkId) { CoilRegistry coilRegistry = networkMap.get(networkId); return coilRegistry == null ? internal : coilRegistry; } diff --git a/src/main/java/gregtech/api/block/coil/CoilRegistry.java b/src/main/java/gregtech/api/block/coil/CoilRegistry.java index 4244c58d597..30ff7efcf30 100644 --- a/src/main/java/gregtech/api/block/coil/CoilRegistry.java +++ b/src/main/java/gregtech/api/block/coil/CoilRegistry.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; -public class CoilRegistry extends GTControlledRegistry { +public class CoilRegistry extends GTControlledRegistry implements BuilderFactory { private final String modid; private final int networkId; @@ -17,9 +17,10 @@ public CoilRegistry(String modId, int networkId) { this.networkId = networkId; } + @Override public CoilBlockBuilder makeBuilder(int id, String name) { ResourceLocation loc = new ResourceLocation(this.modid, name); - return CoilBlockBuilder.builder(this.modid, b -> register(id, loc, b)); + return new CoilBlockBuilder(this.modid, b -> register(id, loc, b)); } @Override diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java index 205111fb4cc..d960c3aa736 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java @@ -42,16 +42,18 @@ public final class CustomCoilBlock extends VariantActiveBlock { private static final AtomicReference> activeSublist = new AtomicReference<>(); - static void setActiveList(List sublist) { + // called in constructor to handle super constructor nonsense + private static net.minecraft.block.material.Material setActiveList(List sublist) { activeSublist.set(sublist); + return net.minecraft.block.material.Material.IRON; } - static void clearActiveList() { + private static void clearActiveList() { activeSublist.set(null); } - public CustomCoilBlock() { - super(net.minecraft.block.material.Material.IRON); + public CustomCoilBlock(List stats) { + super(setActiveList(stats)); setTranslationKey("wire_coil"); setHardness(5.0f); setResistance(10.0f); @@ -68,7 +70,9 @@ public BlockRenderLayer getRenderLayer(CustomCoilStats value) { @Override protected @NotNull Collection computeVariants() { - return activeSublist.get(); // stupid super constructor nonsense + List stats = activeSublist.get(); + clearActiveList(); + return stats; } @Override diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 34aec68971e..1bc41e8f630 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -3,7 +3,6 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.VariantItemBlock; -import gregtech.api.block.coil.CoilManager; import gregtech.api.block.coil.CoilRegistry; import gregtech.api.block.coil.CustomCoilBlock; import gregtech.api.block.machines.MachineItemBlock; @@ -15,7 +14,6 @@ import gregtech.api.recipes.ingredients.GTRecipeOreInput; import gregtech.api.recipes.properties.impl.FusionEUToStartProperty; 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.DustProperty; import gregtech.api.unification.material.properties.PropertyKey; @@ -228,31 +226,6 @@ public static void registerBlocksLast(RegistryEvent.Register event) { FLUID_BLOCKS.forEach(event.getRegistry()::register); } - // todo REMOVE, THIS IS FOR TESTING - @SubscribeEvent - public static void registerCoils(CoilManager.CoilRegistryEvent event) { - final String modid = "test"; - CoilRegistry registry = CoilManager.getInstance().createRegistry(modid); - - registry.makeBuilder(0, "coil_block") - .addCoilType(b -> b - .coilTemp(42069) - .generic() - .tooltip((stack, world, strings, advanced) -> { - strings.add("this is a custom coil!"); - }) - .tier(GTValues.UHV) - .multiSmelter(69, 98) - .material(Materials.Chlorine)) - .addCoilType(b -> b - .coilTemp(696969) - .generic() - .tier(GTValues.UHV) - .multiSmelter(69, 99) - .material(Materials.Neutronium)) - .build(); - } - @SubscribeEvent public static void registerItems(RegistryEvent.Register event) { GTLog.logger.info("Registering Items..."); diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index 7891295b25a..7c6272c9a94 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -201,10 +201,6 @@ public void preInit(FMLPreInitializationEvent event) { OreDictUnifier.init(); MetaBlocks.init(); - - // for (CoilRegistry registry : coilManager.getRegistries()) { - // registry.unfreeze(); - // } logger.info("Registering Coils"); MinecraftForge.EVENT_BUS.post(new CoilManager.CoilRegistryEvent()); @@ -263,9 +259,6 @@ public void init(FMLInitializationEvent event) { for (MTERegistry registry : mteManager.getRegistries()) { registry.freeze(); } - // for (CoilRegistry r : coilManager.getRegistries()) { - // r.freeze(); - // } proxy.onLoad(); if (RecipeMap.isFoundInvalidRecipe()) { logger.fatal("Seems like invalid recipe was found."); From 11e1d40b72efffbaddcaf4ba3f329c10c0d8ec8d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:39:30 -0700 Subject: [PATCH 23/23] make custom coil stats private final and initialize in constructor add javadoc to explain some methods --- .../api/block/coil/CoilStatBuilder.java | 117 +++++++++++++++--- .../api/block/coil/CustomCoilBlock.java | 2 +- .../api/block/coil/CustomCoilStats.java | 51 +++++--- 3 files changed, 136 insertions(+), 34 deletions(-) diff --git a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java index 6a6f2f64340..fcd69c1fba3 100644 --- a/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java +++ b/src/main/java/gregtech/api/block/coil/CoilStatBuilder.java @@ -1,6 +1,9 @@ package gregtech.api.block.coil; +import gregtech.api.GTValues; +import gregtech.api.recipes.properties.impl.TemperatureProperty; import gregtech.api.unification.material.Material; +import gregtech.api.unification.material.Materials; import gregtech.api.util.GTUtility; import gregtech.api.util.function.QuadConsumer; @@ -13,57 +16,120 @@ public class CoilStatBuilder { - private final CustomCoilStats stats; - private ResourceLocation textureLocation; private final String modid; + private String name; + + // electric blast furnace properties + private int coilTemperature = -1; + + // multi smelter properties + private int level = -1; + private int energyDiscount = 0; + + // voltage tier + private int tier = GTValues.ULV; + + private Material material = Materials.Iron; + private ResourceLocation textureLocation; + private boolean isGeneric; + private QuadConsumer, Boolean> additionalTooltips; + CoilStatBuilder(String modid) { this.modid = modid; - this.stats = new CustomCoilStats(); } + /** + * @param material Material that this coil should be based off of. Used for + * {@link TemperatureProperty#registerCoilType(int, Material, String)}. + * @return this + */ public CoilStatBuilder material(Material material) { - stats.material = material; - stats.name = material.getResourceLocation().getPath(); + return material(material, material.getName()); + } + + /** + * @param material Material that this coil should be based off of. Used for + * {@link TemperatureProperty#registerCoilType(int, Material, String)}. + * @param name Name of the variant to look for in the model json (typically the name of the material). + * @return this + */ + public CoilStatBuilder material(Material material, String name) { + this.material = material; + this.name = name; return this; } public CoilStatBuilder coilTemp(int coilTemperature) { - stats.coilTemperature = coilTemperature; + this.coilTemperature = coilTemperature; return this; } + /** + * @param tier The voltage tier of this coil variant, used for the energy discount in the cracking unit and pyrolyse + * oven + * @return this + */ public CoilStatBuilder tier(int tier) { - stats.tier = Math.max(0, tier); + this.tier = Math.max(0, tier); return this; } + /** + * @param level This is used for the amount of parallel recipes in the multi smelter. Multiplied by 32. + * @param energyDiscount This is used for the energy discount in the multi smelter + * @return this + */ public CoilStatBuilder multiSmelter(int level, int energyDiscount) { - stats.level = level; - stats.energyDiscount = energyDiscount; + this.level = level; + this.energyDiscount = energyDiscount; return this; } + /** + * @param location Location of the block model json + * @return this + */ public CoilStatBuilder texture(String location) { this.textureLocation = new ResourceLocation(this.modid, location); return this; } + /** + * @param location Location of the block model json + * @param generic If true, the coil will use a grayscale texture to tint based off of the materials color. + * Otherwise, it will look for a texture specifically for this variant. + * @return this + */ public CoilStatBuilder texture(String location, boolean generic) { return texture(location).generic(generic); } + /** + * @param generic If true, the coil will use a grayscale texture to tint based off of the materials color. + * Otherwise, it will look for a texture specifically for this variant. + * @return this + */ public CoilStatBuilder generic(boolean generic) { - this.stats.isGeneric = generic; + this.isGeneric = generic; return this; } + /** + * Marks this variant as generic, it will look for a grayscale texture and tint based on material color. + * + * @return this + */ public CoilStatBuilder generic() { return generic(true); } + /** + * @param additionalTooltips Used for adding additional tooltips for this variant + * @return this + */ public CoilStatBuilder tooltip(QuadConsumer, Boolean> additionalTooltips) { - this.stats.additionalTooltips = additionalTooltips; + this.additionalTooltips = additionalTooltips; return this; } @@ -71,18 +137,31 @@ CustomCoilStats build() { if (this.textureLocation == null) { this.textureLocation = GTUtility.gregtechId("wire_coil"); } + String variant; - if (this.stats.isGeneric) { + ModelResourceLocation inactive; + ModelResourceLocation active; + if (this.isGeneric) { variant = "%s"; - this.stats.inactive = new ModelResourceLocation(this.textureLocation, String.format(variant, "normal")); - this.stats.active = new ModelResourceLocation(this.textureLocation, String.format(variant, "active")); + inactive = new ModelResourceLocation(this.textureLocation, String.format(variant, "normal")); + active = new ModelResourceLocation(this.textureLocation, String.format(variant, "active")); } else { variant = "active=%s,variant=%s"; - this.stats.inactive = new ModelResourceLocation(this.textureLocation, - String.format(variant, false, stats.name)); - this.stats.active = new ModelResourceLocation(this.textureLocation, - String.format(variant, true, stats.name)); + inactive = new ModelResourceLocation(this.textureLocation, + String.format(variant, false, this.name)); + active = new ModelResourceLocation(this.textureLocation, + String.format(variant, true, this.name)); } - return this.stats; + return new CustomCoilStats( + this.name, + this.coilTemperature, + this.level, + this.energyDiscount, + this.tier, + this.material, + active, + inactive, + this.isGeneric, + this.additionalTooltips); } } diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java index d960c3aa736..02f5f8296f5 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilBlock.java @@ -65,7 +65,7 @@ public CustomCoilBlock(List stats) { @NotNull @Override public BlockRenderLayer getRenderLayer(CustomCoilStats value) { - return value.isGeneric ? BlockRenderLayer.CUTOUT : BlockRenderLayer.SOLID; + return value.isGeneric() ? BlockRenderLayer.CUTOUT : BlockRenderLayer.SOLID; } @Override diff --git a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java index 66ab2798884..9634dac83f0 100644 --- a/src/main/java/gregtech/api/block/coil/CustomCoilStats.java +++ b/src/main/java/gregtech/api/block/coil/CustomCoilStats.java @@ -1,9 +1,7 @@ package gregtech.api.block.coil; -import gregtech.api.GTValues; import gregtech.api.block.IHeatingCoilBlockStats; import gregtech.api.unification.material.Material; -import gregtech.api.unification.material.Materials; import gregtech.api.util.function.QuadConsumer; import gregtech.client.model.ActiveVariantBlockBakedModel; @@ -24,24 +22,45 @@ public final class CustomCoilStats implements IHeatingCoilBlockStats, Comparable, IStringSerializable { - String name; + private final String name; // electric blast furnace properties - int coilTemperature = -1; + private final int coilTemperature; // multi smelter properties - int level = -1; - int energyDiscount = 0; + private final int level; + private final int energyDiscount; // voltage tier - int tier = GTValues.ULV; - - Material material = Materials.Iron; - ModelResourceLocation active, inactive; - boolean isGeneric; - QuadConsumer, Boolean> additionalTooltips; - - CustomCoilStats() {} + private final int tier; + + private final Material material; + private final ModelResourceLocation active; + private final ModelResourceLocation inactive; + private final boolean isGeneric; + private final QuadConsumer, Boolean> additionalTooltips; + + CustomCoilStats(String name, + int coilTemperature, + int level, + int energyDiscount, + int tier, + Material material, + ModelResourceLocation active, + ModelResourceLocation inactive, + boolean isGeneric, + QuadConsumer, Boolean> additionalTooltips) { + this.name = name; + this.coilTemperature = coilTemperature; + this.level = level; + this.energyDiscount = energyDiscount; + this.tier = tier; + this.material = material; + this.active = active; + this.inactive = inactive; + this.isGeneric = isGeneric; + this.additionalTooltips = additionalTooltips; + } @Override public @NotNull String getName() { @@ -91,4 +110,8 @@ public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn this.additionalTooltips.accept(itemStack, worldIn, lines, tooltipFlag.isAdvanced()); } } + + public boolean isGeneric() { + return isGeneric; + } }