From 6f34a44e296b3d4f7d6a1e3892e1681639e16f15 Mon Sep 17 00:00:00 2001 From: PouffyDev <99536749+pouffy@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:49:39 +0100 Subject: [PATCH] Registries n stuff. - Added registries for Electrodes and Cable Types. - Winding Machines now tint the main spool instead of requiring partial models for each spool. - Electrode Holders now render the item model of the electrode instead of requiring partial models for each electrode. - Added Resistivity config for Cable Types. - Updated classes to handle the new registries instead of enums. - Moved the ChemicalVatCategory's recipe sprite to a separate method so mixins can target the sprites specifically. --- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43705 bytes gradle/wrapper/gradle-wrapper.properties | 7 ++ gradlew | 5 +- src/main/java/com/drmangotea/tfmg/TFMG.java | 21 +++- .../drmangotea/tfmg/base/TFMGRegistrate.java | 37 ++++++- .../drmangotea/tfmg/base/TFMGRegistries.java | 23 ++++ .../com/drmangotea/tfmg/base/TFMGUtils.java | 9 ++ .../drmangotea/tfmg/config/TFMGConfigs.java | 4 +- .../tfmg/config/TFMGResistivity.java | 63 +++++++++++ .../tfmg/config/TFMGServerConfig.java | 3 +- .../connection/cable_type/CableType.java | 69 ++++++++++++ .../cable_type/CableTypeBuilder.java | 66 +++++++++++ .../connection/cable_type/CableTypeEntry.java | 15 +++ .../connection/cable_type/CableTypeStats.java | 94 ++++++++++++++++ .../cable_type/ResistivityValues.java | 14 +++ .../connection/cables/CableConnection.java | 43 ++++---- .../cables/CableConnectorBlockEntity.java | 2 +- .../cables/CableConnectorRenderer.java | 2 +- .../misc/winding_machine/SpoolItem.java | 30 +++-- .../WindingMachineBlockEntity.java | 8 +- .../WindingMachineRenderer.java | 34 +++--- .../ElectrodeHolderBlock.java | 15 ++- .../ElectrodeHolderBlockEntity.java | 104 +++++++++--------- .../ElectrodeHolderRenderer.java | 27 +++-- .../electrode_holder/electrode/Electrode.java | 85 ++++++++++++++ .../electrode/ElectrodeBuilder.java | 66 +++++++++++ .../electrode/ElectrodeEntry.java | 17 +++ .../tfmg/recipes/jei/ChemicalVatCategory.java | 63 +++++++---- .../tfmg/recipes/jei/WindingCategory.java | 16 +-- .../recipes/jei/machines/WindingMachine.java | 15 +-- .../tfmg/registry/TFMGCableTypes.java | 59 ++++++++++ .../tfmg/registry/TFMGElectrodes.java | 58 ++++++++++ .../tfmg/registry/TFMGGuiTextures.java | 1 + .../drmangotea/tfmg/registry/TFMGItems.java | 18 +-- .../tfmg/registry/TFMGPartialModels.java | 1 + .../drmangotea/tfmg/registry/TFMGTags.java | 6 +- .../block/winding_machine/spool_wire.json | 20 ++++ .../assets/tfmg/textures/block/spool_wire.png | Bin 0 -> 110 bytes .../textures/block/winding_machine_wire.png | Bin 193 -> 146 bytes .../block/winding_machine_wire_animated.png | Bin 243 -> 225 bytes .../assets/tfmg/textures/gui/chemical_vat.png | Bin 4258 -> 4729 bytes src/main/resources/tfmg.mixins.json | 3 +- 42 files changed, 928 insertions(+), 195 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 src/main/java/com/drmangotea/tfmg/base/TFMGRegistries.java create mode 100644 src/main/java/com/drmangotea/tfmg/config/TFMGResistivity.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableType.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeBuilder.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeEntry.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeStats.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/ResistivityValues.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/Electrode.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeBuilder.java create mode 100644 src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeEntry.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGCableTypes.java create mode 100644 src/main/java/com/drmangotea/tfmg/registry/TFMGElectrodes.java create mode 100644 src/main/resources/assets/tfmg/models/block/winding_machine/spool_wire.json create mode 100644 src/main/resources/assets/tfmg/textures/block/spool_wire.png diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9bbc975c742b298b441bfb90dbc124400a3751b9 GIT binary patch literal 43705 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 DHx0+F literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..37f853b1 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index f5feea6d..faf93008 100644 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/src/main/java/com/drmangotea/tfmg/TFMG.java b/src/main/java/com/drmangotea/tfmg/TFMG.java index 9a5aa3c6..cd1eae20 100644 --- a/src/main/java/com/drmangotea/tfmg/TFMG.java +++ b/src/main/java/com/drmangotea/tfmg/TFMG.java @@ -1,9 +1,6 @@ package com.drmangotea.tfmg; -import com.drmangotea.tfmg.base.TFMGBoilerHeaters; -import com.drmangotea.tfmg.base.TFMGContraptions; -import com.drmangotea.tfmg.base.TFMGCreativeTabs; -import com.drmangotea.tfmg.base.TFMGRegistrate; +import com.drmangotea.tfmg.base.*; import com.drmangotea.tfmg.content.electricity.base.ElectricNetworkManager; import com.drmangotea.tfmg.content.engines.fuels.BaseFuelTypes; import com.drmangotea.tfmg.content.items.weapons.explosives.thermite_grenades.fire.TFMGColoredFires; @@ -15,7 +12,10 @@ import com.drmangotea.tfmg.content.decoration.pipes.TFMGPipes; import com.drmangotea.tfmg.registry.*; import com.drmangotea.tfmg.worldgen.TFMGFeatures; import com.mojang.logging.LogUtils; -import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.foundation.item.ItemDescription; +import com.simibubi.create.foundation.item.KineticStats; +import com.simibubi.create.foundation.item.TooltipModifier; +import net.createmod.catnip.lang.FontHelper; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; @@ -32,6 +32,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegisterEvent; import org.slf4j.Logger; +import static net.createmod.catnip.lang.FontHelper.styleFromColor; @SuppressWarnings("removal") @@ -48,17 +49,27 @@ public class TFMG { public static final TFMGRegistrate REGISTRATE = TFMGRegistrate.create(); + public static final FontHelper.Palette TFMG_PALETTE = new FontHelper.Palette(styleFromColor(0x4c5155), styleFromColor(0x838c8a)); + + static { + REGISTRATE.setTooltipModifierFactory((item) -> (new ItemDescription.Modifier(item, TFMG_PALETTE)).andThen(TooltipModifier.mapNull(KineticStats.create(item)))); + //.andThen(TooltipModifier.mapNull(CableTypeStats.create(item))) (save this for whenever the fuck I figure out what resistivity is meant to do) + } + public TFMG() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); REGISTRATE.registerEventListeners(modEventBus); + TFMGRegistries.register(); TFMGSoundEvents.prepare(); TFMGPipes.init(); TFMGBlocks.init(); TFMGBlockEntities.init(); TFMGItems.init(); + TFMGElectrodes.register(); + TFMGCableTypes.register(); TFMGEntityTypes.init(); TFMGPartialModels.init(); diff --git a/src/main/java/com/drmangotea/tfmg/base/TFMGRegistrate.java b/src/main/java/com/drmangotea/tfmg/base/TFMGRegistrate.java index c5bef84a..2b21c497 100644 --- a/src/main/java/com/drmangotea/tfmg/base/TFMGRegistrate.java +++ b/src/main/java/com/drmangotea/tfmg/base/TFMGRegistrate.java @@ -2,6 +2,10 @@ package com.drmangotea.tfmg.base; import com.drmangotea.tfmg.TFMG; import com.drmangotea.tfmg.base.fluid.GasFluidType; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableType; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableTypeBuilder; +import com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode.Electrode; +import com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode.ElectrodeBuilder; import com.simibubi.create.content.fluids.VirtualFluid; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.VirtualFluidBuilder; @@ -9,8 +13,8 @@ import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.KineticStats; import com.simibubi.create.foundation.item.TooltipModifier; import com.tterrag.registrate.builders.FluidBuilder; +import com.tterrag.registrate.util.nullness.NonNullFunction; import net.createmod.catnip.lang.FontHelper; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.*; import net.minecraftforge.registries.ForgeRegistries; @@ -60,4 +64,35 @@ public class TFMGRegistrate extends CreateRegistrate { return TFMG.REGISTRATE.get(name+"_bucket", ForgeRegistries.ITEMS.getRegistryKey()).get(); } + public CableTypeBuilder cableType(NonNullFunction factory) { + return cableType((TFMGRegistrate) self(), factory); + } + + public CableTypeBuilder cableType(String name, NonNullFunction factory) { + return cableType((TFMGRegistrate) self(), name, factory); + } + + public CableTypeBuilder cableType(P parent, NonNullFunction factory) { + return cableType(parent, currentName(), factory); + } + + public CableTypeBuilder cableType(P parent, String name, NonNullFunction factory) { + return entry(name, callback -> CableTypeBuilder.create(this, parent, name, callback, factory)); + } + + public ElectrodeBuilder electrode(NonNullFunction factory) { + return electrode((TFMGRegistrate) self(), factory); + } + + public ElectrodeBuilder electrode(String name, NonNullFunction factory) { + return electrode((TFMGRegistrate) self(), name, factory); + } + + public ElectrodeBuilder electrode(P parent, NonNullFunction factory) { + return electrode(parent, currentName(), factory); + } + + public ElectrodeBuilder electrode(P parent, String name, NonNullFunction factory) { + return entry(name, callback -> ElectrodeBuilder.create(this, parent, name, callback, factory)); + } } diff --git a/src/main/java/com/drmangotea/tfmg/base/TFMGRegistries.java b/src/main/java/com/drmangotea/tfmg/base/TFMGRegistries.java new file mode 100644 index 00000000..48978b95 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/base/TFMGRegistries.java @@ -0,0 +1,23 @@ +package com.drmangotea.tfmg.base; + +import com.drmangotea.tfmg.TFMG; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableType; +import com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode.Electrode; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.RegistryBuilder; + +import java.util.HashMap; +import java.util.Map; + +public class TFMGRegistries { + public static final Map registeredCableTypes = new HashMap<>(); + public static final Map registeredElectrodes = new HashMap<>(); + + public static final ResourceKey> CABLE_TYPE = TFMG.REGISTRATE.makeRegistry("cable_type", () -> new RegistryBuilder().hasTags().allowModification().setDefaultKey(TFMG.asResource("empty"))); + public static final ResourceKey> ELECTRODE = TFMG.REGISTRATE.makeRegistry("electrode", () -> new RegistryBuilder().hasTags().allowModification().setDefaultKey(TFMG.asResource("none"))); + + public static void register() { + } +} diff --git a/src/main/java/com/drmangotea/tfmg/base/TFMGUtils.java b/src/main/java/com/drmangotea/tfmg/base/TFMGUtils.java index ee1fef6d..1875d823 100644 --- a/src/main/java/com/drmangotea/tfmg/base/TFMGUtils.java +++ b/src/main/java/com/drmangotea/tfmg/base/TFMGUtils.java @@ -4,7 +4,9 @@ package com.drmangotea.tfmg.base; import com.drmangotea.tfmg.TFMG; import com.drmangotea.tfmg.base.spark.ElectricSparkParticle; import com.drmangotea.tfmg.base.spark.Spark; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableType; import com.drmangotea.tfmg.content.electricity.connection.cables.CablePos; +import com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode.Electrode; import com.drmangotea.tfmg.registry.TFMGEntityTypes; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -22,6 +24,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; @@ -381,5 +384,11 @@ public class TFMGUtils { vertexConsumer.vertex(matrix4f, x + p_174319_, y + thickness - p_174318_ + pain, z - p_174320_).color(red, green, blue, 1.0F).uv2(k).endVertex(); } + public static Electrode getElectrode(ResourceLocation name) { + return TFMGRegistries.registeredElectrodes.get(name); + } + public static CableType getCableType(ResourceLocation name) { + return TFMGRegistries.registeredCableTypes.get(name); + } } diff --git a/src/main/java/com/drmangotea/tfmg/config/TFMGConfigs.java b/src/main/java/com/drmangotea/tfmg/config/TFMGConfigs.java index ed8ab701..b2e4fb3a 100644 --- a/src/main/java/com/drmangotea/tfmg/config/TFMGConfigs.java +++ b/src/main/java/com/drmangotea/tfmg/config/TFMGConfigs.java @@ -1,7 +1,7 @@ package com.drmangotea.tfmg.config; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.ResistivityValues; import com.simibubi.create.api.stress.BlockStressValues; -import com.simibubi.create.infrastructure.config.CCommon; import net.createmod.catnip.config.ConfigBase; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -58,6 +58,8 @@ public class TFMGConfigs { TFMGStress stress = TFMGConfigs.server().stressValues; BlockStressValues.IMPACTS.registerProvider(stress::getImpact); BlockStressValues.CAPACITIES.registerProvider(stress::getCapacity); + TFMGResistivity resistivity = server().resistivityValues; + ResistivityValues.RESISTIVITIES.registerProvider(resistivity::getResistivity); } @SubscribeEvent diff --git a/src/main/java/com/drmangotea/tfmg/config/TFMGResistivity.java b/src/main/java/com/drmangotea/tfmg/config/TFMGResistivity.java new file mode 100644 index 00000000..5540b9b6 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/config/TFMGResistivity.java @@ -0,0 +1,63 @@ +package com.drmangotea.tfmg.config; + +import com.drmangotea.tfmg.TFMG; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableType; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableTypeBuilder; +import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +import it.unimi.dsi.fastutil.objects.Object2DoubleMap; +import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap; +import net.createmod.catnip.config.ConfigBase; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.ForgeConfigSpec; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.DoubleSupplier; + +public class TFMGResistivity extends ConfigBase { + // bump this version to reset configured values. + private static final int VERSION = 2; + + // IDs need to be used since configs load before registration + + private static final Object2DoubleMap DEFAULT_RESISTIVITIES = new Object2DoubleOpenHashMap<>(); + + protected final Map> resistivities = new HashMap<>(); + + @Override + public void registerAll(ForgeConfigSpec.Builder builder) { + builder.comment(".", Comments.resistivity).push("resistivity"); + DEFAULT_RESISTIVITIES.forEach((id, value) -> this.resistivities.put(id, builder.define(id.getPath(), value))); + builder.pop(); + } + + @Override + public String getName() { + return "resistivityValues.v" + VERSION; + } + + @Nullable + public DoubleSupplier getResistivity(CableType cableType) { + ResourceLocation id = cableType.getKey(); + ForgeConfigSpec.ConfigValue value = this.resistivities.get(id); + return value == null ? null : value::get; + } + + public static NonNullUnaryOperator> setNoResistivity() { + return setResistivity(0); + } + + public static NonNullUnaryOperator> setResistivity(double value) { + return builder -> { + //assertFromCreate(builder); + ResourceLocation id = TFMG.asResource(builder.getName()); + DEFAULT_RESISTIVITIES.put(id, value); + return builder; + }; + } + + private static class Comments { + static String resistivity = "Configure the individual resistivity of cable types."; + } +} diff --git a/src/main/java/com/drmangotea/tfmg/config/TFMGServerConfig.java b/src/main/java/com/drmangotea/tfmg/config/TFMGServerConfig.java index 99a3ee77..b4bd7a09 100644 --- a/src/main/java/com/drmangotea/tfmg/config/TFMGServerConfig.java +++ b/src/main/java/com/drmangotea/tfmg/config/TFMGServerConfig.java @@ -7,7 +7,8 @@ public class TFMGServerConfig extends ConfigBase { - public final TFMGStress stressValues = nested(0, TFMGStress::new, "Fine tune the kinetic stats of individual components"); + public final TFMGStress stressValues = nested(1, TFMGStress::new, "Fine tune the kinetic stats of individual components"); + public final TFMGResistivity resistivityValues = nested(0, TFMGResistivity::new, "Fine tune the resistivity stats of individual cable types"); @Override public String getName() { diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableType.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableType.java new file mode 100644 index 00000000..7050cb9c --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableType.java @@ -0,0 +1,69 @@ +package com.drmangotea.tfmg.content.electricity.connection.cable_type; + +import com.drmangotea.tfmg.registry.TFMGItems; +import com.tterrag.registrate.util.entry.ItemEntry; +import net.minecraft.Util; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +public class CableType { + private String descriptionId; + private final ResourceLocation id; + private final int color; + private final ItemEntry spool; + + public CableType(Properties properties) { + this.id = properties.id; + this.color = properties.color; + this.spool = properties.spool; + } + + public int getColor() { + return this.color; + } + + public ItemEntry getSpool() { + return this.spool; + } + + public String getOrCreateDescriptionId() { + if (this.descriptionId == null) { + this.descriptionId = Util.makeDescriptionId("cable_type", getKey()); + } + + return this.descriptionId; + } + + public String getDescriptionId() { + return this.getOrCreateDescriptionId(); + } + + public Component getDisplayName() { + return Component.translatable(this.getOrCreateDescriptionId()); + } + + public ResourceLocation getKey() { + return this.id; + } + + public static class Properties { + private ResourceLocation id; + + int color = 0xffffff; + ItemEntry spool = TFMGItems.COPPER_SPOOL; + + public Properties color(int color) { + this.color = color; + return this; + } + + public Properties spool(ItemEntry spool) { + this.spool = spool; + return this; + } + + public Properties(ResourceLocation id) { + this.id = id; + } + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeBuilder.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeBuilder.java new file mode 100644 index 00000000..8253de23 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeBuilder.java @@ -0,0 +1,66 @@ +package com.drmangotea.tfmg.content.electricity.connection.cable_type; + +import com.drmangotea.tfmg.base.TFMGRegistries; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.builders.AbstractBuilder; +import com.tterrag.registrate.builders.BuilderCallback; +import com.tterrag.registrate.util.entry.RegistryEntry; +import com.tterrag.registrate.util.nullness.NonNullFunction; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +import com.tterrag.registrate.util.nullness.NonnullType; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.RegistryObject; + +public class CableTypeBuilder extends AbstractBuilder> { + + public static CableTypeBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { + return new CableTypeBuilder<>(owner, parent, name, callback, factory); + } + + private final NonNullFunction factory; + + private NonNullSupplier initialProperties = () -> new CableType.Properties(new ResourceLocation(getOwner().getModid(), getName())); + private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); + + public CableTypeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { + super(owner, parent, name, callback, TFMGRegistries.CABLE_TYPE); + this.factory = factory; + } + + public CableTypeBuilder properties(NonNullUnaryOperator func) { + propertiesCallback = propertiesCallback.andThen(func); + return this; + } + + public CableTypeBuilder initialProperties(NonNullSupplier properties) { + initialProperties = properties; + return this; + } + + public CableTypeBuilder defaultLang() { + return lang(CableType::getDescriptionId); + } + + public CableTypeBuilder lang(String name) { + return lang(CableType::getDescriptionId, name); + } + + @Override + protected @NonnullType T createEntry() { + CableType.Properties properties = this.initialProperties.get(); + properties = propertiesCallback.apply(properties); + return factory.apply(properties); + } + + @Override + protected RegistryEntry createEntryWrapper(RegistryObject delegate) { + return new CableTypeEntry<>(getOwner(), delegate); + } + + @Override + public CableTypeEntry register() { + TFMGRegistries.registeredCableTypes.put(new ResourceLocation(getOwner().getModid(), getName()), createEntry()); + return (CableTypeEntry) super.register(); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeEntry.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeEntry.java new file mode 100644 index 00000000..04c0c688 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeEntry.java @@ -0,0 +1,15 @@ +package com.drmangotea.tfmg.content.electricity.connection.cable_type; + +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraftforge.registries.RegistryObject; + +public class CableTypeEntry extends RegistryEntry { + public CableTypeEntry(AbstractRegistrate owner, RegistryObject delegate) { + super(owner, delegate); + } + + public static CableTypeEntry cast(RegistryEntry entry) { + return RegistryEntry.cast(CableTypeEntry.class, entry); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeStats.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeStats.java new file mode 100644 index 00000000..b5f5a571 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/CableTypeStats.java @@ -0,0 +1,94 @@ +package com.drmangotea.tfmg.content.electricity.connection.cable_type; + +import com.drmangotea.tfmg.TFMG; +import com.drmangotea.tfmg.base.TFMGUtils; +import com.drmangotea.tfmg.config.TFMGConfigs; +import com.drmangotea.tfmg.config.TFMGServerConfig; +import com.drmangotea.tfmg.content.machinery.misc.winding_machine.SpoolItem; +import com.simibubi.create.content.equipment.goggles.GogglesItem; +import com.simibubi.create.foundation.item.TooltipModifier; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.lang.LangBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import static net.minecraft.ChatFormatting.GRAY; + +public class CableTypeStats implements TooltipModifier { + protected final SpoolItem cableItem; + + public CableTypeStats(SpoolItem cableItem) { + this.cableItem = cableItem; + } + + @Nullable + public static CableTypeStats create(Item item) { + if (item instanceof SpoolItem cableItem) { + if (Objects.equals(cableItem.cableTypeKey, TFMG.asResource("empty"))) return null; + return new CableTypeStats(cableItem); + } + return null; + } + + @Override + public void modify(ItemTooltipEvent context) { + List conductorStats = getCableTypeStats(cableItem, context.getEntity()); + if (!conductorStats.isEmpty()) { + List tooltip = context.getToolTip(); + tooltip.add(CommonComponents.EMPTY); + tooltip.addAll(conductorStats); + } + } + + public static List getCableTypeStats(SpoolItem spoolItem, Player player) { + List list = new ArrayList<>(); + + TFMGServerConfig config = TFMGConfigs.server(); + + boolean hasGoggles = GogglesItem.isWearingGoggles(player); + + CreateLang.translate("tooltip.resistivity") + .style(GRAY) + .addTo(list); + double resistivity = ResistivityValues.getResistivity(TFMGUtils.getCableType(spoolItem.cableTypeKey)); + + LangBuilder builder = CreateLang.builder(); + + builder.space().add(CreateLang.text(resistivity + "Ω")).style(ChatFormatting.GOLD).addTo(list); + + return list; + } + + enum Resistivity { + VERY_LOW(ChatFormatting.RED, ChatFormatting.GOLD), + LOW(ChatFormatting.GOLD, ChatFormatting.YELLOW), + MEDIUM(ChatFormatting.YELLOW, ChatFormatting.GREEN), + HIGH(ChatFormatting.GREEN, ChatFormatting.DARK_GREEN) + ; + + private final ChatFormatting absoluteColor; + private final ChatFormatting relativeColor; + + Resistivity(ChatFormatting absoluteColor, ChatFormatting relativeColor) { + this.absoluteColor = absoluteColor; + this.relativeColor = relativeColor; + } + + public ChatFormatting getAbsoluteColor() { + return absoluteColor; + } + + public ChatFormatting getRelativeColor() { + return relativeColor; + } + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/ResistivityValues.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/ResistivityValues.java new file mode 100644 index 00000000..053c1ace --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cable_type/ResistivityValues.java @@ -0,0 +1,14 @@ +package com.drmangotea.tfmg.content.electricity.connection.cable_type; + +import com.simibubi.create.api.registry.SimpleRegistry; + +import java.util.function.DoubleSupplier; + +public class ResistivityValues { + public static final SimpleRegistry RESISTIVITIES = SimpleRegistry.create(); + + public static double getResistivity(CableType conductor) { + DoubleSupplier supplier = RESISTIVITIES.get(conductor); + return supplier == null ? 0 : supplier.getAsDouble(); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnection.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnection.java index 931b2854..73b111d1 100644 --- a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnection.java +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnection.java @@ -1,13 +1,10 @@ package com.drmangotea.tfmg.content.electricity.connection.cables; import com.drmangotea.tfmg.base.TFMGUtils; -import com.drmangotea.tfmg.registry.TFMGItems; -import com.tterrag.registrate.util.entry.ItemEntry; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableType; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; -import org.checkerframework.checker.units.qual.C; +import net.minecraft.resources.ResourceLocation; public class CableConnection { @@ -46,7 +43,7 @@ public class CableConnection { compoundTag.putBoolean("Visible", visible); - compoundTag.putString("CableType", type.toString()); + compoundTag.putString("CableType", type.getKey().toString()); return compoundTag; } @@ -63,7 +60,7 @@ public class CableConnection { BlockPos blockPos1 = BlockPos.of(compoundTag.getLong("Pos")); boolean visible = compoundTag.getBoolean("Visible"); - CableType type = CableType.valueOf(compoundTag.getString("CableType")); + CableType type = TFMGUtils.getCableType(new ResourceLocation(compoundTag.getString("CableType"))); return new CableConnection(pos1,pos2,blockPos1,type,visible); } public float getLength(){ @@ -72,20 +69,20 @@ public class CableConnection { - public enum CableType{ - NONE(TFMGItems.COPPER_WIRE, 0,0xffffff), - COPPER(TFMGItems.COPPER_WIRE, 0.00188f,0xD8735A), - ALUMINUM(TFMGItems.ALUMINUM_WIRE, 0.0027f,0xEDEFEF), - CONSTANTAN(TFMGItems.CONSTANTAN_WIRE, 1f,0xEDEFEF), - STEEL_REINFORCED_ALUMINUM(TFMGItems.COPPER_WIRE, 0.0027f,0xB8A08D) - ; - public final ItemEntry wire; - public final float resistivity; - public final int color; - CableType(ItemEntry wire, float resistivity, int color){ - this.wire = wire; - this.resistivity = resistivity; - this.color = color; - } - } + //public enum CableType{ + // NONE(TFMGItems.COPPER_WIRE, 0,0xffffff), + // COPPER(TFMGItems.COPPER_WIRE, 0.00188f,0xD8735A), + // ALUMINUM(TFMGItems.ALUMINUM_WIRE, 0.0027f,0xEDEFEF), + // CONSTANTAN(TFMGItems.CONSTANTAN_WIRE, 1f,0xEDEFEF), + // STEEL_REINFORCED_ALUMINUM(TFMGItems.COPPER_WIRE, 0.0027f,0xB8A08D) + // ; + // public final ItemEntry wire; + // public final float resistivity; + // public final int color; + // CableType(ItemEntry wire, float resistivity, int color){ + // this.wire = wire; + // this.resistivity = resistivity; + // this.color = color; + // } + //} } diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorBlockEntity.java index fd4b6043..2359cd6a 100644 --- a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorBlockEntity.java @@ -71,7 +71,7 @@ public class CableConnectorBlockEntity extends ElectricBlockEntity implements IH return; for (CableConnection connection : connections) { - ItemEntity itemToDrop = new ItemEntity(level, getBlockPos().getX() + 0.5f, getBlockPos().getY() + 0.5f, getBlockPos().getZ() + 0.5f, new ItemStack(connection.type.wire.get(), (int) (connection.getLength()/8))); + ItemEntity itemToDrop = new ItemEntity(level, getBlockPos().getX() + 0.5f, getBlockPos().getY() + 0.5f, getBlockPos().getZ() + 0.5f, new ItemStack(connection.type.getSpool().get(), (int) (connection.getLength()/8))); if (itemToDrop.getItem().getCount() > 0) { level.addFreshEntity(itemToDrop); } diff --git a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorRenderer.java b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorRenderer.java index e1c640c1..2f90eddd 100644 --- a/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorRenderer.java +++ b/src/main/java/com/drmangotea/tfmg/content/electricity/connection/cables/CableConnectorRenderer.java @@ -35,7 +35,7 @@ public class CableConnectorRenderer extends SafeBlockEntityRendererposToConnect.asLong() ? otherBE : be; //CableConnectorBlockEntity connectedBe2= pos.asLong()>posToConnect.asLong() ? be : otherBE; + CableType cableType = TFMGUtils.getCableType(cableTypeKey); // - CableConnection connection1 = new CableConnection(be.getCablePosition(), otherBE.getCablePosition(), otherBE.getBlockPos(),type,true); - CableConnection connection2 = new CableConnection(otherBE.getCablePosition(), be.getCablePosition(), be.getBlockPos(),type,false); + CableConnection connection1 = new CableConnection(be.getCablePosition(), otherBE.getCablePosition(), otherBE.getBlockPos(),cableType,true); + CableConnection connection2 = new CableConnection(otherBE.getCablePosition(), be.getCablePosition(), be.getBlockPos(),cableType,false); float wireCost = (connection1.getLength()/8); @@ -211,7 +207,7 @@ public class SpoolItem extends Item { @Override public boolean isBarVisible(ItemStack stack) { - return model != null; + return !Objects.equals(cableTypeKey, TFMG.asResource("empty")) && TFMGRegistries.registeredCableTypes.containsKey(cableTypeKey); } @Override diff --git a/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineBlockEntity.java index 78cae645..8d1e7160 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineBlockEntity.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; @@ -23,6 +24,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.world.Containers; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -264,5 +266,9 @@ public class WindingMachineBlockEntity extends KineticBlockEntity implements IHa } } - + public void destroy() { + super.destroy(); + ItemHelper.dropContents(level, worldPosition, inventory); + Containers.dropItemStack(getLevel(), getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), spool); + } } diff --git a/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineRenderer.java b/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineRenderer.java index 6c94c1f2..ad8987c9 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineRenderer.java +++ b/src/main/java/com/drmangotea/tfmg/content/machinery/misc/winding_machine/WindingMachineRenderer.java @@ -51,30 +51,30 @@ public class WindingMachineRenderer extends KineticBlockEntityRenderer type, BlockPos pos, BlockState state) { @@ -39,10 +41,12 @@ public class ElectrodeHolderBlockEntity extends ElectricBlockEntity implements I public boolean setElectrode(ItemStack modeItem, boolean simulate) { - for (ElectrodeType type : ElectrodeType.values()) { - if (type.item.is(modeItem.getItem())) { + if (level == null) return false; + for (Electrode electrode : level.registryAccess().registryOrThrow(TFMGRegistries.ELECTRODE)) { + if (electrode.getStack().isEmpty()) continue; + if (modeItem.is(electrode.getStack().getItem())) { if (!simulate) { - electrodeType = type; + this.electrode = electrode; } else return true; } } @@ -67,14 +71,7 @@ public class ElectrodeHolderBlockEntity extends ElectricBlockEntity implements I @Override public float resistance() { - - if (electrodeType != ElectrodeType.NONE) { - if (electrodeType == ElectrodeType.GRAPHITE) { - return 300; - } else return 100; - } - - return 0; + return this.electrode.getResistance(); } @Override @@ -82,13 +79,11 @@ public class ElectrodeHolderBlockEntity extends ElectricBlockEntity implements I return true; } - public boolean setElectrode(String name, boolean simulate) { - for (ElectrodeType type : ElectrodeType.values()) { - if (Objects.equals(type.name, name)) { - if (!simulate) { - electrodeType = type; - } else return true; - } + public boolean setElectrode(Electrode electrode, boolean simulate) { + if (electrode != null) { + if (!simulate) { + this.electrode = electrode; + } else return true; } if (!simulate && hasLevel()) VatBlock.updateVatState(getBlockState(), getLevel(), getBlockPos().relative(Direction.DOWN)); @@ -114,32 +109,31 @@ public class ElectrodeHolderBlockEntity extends ElectricBlockEntity implements I @Override public void write(CompoundTag compound, boolean clientPacket) { - for (ElectrodeType electrode : ElectrodeType.values()) { - if (electrode == electrodeType) { - compound.putString("Electrode", electrode.name); - } - } + compound.putString("Electrode", electrode.getKey().toString()); super.write(compound, clientPacket); } @Override protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); + setElectrode(TFMGUtils.getElectrode(new ResourceLocation(compound.getString("Electrode"))), false); + } - setElectrode(compound.getString("Electrode"), false); - + public void destroy() { + ItemStack electrodeItem = electrode.getStack(); + Containers.dropItemStack(getLevel(), getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), electrodeItem); } @Override public String getOperationId() { + return isOperational() ? electrode.getOperationId() : ""; - - return switch (electrodeType) { - - case NONE -> ""; - case COPPER, ZINC -> isOperational() ? "tfmg:electrode" : ""; - case GRAPHITE -> isOperational() ? "tfmg:graphite_electrode" : ""; - }; + //return switch (electrodeType) { +// + // case NONE -> ""; + // case COPPER, ZINC -> isOperational() ? "tfmg:electrode" : ""; + // case GRAPHITE -> isOperational() ? "tfmg:graphite_electrode" : ""; + //}; } @Override @@ -153,22 +147,22 @@ public class ElectrodeHolderBlockEntity extends ElectricBlockEntity implements I } - enum ElectrodeType { - - NONE("none", ItemStack.EMPTY, null), - COPPER("copper", TFMGItems.COPPER_ELECTRODE.asStack(), TFMGPartialModels.COPPER_ELECTRODE), - ZINC("zinc", TFMGItems.ZINC_ELECTRODE.asStack(), TFMGPartialModels.ZINC_ELECTRODE), - GRAPHITE("graphite", TFMGItems.GRAPHITE_ELECTRODE.asStack(), TFMGPartialModels.GRAPHITE_ELECTRODE); - - public final String name; - public final ItemStack item; - public final PartialModel model; - - ElectrodeType(String name, ItemStack stack, PartialModel model) { - this.name = name; - this.item = stack; - this.model = model; - } - - } + //enum ElectrodeType { +// + // NONE("none", ItemStack.EMPTY, null), + // COPPER("copper", TFMGItems.COPPER_ELECTRODE.asStack(), TFMGPartialModels.COPPER_ELECTRODE), + // ZINC("zinc", TFMGItems.ZINC_ELECTRODE.asStack(), TFMGPartialModels.ZINC_ELECTRODE), + // GRAPHITE("graphite", TFMGItems.GRAPHITE_ELECTRODE.asStack(), TFMGPartialModels.GRAPHITE_ELECTRODE); +// + // public final String name; + // public final ItemStack item; + // public final PartialModel model; +// + // ElectrodeType(String name, ItemStack stack, PartialModel model) { + // this.name = name; + // this.item = stack; + // this.model = model; + // } +// + //} } diff --git a/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/ElectrodeHolderRenderer.java b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/ElectrodeHolderRenderer.java index d4da65ba..9b5dad3d 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/ElectrodeHolderRenderer.java +++ b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/ElectrodeHolderRenderer.java @@ -1,19 +1,23 @@ package com.drmangotea.tfmg.content.machinery.vat.electrode_holder; -import com.drmangotea.tfmg.registry.TFMGPartialModels; +import com.drmangotea.tfmg.TFMG; +import com.drmangotea.tfmg.base.TFMGUtils; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; -import net.createmod.catnip.render.CachedBuffers; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.level.block.state.BlockState; public class ElectrodeHolderRenderer extends SafeBlockEntityRenderer { - + private final ItemRenderer itemRenderer; public ElectrodeHolderRenderer(BlockEntityRendererProvider.Context context) { + itemRenderer = context.getItemRenderer(); } @Override @@ -24,16 +28,17 @@ public class ElectrodeHolderRenderer extends SafeBlockEntityRenderer item; + private final int resistance; + private final String operationId; + + public Electrode(Properties properties) { + this.id = properties.id; + this.item = properties.item; + this.resistance = properties.resistance; + this.operationId = properties.operationId; + } + + public ItemEntry getItem() { + return this.item; + } + + public ItemStack getStack() { + return getItem() != null ? getItem().asStack() : ItemStack.EMPTY; + } + + public int getResistance() { + return this.resistance; + } + + public String getOperationId() { + return this.operationId; + } + + public String getOrCreateDescriptionId() { + if (this.descriptionId == null) { + this.descriptionId = Util.makeDescriptionId("electrode", getKey()); + } + + return this.descriptionId; + } + + public String getDescriptionId() { + return this.getOrCreateDescriptionId(); + } + + public Component getDisplayName() { + return Component.translatable(this.getOrCreateDescriptionId()); + } + + public ResourceLocation getKey() { + return this.id; + } + + public static class Properties { + private ResourceLocation id; + + ItemEntry item; + int resistance = 0; + String operationId = ""; + + public Properties item(ItemEntry item) { + this.item = item; + return this; + } + + public Properties resistance(int resistance) { + this.resistance = resistance; + return this; + } + + public Properties operationId(String operationId) { + this.operationId = operationId; + return this; + } + + public Properties(ResourceLocation id) { + this.id = id; + } + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeBuilder.java b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeBuilder.java new file mode 100644 index 00000000..27be45b5 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeBuilder.java @@ -0,0 +1,66 @@ +package com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode; + +import com.drmangotea.tfmg.base.TFMGRegistries; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.builders.AbstractBuilder; +import com.tterrag.registrate.builders.BuilderCallback; +import com.tterrag.registrate.util.entry.RegistryEntry; +import com.tterrag.registrate.util.nullness.NonNullFunction; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +import com.tterrag.registrate.util.nullness.NonnullType; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.RegistryObject; + +public class ElectrodeBuilder extends AbstractBuilder> { + + public static ElectrodeBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { + return new ElectrodeBuilder<>(owner, parent, name, callback, factory); + } + + private final NonNullFunction factory; + + private NonNullSupplier initialProperties = () -> new Electrode.Properties(new ResourceLocation(getOwner().getModid(), getName())); + private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); + + public ElectrodeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { + super(owner, parent, name, callback, TFMGRegistries.ELECTRODE); + this.factory = factory; + } + + public ElectrodeBuilder properties(NonNullUnaryOperator func) { + propertiesCallback = propertiesCallback.andThen(func); + return this; + } + + public ElectrodeBuilder initialProperties(NonNullSupplier properties) { + initialProperties = properties; + return this; + } + + public ElectrodeBuilder defaultLang() { + return lang(Electrode::getDescriptionId); + } + + public ElectrodeBuilder lang(String name) { + return lang(Electrode::getDescriptionId, name); + } + + @Override + protected @NonnullType T createEntry() { + Electrode.Properties properties = this.initialProperties.get(); + properties = propertiesCallback.apply(properties); + return factory.apply(properties); + } + + @Override + protected RegistryEntry createEntryWrapper(RegistryObject delegate) { + return new ElectrodeEntry<>(getOwner(), delegate); + } + + @Override + public ElectrodeEntry register() { + TFMGRegistries.registeredElectrodes.put(new ResourceLocation(getOwner().getModid(), getName()), createEntry()); + return (ElectrodeEntry) super.register(); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeEntry.java b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeEntry.java new file mode 100644 index 00000000..ec35a876 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/electrode_holder/electrode/ElectrodeEntry.java @@ -0,0 +1,17 @@ +package com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode; + +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableType; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableTypeEntry; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraftforge.registries.RegistryObject; + +public class ElectrodeEntry extends RegistryEntry { + public ElectrodeEntry(AbstractRegistrate owner, RegistryObject delegate) { + super(owner, delegate); + } + + public static ElectrodeEntry cast(RegistryEntry entry) { + return RegistryEntry.cast(ElectrodeEntry.class, entry); + } +} diff --git a/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java b/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java index f71eedbd..e8bd0ef7 100644 --- a/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java +++ b/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java @@ -88,31 +88,10 @@ public class ChemicalVatCategory extends CreateRecipeCategory TFMGGuiTextures.VAT.render(graphics, 0, 24); - if (allowedVatTypes.contains("firebrick_lined_vat") && allowedVatTypes.size() == 1) { - TFMGGuiTextures.FIREPROOF_BRICK_OVERLAY.render(graphics, 55 - 48, 32); - } + drawVatTypes(allowedVatTypes, graphics); - if (machines.contains("tfmg:mixing")) { - TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12, 0); - TFMGGuiTextures.MIXER.render(graphics, 55 - 19, 32); - } - if (machines.contains("tfmg:electrode")) { - TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 - 32, 0); - TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 + 32, 0); - TFMGGuiTextures.ELECTRODE.render(graphics, 55 - 3 - 32, 32); - TFMGGuiTextures.ELECTRODE.render(graphics, 55 - 3 + 32, 32); - } - if (machines.contains("tfmg:graphite_electrode")) { - TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 - 32, 0); - TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 + 32, 0); - TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12, 0); - TFMGGuiTextures.GRAPHITE_ELECTRODE.render(graphics, 55 - 4 - 32, 32); - TFMGGuiTextures.GRAPHITE_ELECTRODE.render(graphics, 55 - 4 + 32, 32); - TFMGGuiTextures.GRAPHITE_ELECTRODE.render(graphics, 55 - 4, 32); - } - if (recipe.getRequiredHeat() == HeatCondition.HEATED){ - TFMGGuiTextures.VAT_HEATER.render(graphics, 55 - 10, 109); - } + drawSprites(machines, graphics); + renderHeated(recipe.getRequiredHeat(), graphics); int pos = 55; int width = ((recipe.getFluidIngredients().size()) * 21) / 2; for (int i = 0; i < recipe.getFluidIngredients().size(); i++) { @@ -137,5 +116,41 @@ public class ChemicalVatCategory extends CreateRecipeCategory } + private void renderHeated(HeatCondition heatCondition, GuiGraphics graphics) { + if (heatCondition == HeatCondition.HEATED) + TFMGGuiTextures.VAT_HEATER.render(graphics, 55 - 10, 109); + if (heatCondition == HeatCondition.SUPERHEATED) + TFMGGuiTextures.VAT_SUPERHEATER.render(graphics, 55 - 10, 109); + } + //Can be overridden with mixins for easily adding different stuff - Krystal + //Might consider a better way of doing this but idk. + private void drawVatTypes(List allowedVatTypes, GuiGraphics graphics) { + if (allowedVatTypes.contains("firebrick_lined_vat") && allowedVatTypes.size() == 1) { + TFMGGuiTextures.FIREPROOF_BRICK_OVERLAY.render(graphics, 55 - 48, 32); + } + } + + //Can be overridden with mixins for easily adding different stuff - Krystal + //Might consider a better way of doing this but idk. + private void drawSprites(List machines, GuiGraphics graphics) { + if (machines.contains("tfmg:mixing")) { + TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12, 0); + TFMGGuiTextures.MIXER.render(graphics, 55 - 19, 32); + } + if (machines.contains("tfmg:electrode")) { + TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 - 32, 0); + TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 + 32, 0); + TFMGGuiTextures.ELECTRODE.render(graphics, 55 - 3 - 32, 32); + TFMGGuiTextures.ELECTRODE.render(graphics, 55 - 3 + 32, 32); + } + if (machines.contains("tfmg:graphite_electrode")) { + TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 - 32, 0); + TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12 + 32, 0); + TFMGGuiTextures.VAT_MACHINE.render(graphics, 55 - 12, 0); + TFMGGuiTextures.GRAPHITE_ELECTRODE.render(graphics, 55 - 4 - 32, 32); + TFMGGuiTextures.GRAPHITE_ELECTRODE.render(graphics, 55 - 4 + 32, 32); + TFMGGuiTextures.GRAPHITE_ELECTRODE.render(graphics, 55 - 4, 32); + } + } } \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/recipes/jei/WindingCategory.java b/src/main/java/com/drmangotea/tfmg/recipes/jei/WindingCategory.java index 32ae5e74..1b7c3cc0 100644 --- a/src/main/java/com/drmangotea/tfmg/recipes/jei/WindingCategory.java +++ b/src/main/java/com/drmangotea/tfmg/recipes/jei/WindingCategory.java @@ -48,14 +48,12 @@ public class WindingCategory extends CreateRecipeCategory { AllGuiTextures.JEI_ARROW.render(graphics, 85, 32); AllGuiTextures.JEI_DOWN_ARROW.render(graphics, 43, 4); - PartialModel coil = null; + int coilColor = 0; if (recipe.getIngredients().get(1).getItems()[0].getItem() instanceof SpoolItem) { - - coil = ((SpoolItem)recipe.getIngredients().get(1).getItems()[0].getItem()).model; - + coilColor = recipe.getIngredients().get(1).getItems()[0].getBarColor(); } - this.windingMachine.draw(graphics, 48, 27,coil,true); + this.windingMachine.draw(graphics, 48, 27,coilColor,true); graphics.drawString(Minecraft.getInstance().font, recipe.getProcessingDuration() + " Turns", 86.0F, 9.0F, 4210752, false); } @@ -76,18 +74,16 @@ public class WindingCategory extends CreateRecipeCategory { PoseStack ms = graphics.pose(); - PartialModel coil = null; + int coilColor = 0; if (recipe.getRecipe().getIngredients().get(1).getItems()[0].getItem() instanceof SpoolItem) { - - coil = ((SpoolItem)recipe.getRecipe().getIngredients().get(1).getItems()[0].getItem()).model; - + coilColor = recipe.getRecipe().getIngredients().get(1).getItems()[0].getBarColor(); } windingMachine.offset = index; ms.pushPose(); ms.translate(0.0, 67, 0.0); ms.scale(0.7F, 0.7F, 0.7F); - this.windingMachine.draw(graphics, this.getWidth() / 2, 0,coil,false); + this.windingMachine.draw(graphics, this.getWidth() / 2, 0,coilColor,false); ms.popPose(); diff --git a/src/main/java/com/drmangotea/tfmg/recipes/jei/machines/WindingMachine.java b/src/main/java/com/drmangotea/tfmg/recipes/jei/machines/WindingMachine.java index 149a172e..488c0b70 100644 --- a/src/main/java/com/drmangotea/tfmg/recipes/jei/machines/WindingMachine.java +++ b/src/main/java/com/drmangotea/tfmg/recipes/jei/machines/WindingMachine.java @@ -17,7 +17,7 @@ public class WindingMachine extends AnimatedKinetics { public WindingMachine() { } - public void draw(GuiGraphics graphics, int xOffset, int yOffset, PartialModel coil, boolean shadow) { + public void draw(GuiGraphics graphics, int xOffset, int yOffset, int coilColor, boolean shadow) { PoseStack matrixStack = graphics.pose(); @@ -42,12 +42,13 @@ public class WindingMachine extends AnimatedKinetics { .atLocal(-0.15, -0.4, -0.23) .scale(scale) .render(graphics); - if (coil != null) - blockElement(coil) - .rotateBlock(22.5, 22.5, 0) - .atLocal(-0.15, -0.4, -0.23) - .scale(scale) - .render(graphics); + + blockElement(TFMGPartialModels.SPOOL_WIRE) + .rotateBlock(22.5, 22.5, 0) + .atLocal(-0.15, -0.4, -0.23) + .color(coilColor) + .scale(scale) + .render(graphics); matrixStack.popPose(); } diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGCableTypes.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGCableTypes.java new file mode 100644 index 00000000..4e6eeca4 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGCableTypes.java @@ -0,0 +1,59 @@ +package com.drmangotea.tfmg.registry; + +import com.drmangotea.tfmg.config.TFMGResistivity; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableType; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableTypeEntry; + +import static com.drmangotea.tfmg.TFMG.REGISTRATE; + +public class TFMGCableTypes { + + public static final CableTypeEntry empty = REGISTRATE.cableType("empty", CableType::new) + .properties((p) -> p.spool(TFMGItems.COPPER_SPOOL)) + .register(); + + public static final CableTypeEntry copper = REGISTRATE.cableType("copper", CableType::new) + .properties((p) -> p.color(0xD8735A).spool(TFMGItems.COPPER_SPOOL)) + .transform(TFMGResistivity.setResistivity(0.00188f)) + .register(); + + public static final CableTypeEntry aluminum = REGISTRATE.cableType("aluminum", CableType::new) + .properties((p) -> p.color(0xEDEFEF).spool(TFMGItems.ALUMINUM_SPOOL)) + .transform(TFMGResistivity.setResistivity(0.0027f)) + .register(); + + public static final CableTypeEntry constantan = REGISTRATE.cableType("constantan", CableType::new) + .properties((p) -> p.color(0xCFC2A8).spool(TFMGItems.CONSTANTAN_SPOOL)) + .transform(TFMGResistivity.setResistivity(1f)) + .register(); + + // Why is this a thing? I'll leave it her in case you do need it. - Krystal + //public static final CableTypeEntry steelReinforcedAluminum = REGISTRATE.cableType("steel_reinforced_aluminum", CableType::new) + // .properties((p) -> p.color(0xB8A08D).spool(TFMGItems.COPPER_SPOOL)) + // .transform(TFMGResistivity.setResistivity(0.0027f)) + // .register(); + + public static void register() { + + } + + //static { + // register("empty", new CableType(new CableType.Properties(TFMG.asResource("empty")))); + // register("copper", 0.00188f, 0xD8735A, TFMGItems.COPPER_SPOOL); + // register("aluminum", 0.0027f, 0xEDEFEF, TFMGItems.ALUMINUM_SPOOL); + // register("constantan", 1f, 0xCFC2A8, TFMGItems.CONSTANTAN_SPOOL); + //} +// + //private static void register(String name, float resistivity, int color, ItemEntry spool) { + // ResourceLocation key = TFMG.asResource(name); + // CableType cableType = new CableType(new CableType.Properties(key).color(color).spool(spool).resistivity(resistivity)); + // register(name, cableType); + //} +// + //private static void register(String name, T type) { + // Registry.register(TFMGBuiltinRegistries.CABLE_TYPE, TFMG.asResource(name), type); + //} +// + //public static void init() { + //} +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGElectrodes.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGElectrodes.java new file mode 100644 index 00000000..631e9b53 --- /dev/null +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGElectrodes.java @@ -0,0 +1,58 @@ +package com.drmangotea.tfmg.registry; + +import com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode.Electrode; +import com.drmangotea.tfmg.content.machinery.vat.electrode_holder.electrode.ElectrodeEntry; + +import static com.drmangotea.tfmg.TFMG.REGISTRATE; + +public class TFMGElectrodes { + + public static final ElectrodeEntry none = REGISTRATE.electrode("none", Electrode::new) + .properties((p) -> p) + .register(); + + public static final ElectrodeEntry copper = REGISTRATE.electrode("copper", Electrode::new) + .properties((p) -> p + .resistance(100) + .item(TFMGItems.COPPER_ELECTRODE) + .operationId("tfmg:electrode") + ) + .register(); + + public static final ElectrodeEntry zinc = REGISTRATE.electrode("zinc", Electrode::new) + .properties((p) -> p + .resistance(100) + .item(TFMGItems.ZINC_ELECTRODE) + .operationId("tfmg:electrode") + ) + .register(); + + public static final ElectrodeEntry graphite = REGISTRATE.electrode("graphite", Electrode::new) + .properties((p) -> p + .resistance(300) + .item(TFMGItems.GRAPHITE_ELECTRODE) + .operationId("tfmg:graphite_electrode") + ) + .register(); + + //static { + // register("none", new Electrode(new Electrode.Properties(TFMG.asResource("none")))); + // register("copper", 100, TFMGItems.COPPER_ELECTRODE, "tfmg:electrode"); + // register("zinc", 100, TFMGItems.ZINC_ELECTRODE, "tfmg:electrode"); + // register("graphite", 300, TFMGItems.GRAPHITE_ELECTRODE, "tfmg:graphite_electrode"); + //} +// + //private static void register(String name, int resistance, ItemEntry item, String operationId) { + // ResourceLocation key = TFMG.asResource(name); + // Electrode electrode = new Electrode(new Electrode.Properties(key).resistance(resistance).item(item).operationId(operationId)); + // register(name, electrode); + //} +// + //private static void register(String name, T type) { + // Registry.register(TFMGBuiltinRegistries.ELECTRODE, TFMG.asResource(name), type); + //} + + public static void register() { + + } +} diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java index 52f7d08d..ad1fb4cd 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java @@ -31,6 +31,7 @@ public enum TFMGGuiTextures implements ScreenElement { GRAPHITE_ELECTRODE("chemical_vat", 176, 0, 8, 29), FIREPROOF_BRICK_OVERLAY("chemical_vat", 0, 84, 96, 72), VAT_HEATER("chemical_vat", 112, 44, 20, 14), + VAT_SUPERHEATER("chemical_vat", 112, 58, 20, 14) ; diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java index e7d82a03..bbb1178b 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGItems.java @@ -5,7 +5,7 @@ import com.drmangotea.tfmg.base.TFMGArmorMaterials; import com.drmangotea.tfmg.base.TFMGTiers; import com.drmangotea.tfmg.content.decoration.gearbox.SteelVerticalGearboxItem; import com.drmangotea.tfmg.content.electricity.configuration_wrench.ElectriciansWrenchItem; -import com.drmangotea.tfmg.content.electricity.connection.cables.CableConnection; +import com.drmangotea.tfmg.content.electricity.connection.cable_type.CableTypeEntry; import com.drmangotea.tfmg.content.electricity.debug.DebugCinderBlockItem; import com.drmangotea.tfmg.content.electricity.measurement.MultimeterItem; import com.drmangotea.tfmg.content.electricity.utilities.polarizer.MagnetItem; @@ -37,8 +37,8 @@ import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.entry.ItemEntry; import com.tterrag.registrate.util.entry.RegistryEntry; -import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.*; import net.minecraft.world.level.block.Blocks; @@ -188,14 +188,14 @@ public class TFMGItems { ENGINE_CYLINDER = REGISTRATE.item("engine_cylinder", CylinderItem::new).register(), TURBINE_BLADE = REGISTRATE.item("turbine_blade", CylinderItem::new).register(); public static final ItemEntry - EMPTY_SPOOL = spoolItem("empty", null, 0x000000, CableConnection.CableType.NONE) - .recipe((c, p) -> p.stonecutting(DataIngredient.items(TFMGBlocks.HARDENED_PLANKS.asItem()), RecipeCategory.BUILDING_BLOCKS, c::get, 1)) + EMPTY_SPOOL = spoolItem("empty", 0x000000, TFMG.asResource("empty")) + .recipe((c, p) -> p.stonecutting(DataIngredient.items(TFMGBlocks.HARDENED_PLANKS.asItem()), RecipeCategory.BUILDING_BLOCKS, c, 1)) .register(), - COPPER_SPOOL = spoolItem("copper", TFMGPartialModels.COPPER_SPOOL, 0xD8735A, CableConnection.CableType.COPPER) + COPPER_SPOOL = spoolItem("copper", 0xD8735A, TFMG.asResource("copper")) .register(), - ALUMINUM_SPOOL = spoolItem("aluminum", TFMGPartialModels.ALUMINUM_SPOOL, 0xEDEFEF, CableConnection.CableType.ALUMINUM) + ALUMINUM_SPOOL = spoolItem("aluminum", 0xEDEFEF, TFMG.asResource("aluminum")) .register(), - CONSTANTAN_SPOOL = spoolItem("constantan", TFMGPartialModels.CONSTANTAN_SPOOL, 0xCFC2A8, CableConnection.CableType.CONSTANTAN) + CONSTANTAN_SPOOL = spoolItem("constantan", 0xCFC2A8, TFMG.asResource("constantan")) .register(); public static final ItemEntry ELECTROMAGNETIC_COIL = @@ -432,8 +432,8 @@ public class TFMGItems { return map; } - public static ItemBuilder spoolItem(String name, PartialModel model, int barColor, CableConnection.CableType type) { - return REGISTRATE.item(name + "_spool", p -> new SpoolItem(p, model, barColor, type)) + public static ItemBuilder spoolItem(String name, int barColor, ResourceLocation type) { + return REGISTRATE.item(name + "_spool", p -> new SpoolItem(p, barColor, type)) .tag(TFMGTags.TFMGItemTags.SPOOLS.tag) .properties(p -> p.stacksTo(1)); diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java index 21f50f36..ac9eb3be 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGPartialModels.java @@ -75,6 +75,7 @@ public class TFMGPartialModels { SHAFTLESS_LARGE_ALUMINUM_COGHWEEL = block("large_aluminum_cogwheel_shaftless"), SHAFTLESS_LARGE_STEEL_COGHWEEL = block("large_steel_cogwheel_shaftless"), SPOOL = block("winding_machine/spool"), + SPOOL_WIRE = block("winding_machine/spool_wire"), COPPER_SPOOL = block("winding_machine/copper_spool"), ALUMINUM_SPOOL = block("winding_machine/aluminum_spool"), CONSTANTAN_SPOOL = block("winding_machine/constantan_spool"), diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGTags.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGTags.java index fc75483c..91ed34ba 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGTags.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGTags.java @@ -256,9 +256,9 @@ public class TFMGTags { public static void init() { TFMGBlockTags.init(); - // TFMGItemTags.init(); + // TFMGItemTags.register(); TFMGFluidTags.init(); - //TFMGEntityTags.init(); - //TFMGRecipeSerializerTags.init(); + //TFMGEntityTags.register(); + //TFMGRecipeSerializerTags.register(); } } diff --git a/src/main/resources/assets/tfmg/models/block/winding_machine/spool_wire.json b/src/main/resources/assets/tfmg/models/block/winding_machine/spool_wire.json new file mode 100644 index 00000000..2e1aa062 --- /dev/null +++ b/src/main/resources/assets/tfmg/models/block/winding_machine/spool_wire.json @@ -0,0 +1,20 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "tfmg:block/spool_wire", + "particle": "tfmg:block/spool_wire" + }, + "elements": [ + { + "from": [4, 6, 6], + "to": [11, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 7, 7]}, + "faces": { + "north": {"uv": [0, 0, 4, 7], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 0, 4, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 4, 7], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 4, 7], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/tfmg/textures/block/spool_wire.png b/src/main/resources/assets/tfmg/textures/block/spool_wire.png new file mode 100644 index 0000000000000000000000000000000000000000..922ae8e3274f4fad2a07d8417ae43d2aa482ccd5 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar*1SH@0M6{?9LO_lLdF zd%E7=bOq5TPoMsM|N8ZBej|<}ZqwB{++rPA#e13p9e5cS(t09X`>m`Pfd(*my85}S Ib4q9e0J9w;A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tfmg/textures/block/winding_machine_wire.png b/src/main/resources/assets/tfmg/textures/block/winding_machine_wire.png index 6b689078e3accff281d64ae1787e0680b89a980d..e52e05f391d16237561d10e71822bf5aa92db929 100644 GIT binary patch delta 104 zcmV-u0GI#40g?fbF=0$eL_t(Ijm6TT4FE6*L{ZX75X{SPXar#bHfS|<& ziyJu|3^`Z=PO6CYJ+kr3d8qdD!`@R`N z980d~6_hX8vj5-@E~Ta^-^^EhvoEYUmi2>W5x+6Jh+qao;U18^44$rjF6*2UngDR6 BI)(rM diff --git a/src/main/resources/assets/tfmg/textures/block/winding_machine_wire_animated.png b/src/main/resources/assets/tfmg/textures/block/winding_machine_wire_animated.png index 66c87d4d40998af11ed65652adcc94ceab3331ea..0c5eaad7be7d87fac4bd61c23f8ecc605d13bd15 100644 GIT binary patch delta 184 zcmey&_>ggeVf}1R7srr@*0)nP^0FxMu&iC*(om(@H-jONQTESq8^3QdKbmIFx#)TC z;>^x1*Y>@d-F&awXTx_pmiZIjb|$P96+UB`++^tH^Pyj7#nxjiOGUn(3H{VRPY~SzDW;|*0M&{{%6i+_+fA8~ok8@AnOte>#EK*BXHcSTzPcXKWw%q*$ irc1Tn!{|v({6ltGwF_KPD!cYD0D-5gpUXO@geCx2fmgQx delta 202 zcmV;*05$*N0rLTnF@LQ|L_t(oh3%HH4S+BV1T7{>kx?>FCd?G6Q)Clp;i0jNaE$)C zG%thy0wPLkt^4`BX#+|rm$Nz`rDO|0)B$r&Tfi8@c>?77E##b?CqM%B0QvqAs55mI z>MZgPoz3*#ZT|;Iz%^25>ik5&BKd#b{nzNf1?s#)50HRGqC?IrY=Jtj&;ul3k^FT= z)B&wETY&!-s55nbWr82*Y<`L6`v9TN)Y)eO>U{6P0oizi&u%uxd;kCd07*qoM6N<$ Eg3z;H5C8xG diff --git a/src/main/resources/assets/tfmg/textures/gui/chemical_vat.png b/src/main/resources/assets/tfmg/textures/gui/chemical_vat.png index da5dbffbe2055cd5637f45401933a344455f945d..b54d3747f5e8cf73e8043d34370ae1b8d931aa83 100644 GIT binary patch literal 4729 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 Iv~9xv2OJ^lApigX literal 4258 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